Skip to content
Operate reliablyRate limits

Operate reliably

On this page

Rate Limits

The Free plan costs nothing. Live extraction requires signing in (an OAuth connection, which MCP clients use) or an API key. Each account shares a per-minute limit across its keys and connections (10 on Free, 30 on Builder, 100 on Pro; sliding window) and has a monthly credit allowance (200 on Free), reset on the 1st of the calendar month. Credits are charged only for answers; see pricing. Sample URLs run without a key and don't count against either limit; keyless sample requests have their own limit of 10 a minute per client and 60 a minute across all callers. About 20 failed authentication attempts a minute from one client return 429 (see below).

Access Modes

ModeRateMonthly QuotaNotes
Sample URLs60 req/min shared, 10 per clientDoesn't countRecorded runs, no key needed — see Scrape for the list. This evaluation allowance is shared across callers.
Signed in or API key (live)10 / 30 / 100 req/min200 / 10,000 / 40,000 creditsFree / Builder / Pro. Charged only for answers: 1 credit for a markdown read; an accepted structured result costs 1, 3, 8 or 15; a successful browser render adds 2. Rejected structured results cost 0. Successful markdown is ungraded and costs 1 credit.

Request admission uses a shared store. If it cannot return a verified limit decision, requests return 503 with a short retry hint; they do not receive a new allowance on another instance. Receipt verification has a separate 30 requests/minute limit per platform-observed address, with a shared fallback bucket when that address is unavailable. Offline signature verification needs no hosted request.

When You Hit a Limit

Both limits return HTTP 429 but with different codes:

429 — per-minute limit
{
  "success": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests (10/min on the Free plan). Retry in 42s."
  }
}
429 — credits unavailable
// Your own in-flight requests hold the credits. Carries Retry-After.
{
  "success": false,
  "error": {
    "code": "PAGE_LIMIT_REACHED",
    "message": "Credits for this request are committed to your own requests already in progress. Let them finish, then retry."
  }
}

// The monthly allowance itself is spent. No Retry-After.
{
  "success": false,
  "error": {
    "code": "PAGE_LIMIT_REACHED",
    "message": "The monthly credit allowance and any enabled overage are exhausted. Included credits reset on the 1st (UTC). On a paid plan the monthly overage spending limit shows at https://www.contrie.com/dashboard/billing, and support@contrie.com can raise it."
  }
}

// Free: the credits or the month's Free service capacity ran out. No Retry-After.
{
  "success": false,
  "error": {
    "code": "PAGE_LIMIT_REACHED",
    "message": "This Free account has reached this month's Free limit: its 200 credits, its share of Free service capacity, or the shared monthly Free pool, whichever ran out first (account status shows which). No extraction was started. Builder includes 10,000 credits a month for $19: https://www.contrie.com/dashboard/billing. Free credits and capacity return on the 1st (UTC), while the monthly Free pool lasts."
  }
}

A RATE_LIMITED response carries a Retry-After header (seconds until the window resets). PAGE_LIMIT_REACHED carries one only when the credits are committed to your own requests already in progress, which finish on their own. When the monthly allowance itself is spent it carries none, because that resets on the 1st of the month and not on a short timer. For these two codes, treat the presence of the header as the signal: if it is absent, waiting will not help. A source that rate-limits Contrie is different: see SOURCE_REFUSED on the errors page.

Failed authentication has its own limit. About 20 failed attempts a minute from one client (a missing, invalid, expired or revoked credential where one is required) return RATE_LIMITED with Retry-After: 60 instead of 401, until the minute passes.

Rate Limit Headers

HeaderWhenDescription
X-RateLimit-RemainingSuccessful keyed REST extraction responses, idempotent replays includedRequests left in the current one-minute window. Recorded demos, general errors and MCP tool payloads do not consistently include this header.
Retry-AfterRATE_LIMITED, and refusals that clear on their ownSeconds to wait. For RATE_LIMITED that is until the per-minute window resets; for a refusal that clears on its own it is a minimum before retrying, not a promise