Introducing web search monitors

How do website crawler APIs manage rate limits and failed pages?

Short answer

A managed crawler API handles rate limits by running your crawl inside a concurrency cap, rotating proxies, and retrying throttled or blocked fetches, so your code never implements backoff. It handles failed pages by reporting each page’s status code and success flag instead of aborting the crawl. On Context.dev, concurrency is capped per plan (Free 2, Developer 10, Pro 100, Growth 250, Scale 500), every crawl returns numSucceeded, numFailed, and numSkipped, failed or blocked pages are not billed, and Batches refunds the credits reserved for pages that fail.

Rate limits show up in two places: the limits the API puts on you, and the limits target sites put on the crawler. The first is a concurrency cap per account. Context.dev allows 2 concurrent requests on the free plan, 10 on Developer, 100 on Pro, 250 on Growth, and 500 on Scale, with no per-minute cap by default, and the dashboard shows your effective limits. The second is handled inside the service: when a target answers 429 or a bot challenge, the crawler rotates proxies, waits, and retries within the same request, which is why rendering and anti-bot handling are part of the base price rather than a flag you set.

Failed pages should be data, not exceptions. A Context.dev crawl returns every page with its statusCode and success flag, plus numSucceeded, numFailed, and numSkipped in the response metadata, so a dead link or a blocked page does not stop the rest of the site from coming back. Single scrapes behave the same way: a 404 returns a normal response whose output has success set to false and an error_code of NOT_FOUND. Your pipeline can log failures, retry them later, or drop them without wrapping every call in error handling.

Billing follows the same rule. Crawl charges 1 credit per successful page and nothing for failed or blocked pages. A single scrape is free when every output fails, except for a missing page (404), which costs the base price because the target was reached and reported missing. Batches reserves credits when you submit, charges only successful URLs, and refunds the rest when the job settles. Monitors apply it over time: failed or skipped runs are free. On a site with many dead or protected links, that rule changes the bill more than the plan price does.

For large jobs, move the retry problem off your servers entirely. Batches runs in the background within your concurrency limit, reports each item’s status, and sends a webhook when the job settles. Whatever endpoint you use, read the statusCode on every page, keep your own list of URLs to retry, and set maxPages or a credit budget so a misbehaving site cannot run up the bill.

How each Context.dev endpoint handles throttling and failures
EndpointThrottled or blocked fetchesHow failures are reportedBilling for failed pages
ScrapeProxy rotation and anti-bot handling inside the requestsuccess flag and error_code on every outputFree when every output fails; a missing 404 page costs the base price
CrawlSame path as Scrape for every pagestatusCode and success per page; numFailed and numSkipped totalsNot billed
BatchesRuns in the background within your concurrency limitStatus per item, plus a completion webhookNot billed; reserved credits refunded when the batch settles
MonitorsScheduled runs retry on the next intervalRun history and delivery attempts in the APIFailed and skipped runs are free
Concurrent requests by plan
PlanConcurrent requestsPer-minute cap
Free2None by default
Developer10None by default
Pro100None by default
Growth250None by default
Scale500None by default
EnterpriseCustomCustom
Which one to pick
If this is your situationUse
Crawling sites with many dead or protected linksCrawl, which bills only successful pages
Thousands of URLs where you do not want to manage retriesBatches
You need more parallelism than your plan allowsA higher plan, or Enterprise custom limits
You want to know when a page comes back or changesA page Monitor

Last reviewed

All web scraping API questions

Try it on Context.dev

The endpoints that cover this workload directly.

FAQ

What happens when my own concurrency limit is reached?

Requests above the limit receive a 429 response. The Context.dev SDKs retry 408, 409, 429, and 5xx responses automatically, and Batches queues work within the limit for you. Upgrade the plan or ask for a custom override when you need more parallelism.

How do I keep a crawl from running up the bill on a broken site?

Set maxPages and maxDepth on the crawl, scope it with urlRegex, and read numFailed in the response. Because failed pages are not charged, a site full of dead links costs only its successful pages.

Are 404 pages billed?

In a crawl, failed pages including 404s are not charged. For a single scrape, most failures are free, but a missing page (404) is billed at the base price because the target was reached and reported missing. Check key_metadata.credits_consumed on every response.

Go deeper

Start building with live web context.

Scrape, search, and research the web with one API. Bring the results straight into your product.

1,000free credits

Every month. No credit card required.

Start for freeRead the docs