# 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`.


> **Note: Soft launch**
>
> Prices and the free credit can change while we learn; the live table is [/v1/prices](https://api.crawl4ai.com/v1/prices). What you bought stays yours and never expires.

## The table

<div class="dk-tbl"><table data-price-table>
    <tr><th>what</th><th>credits</th><th>note</th></tr>
    <tr><td class="f">1 credit</td><td class="t" data-p="usd">…</td><td>the dollar value of one credit, at list price; a plan includes credits at a lower rate</td></tr>
    <tr><td class="f">scrape</td><td class="t" data-p="base.scrape">…</td><td>one page at the light level; × the effort multiplier below</td></tr>
    <tr><td class="f">search</td><td class="t" data-p="base.search">…</td><td>one live search; a search already in our archive costs half</td></tr>
    <tr><td class="f">extract</td><td class="t" data-p="base.extract">…</td><td>the fetch, plus the tokens</td></tr>
    <tr><td class="f">serp</td><td class="t" data-p="base.serp">…</td><td>per Google page fetched live (a page holds up to 10 results, so <code>num=100</code> is 10 pages); a page from our cache costs half</td></tr>
    <tr><td class="f">answer</td><td class="t" data-p="base.answer">…</td><td>the search; plus a flat fee when our model writes the answer; nothing when there is no answer</td></tr>
    <tr><td class="f">tokens</td><td class="t" data-p="llm">…</td><td>per 5,000 tokens, input and output each have their own price. The response and the receipt show the count</td></tr>
    <tr><td class="f">jobs</td><td class="t" data-p="base.jobs">…</td><td>per URL, at the light level</td></tr>
    <tr data-service="recipes"><td class="f">recipes</td><td class="t" data-p="base.recipes">…</td><td>per unit of a run, at the light level</td></tr>
    <tr data-service="recipes"><td class="f">recipe records</td><td class="t" data-p="base.vendor_record">…</td><td>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 <code>cost</code> says "record"); charged only on a successful run</td></tr>
    <tr data-service="watch"><td class="f">watch</td><td class="t">1 · 3</td><td>1 credit per check, once per interval; 3 per confirmed change that matched</td></tr>
  </table></div>

## 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.

<div class="dk-tbl"><table data-level-table>
    <tr><th>level</th><th>a /scrape page</th><th>other services</th><th>what it means</th></tr>
  </table></div>

## Plans and free credit

<div class="dk-tbl"><table data-plan-table>
    <tr><th>plan</th><th>price</th><th>credits a month</th><th>speed</th><th>extra credits</th></tr>
    <tr><td class="f">Free</td><td class="t">$0</td><td class="t" data-p="credit.monthly">…</td><td class="t" data-p="speed.community">…</td><td>with a plan</td></tr>
  </table></div>

\* 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.

<div class="dk-tbl"><table>
    <tr><th>what</th><th>credits</th></tr>
    <tr><td class="f">a 7-day pass</td><td class="t" data-p="credit.guest">…</td></tr>
    <tr><td class="f">monthly allowance per plan, calendar month</td><td class="t" data-p="allowance">…</td></tr>
  </table></div>

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

headers:

```text
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:

```bash
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:

```bash
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`).

---
Source: https://crawl4ai.com/docs/credits/
