---
title: Credits and billing
description: What paid work costs in the Zaraftis v1 API, and how reservations settle.
sidebar:
  label: Credits and billing
  order: 4
---

Work is paid for with prepaid credits. A workspace gets its first credits from the free trial, which starts when you choose the API path at sign-up, or from a credit pack bought through the dashboard checkout. Trial credits expire when the trial ends. Every accepted request reserves its disclosed maximum before any work starts, and unused credits are released when the work ends. Failed operations do not spend credits. Credits are whole numbers.

## The catalog

The machine-readable catalog is served by `GET /v1/capabilities` (the `operations` array, with `credit_catalog_version`). The table below is rendered at build time from the same constant the endpoint serves:

<!-- GENERATED: credit catalog table; rendered at build time from the same catalog source the API serves -->

| Operation | Credits | Notes |
| --- | ---: | --- |
| AI platform query | 20 | One successfully completed AI platform query, one prompt on one platform. The same credit cost on every platform except Claude (see below). Failed operations do not spend credits. |
| AI platform query, Claude | 100 | One successfully completed Claude query (one prompt). Claude carries the heavier query price; every other platform bills 20 credits per query. |
| Site audit | 10 | One successfully completed one-page site audit. |
| Auto AI visibility setup | 50 | max(50, 15 + 5\*topics + 2\*prompts) credits. unit_credits shows the 50-credit floor; the final cost scales with the requested counts (no competitor term). The default setup (5 topics, 25 prompts) costs 90 credits. |
| Manual AI visibility setup | 0 | Manual setup creation, where the caller supplies the topics, prompts, and competitors, is free. |

<!-- GENERATED END -->

## How a request is charged

Every request that starts paid work carries a `billing` object:

```json
{
  "billing": {
    "operation": "ai_platform_query",
    "credit_catalog_version": "2026-11-04",
    "quantity_requested": 4,
    "unit_credits": 20,
    "maximum_credits": 80,
    "reserved_credits": 80,
    "billing_status": "reserved",
    "wallet_history_id": "wh_3kP9xQ2mLr"
  }
}
```

1. When the request is accepted, the most it can cost is set aside: `billing_status` is `reserved`.
2. When the work ends, the same object comes back with `credits_deducted` for the work that succeeded, `credits_released` for the rest, and a final `billing_status` of `deducted` or `released`.
3. A rejected request sets nothing aside and has no `billing` object.

If the wallet has no credits, or cannot cover the most the request can cost, the request answers `402 wallet_not_activated` or `402 insufficient_credits` and nothing is started. Reads keep working.

The accepted request is the approval: there is no separate confirmation step. Send an `Idempotency-Key` so a retry never charges twice; see [Safe retries](/conventions#safe-retries-with-idempotency-key).

## Rate limits and running scans

See [Rate limits](/conventions#rate-limits). `GET /v1/capabilities` shows how many scans a workspace can run at once in `limits.concurrent_work`.
