LeanCrawl is prepaid-credit based. Every billable operation reports `credit_cost`
in the response envelope.

## Per-call costs

| Endpoint | Credits |
|---|---|
| `markdown` `html` `links` `map` | 1 |
| `screenshot` `pdf` | 2 |
| `extract` | 3 |
| `crawl` | 1 per completed page |
| `monitor` | 1 per check (failed checks: 0) |

## Reserve → settle

`POST /v1/crawl` **reserves** `limit` credits up-front (`reserved` shows in
`GET /v1/account/usage`). As pages complete, actual usage is settled against the
reservation; at job end the unused remainder is released.

- `completed` status: all requested pages done.
- `partial` status: ran out of credits mid-crawl — results are **incomplete**;
  top up and start a new crawl with a narrower scope.

## Edge cases

- **Failed** capture runs bill `0` credits (`status = "error"` in activity).
- **Cached** hits (`status = "cached"`) still cost the endpoint's price — a 48 h
  content cache saves latency, not money.
- Cancelling a crawl pays only for pages already fetched; the rest of the
  reservation is released.

## Checking usage

`GET /v1/account/usage` → balances (`plan_credits`, `one_time_credits`), `plan_quota`,
`reserved` (in-flight reservations), `period_end`. `GET /v1/account/usage/daily` and
`GET /v1/account/activity` accept `?api_key_id=` for per-key attribution (`self` resolves
to the calling key); `GET /v1/account/keys` reports `credits_30d` per key.
`GET /v1/account/usage/daily` gives
per-day per-endpoint aggregation for up to 90 days.