# Balance and pricing

> Prepaid balance, how a request is priced and when nothing is charged.

You pay from a prepaid balance in US dollars, as you go. There are no
subscriptions or minimum payments.

## Top-up

Currently done manually — email us at support@example.com. Crypto top-up is coming
soon.

## How a request is priced

| Model type | What is billed |
| --- | --- |
| Text | Tokens at per-million rates: input, output, cache read, cache write (5 minutes and 1 hour) |
| Images | Each delivered image, but never more than the requested `n` |
| Video | Seconds of video length, once — when the job completes |

- Tokens come from the usage the model's provider returned. Reasoning tokens
  count as output.
- If the provider sent no usage (for example, the stream broke off), the cost
  is estimated from the size of the request and of the received response.
- Video length comes from the provider's response; if it did not report it, the
  requested seconds are charged.
- Rates differ per model, and your account may have personal prices. Ask
  support@example.com for current rates.

## When nothing is charged

- The gateway rejected the request (4xx errors), or the provider did before the
  response started.
- All of the model's providers are unavailable (`502 upstream_unavailable`).
- The provider broke off the stream or sent an error before the first piece of the response.
- A video job ended with status `failed`.

If a stream breaks off mid-response, the request's input and the output
generated so far are charged. The same applies if you abort the request
yourself after HTTP 200 arrived: the input is charged in full, even if the
model had not started answering yet (for example, it was still reasoning).

## Reserve and limits

- While a text or image request runs, its expected cost is reserved on your
  balance. If the free remainder is held by requests in progress, a new request
  gets `402 insufficient_quota` — retry once they finish.
- Each key can have a spend limit set in the cabinet: once reached, requests on
  that key get `403 spend_limit_exceeded` while other keys keep working.

## Check your balance

In the cabinet — on the dashboard and in the Balance section. From code —
`GET /v1/balance` with your key; the amount is a decimal string, so no
precision is lost:

```bash
curl https://ai-seller.vibe-codes.ru/v1/balance \
  -H "Authorization: Bearer $AISELLER_API_KEY"
```

```json
{"balance": "12.5", "currency": "usd"}
```

Spending by day and model is in the cabinet's Usage section.
