Credits and pricing
One unit, the credit. Every request costs credits, and its receipt says why. You pay for the effort a page needed, never more: a result already in our archive costs half (we keep it fresh), a plain page is the base price, a page that fought back costs more. Money enters through a monthly plan, and extra credits on a plan. The numbers below are read live from GET /v1/prices.
Prices and the free credit can change while we learn; the live table is /v1/prices. What you bought stays yours and never expires.
The table
| what | credits | note |
|---|---|---|
| 1 credit | … | the dollar value of one credit, at list price; a plan includes credits at a lower rate |
| scrape | … | one page at the light level; × the effort multiplier below |
| search | … | one live search; a search already in our archive costs half |
| extract | … | the fetch, plus the tokens |
| serp | … | per Google page fetched live (a page holds up to 10 results, so num=100 is 10 pages); a page from our cache costs half |
| answer | … | the search; plus a flat fee when our model writes the answer; nothing when there is no answer |
| tokens | … | per 5,000 tokens, input and output each have their own price. The response and the receipt show the count |
| jobs | … | per URL, at the light level |
| recipes | … | per unit of a run, at the light level |
| recipe records | … | per record a recipe takes from its second source when the site's page fails: $3 per 1,000 records. Only some recipes do (their cost says "record"); charged only on a successful run |
| watch | 1 · 3 | 1 credit per check, once per interval; 3 per confirmed change that matched |
The effort levels
The effort a page needed sets its price. A /scrape page has a fixed price per level; other services multiply their own price by the level's number. The receipt names the level; the engine that did the work is ours.
| level | a /scrape page | other services | what it means |
|---|
Plans and free credit
| plan | price | credits a month | speed | extra credits |
|---|---|---|---|---|
| Free | $0 | … | … | with a plan |
* Soft launch: prices and the free credit can change while we learn; GET /v1/prices is the live table (plans[]; usd_year is the yearly price, credits still come every month). A plan billed yearly starts with POST /v1/billing/subscribe?plan=<name>&billing=year. Extra credits you buy stay yours and never expire.
| what | credits |
|---|---|
| a 7-day pass | … |
| monthly allowance per plan, calendar month | … |
A plan's credits come every month and are spent first; they do not carry over. On a plan you can buy extra credits, any amount from $10 to $1,000 at the plan's rate; they never expire and are spent after the month's credits. The monthly allowance covers both: past it, a bigger plan lifts it. Auto-recharge buys the amount you choose when the month's credits are used and the extra credits fall under 1,000, up to the monthly maximum you set. You start, change or cancel a plan on the dashboard's Billing tab.
On every response
x-c4-cost: 1.500 # what this call cost, in credits x-c4-balance: 14312.000 # your credit after it x-c4-allowance-left: 1900.000 # credits left under this month's allowance (Free, Starter)
The body's usage.quota.remaining_before carries the same figure as credits_month, next to the rate meters.
Out of credit, the gate answers 402 with the reason, a message you can show as it is, and every way on: {"error":"no_credit","balance":-0.50,"message":"…","actions":{"subscribe":"<the plan's one-click link>","plans":"<the billing page>","mcp":"call the plans tool"}} for an account without a plan; on a plan, actions carries extra_credits and extra_credits_api (POST …/v1/billing/topup?amount=<dollars>). Over your own monthly cap: {"error":"spend_cap","cap_left":…,"actions":{"raise":…,"raise_api":"POST /v1/billing/settings {\"spend_cap_mc\":…}","mcp":"call the spend_cap tool"}}. Over your plan's monthly allowance: {"error":"plan_cap","cap_left":<credits>,"message":"…","actions":{…}}; the allowance resets on the 1st, and a bigger plan lifts it. Your key can call both billing routes, so an agent can act on a 402 by itself. A request the gate refused itself (a bad URL, a rate limit) costs nothing; a 5xx costs nothing. Over a free plan's rate limit, the gate answers 429 with a message you can show as it is: "You reached the free plan's limit: 10 requests a minute. You still have 1,774 credits; the free plan only limits the pace. A monthly plan lifts it: Starter, $10 a month: 10,000 credits a month, 120 requests a minute, 10 at a time." Its actions.subscribe is the one-click link to start that plan.
Estimate before a call POST /v1/estimate
The same body as the call, plus the endpoint. The answer is a range: the fixed part is exact, the level and the tokens are a band from real traffic.
curl -X POST "https://api.crawl4ai.com/v1/estimate" \ -H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \ -d '{"endpoint":"scrape","url":"https://news.ycombinator.com"}' # → {"min":"0.20","max":"2.00","text":"about 0.20 to 2.00 credits","parts":[…]}
Balance, plans and extra credits from a key
The balance call trails the per-call x-c4-balance header by about a minute: receipts reach the ledger in batches. The header is the exact running figure.
curl "https://api.crawl4ai.com/v1/billing/balance" -H "Authorization: Bearer sk_live_..." curl -X POST "https://api.crawl4ai.com/v1/billing/subscribe?plan=starter" -H "Authorization: Bearer sk_live_..." # → {"checkout_url": "https://pay.crawl4ai.com/…", "plan": "starter", "usd": 10} open it, pay, the plan starts in seconds curl -X POST "https://api.crawl4ai.com/v1/billing/topup?amount=25" -H "Authorization: Bearer sk_live_..." # on a plan: → {"paid": true, "usd": 25, "credits": …, "invoice_url": "…", "balance": {…}}
Extra credits need a plan: an account without one gets 402 {"error":"plan_needed"} with the link to start one. On a plan, the card that pays the plan is charged at once; if it does not pay, the answer is 402: send it again with checkout=1 for a Stripe page, or update the card on the dashboard's Billing tab. An account already on a plan changes it on the Billing tab (/v1/billing/subscribe answers 409).
Something unclear or wrong on this page? Tell us.