Skip to main content
Use Scrape.do through Corsair: one client, typed API calls. Copy your token from https://dashboard.scrape.do. It is generated when you sign up and is the only credential the API needs. Things to know before you scrape:
  • Every scrape spends credits. Only some statuses are charged: 2xx and a target 404, 400 or 410 cost credits, while 429, 401 (no credits or a suspended subscription), a Scrape.do 400, 502 and 510 are free. A plain datacenter request is 1 credit; residential proxies and rendering cost more. account.info and account.asyncInfo are free.
  • A target 404 is a result, not an error. scrape.html reports the target’s status in status_code and still returns the page, because the credit was spent. A target 410 behaves the same way.
  • 400 means two different things. One is Scrape.do refusing the request (a bad parameter, no credit spent); the other is the target site answering with a bad request (a credit spent). A target’s 400 comes back from scrape.* as a result with status_code: 400, like a 404, so check status_code rather than catching. A Scrape.do refusal throws ScrapeDoAPIError with the provider’s message; its isTargetRejection is true only for a 400 that arrived without Scrape.do’s error envelope.
  • A bad token answers HTTP 200 on /info. It returns IsActive: false with zeros rather than an error status, so account.info turns that into an error instead of reporting a dead account as healthy.
  • /info is limited to 10 calls a minute and answers 429 past that. Scrape.do’s own retry mechanism is separate and on by default; disableRetry turns it off.
  • A screenshot needs the browser and the JSON answer. scrape.screenshot requires render: true and always requests returnJSON, because the API refuses a screenshot without it. The images come back as base64 PNGs.
  • Browser-only options are rejected here, not ignored. waitUntil, customWait, waitSelector and blockResources do nothing without render, so sending one with render: false fails before the request.
  • The async API is a second host. jobs.* uses https://q.scrape.do with its own concurrency pool and its own account view in account.asyncInfo. A job takes up to 100 URLs, and its results are held until they expire, so read them with jobs.result before then. jobs.start declares a job, so an agent can read it back with jobs.get instead of polling the scrape.
  • Writes are not retried. A POST through the proxy forwards its body to the target site, so a failure is reported rather than replayed: the write may have landed.
  • No webhooks. Scrape.do does not send them to this plugin; its own async API can POST results to a URL you set with webhookUrl at job creation.
What you get:
  • 11 typed API operations

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

4

Connect a tenant

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.

Example API calls

Fetch a page as Markdown
Start an async job for two URLs
See the full list on the API page.

What’s next

API reference

Every scrapedo.api.* operation with input and output types.

Connect / OAuth

createLink, Hub delivery, and tenant connect flows.

Use with agents

Expose this plugin’s operations as MCP tools.