GenzoAI/platform

Credits & usage

Credits are the single currency across GenzoAI. The API and the Studio draw from the same balance, so there is no separate API wallet to top up and no way for one surface to be priced differently from the other.

How a call is billed

  1. Check — the flat cost for that modality and provider is compared against your balance. Too low and the request is refused before it reaches the provider.
  2. Deduct — the cost is taken up front, so the charge is exact and known before the call runs.
  3. Refund on failure — if the provider errors, the full amount is returned automatically.

If the upstream call fails, the entire hold is released and you are charged nothing. You are never billed for a failed generation.

Cost is flat per modality, not per token. A short prompt and a long one cost the same today, and every text provider charges its own fixed rate. Per-token metering is on the roadmap — GET /v1/credits/estimate already returns the figure you will actually be charged.

Checking your balance

GET /v1/credits/balance
{
  "balance": 184320,

  "monthly_allocation": 200000,
  "next_reset_at": "2026-09-01T00:00:00Z"
}

Estimating before you spend

Get the cost of a request without running it — useful for showing users a price, or for gating expensive calls behind a confirmation.

GET /v1/credits/estimate
curl "https://api.genzoai.com/v1/credits/estimate?type=text&provider=anthropic&model=claude-opus-5&max_tokens=2000" \
  -H "Authorization: Bearer $GENZO_API_KEY"

# => { "estimated_credits": 810, "worst_case_credits": 940 }

Usage and transactions

EndpointReturns
GET /v1/credits/statsAggregated spend by day, model and modality
GET /v1/credits/transactionsItemised ledger — every debit, refund and allocation

Each generation's own cost is also on the generation record itself, as credits_used, alongside tokens_input and tokens_output — so you can attribute spend per feature without reconciling against the ledger.

Where credits come from

Running out

A request that would exceed your available balance is rejected with 402 before any upstream call is made — you cannot go negative, and a runaway loop cannot generate a surprise invoice.

402 Payment Required
{
  "error": {
    "type": "insufficient_credits",
    "message": "Insufficient credits. Required: 810, available: 220.",
    "required": 810,
    "available": 220
  }
}

Balance is checked before the upstream provider is called, so a request that cannot be paid for never reaches the vendor and never partially charges you.

Controlling spend