Skip to main content
Reader is metered in credits. Every successful scrape consumes credits according to the proxy mode that actually ran; failures and cache hits are free.

Cost table

OperationCost
Scrape in standard mode1 credit per page
Scrape in stealth mode3 credits per page
Scrape in auto mode1 credit if resolved to standard, 3 credits if escalated to stealth
Cache hit0 credits (any mode)
Failed scrape (timeout, upstream error, block)0 credits
Crawl1 credit per page discovered and scraped
The resolved mode is reported in every response under metadata.proxyMode. Your usage history also tracks it; see /v1/usage/history.

Tiers

TierMonthly creditsRate limit (req/min)Concurrent jobs
Free1,000102
Pro5,0006010
Business50,00020050
Enterprise500,0001,000200
Credits reset at the start of each billing period. Unused credits do not roll over.

Checking your balance

curl https://api.reader.dev/v1/usage/credits -H "x-api-key: $READER_KEY"
{
  "success": true,
  "data": {
    "balance": 4955,
    "limit": 5000,
    "used": 45,
    "tier": "pro",
    "resetAt": "2026-05-01T00:00:00Z"
  }
}
Check programmatically from the SDK:
const credits = await client.getCredits();
if (credits.balance < 100) {
  console.warn("Low credits, resets at", credits.resetAt);
}

When billing runs

Reader charges credits after a scrape succeeds, not before. The pre-flight check only verifies you have enough to start the request; the actual deduction happens once the content is in your response. For auto mode, the pre-flight check is optimistic: it assumes 1 credit per page (the standard price). If auto escalates and the real cost ends up at 3x, your balance can briefly dip below zero for that request. Your next request gets a 402 insufficient_credits error until you top up or your credits reset. This matches how metered billing works everywhere else: you don’t want a single escalation to fail your batch mid-run, and you don’t want to pre-authorize the maximum cost on every request.

Insufficient credits

{
  "success": false,
  "error": {
    "code": "insufficient_credits",
    "message": "You need 50 credits but only 10 are available.",
    "details": { "required": 50, "available": 10, "resetAt": "2026-05-01T00:00:00Z" },
    "docsUrl": "https://reader.dev/docs/home/concepts/errors#insufficient-credits"
  }
}
See the Credit exhaustion guide for how to handle this gracefully.

Estimating batch costs

Before running a large batch, estimate the bill:
cost = (number of URLs) × (credits per page for the mode you expect)
For auto mode, estimate the mix based on what you know:
  • 90%+ of typical web pages resolve to standard (1 credit)
  • Sites known to bot-wall hard (Amazon, LinkedIn, booking sites) will resolve to stealth (3 credits)
When in doubt, run a pilot of 50 URLs first and check metadata.proxyMode across the results. You’ll have a real escalation rate instead of a guess. See Cost estimation.

Next