Rate limits and quotas
There are no usage tiers or per-account RPM. What can stop a request is your balance, a key’s own limit, two models’ concurrency caps, and a busy account pool.
What can stop a request
Every model is served from the shared account pool, and every account gets the same treatment from its first request: no tiers to climb, nothing that unlocks after a spending threshold, no requests-per-minute or tokens-per-minute quota. Four things can stop a request:
- 1Balance — the wallet that pays for the request is empty.
- 2Key limit — the key has its own USD limit and has spent it.
- 3Concurrency — only on
claude-sonnet-5andgpt-5.6-luna. - 4A busy pool — every pool account that can serve the model is busy at that moment.
Status codes
Errors arrive as {"error": {"code": "...", "message": "..."}}. Balance, limit and model checks run before a request is forwarded, so a rejected request costs nothing.
| Status | Meaning | What to do |
|---|---|---|
401 | invalid api key: missing, unknown, revoked or expired key. | Copy the key again; look for a stray space. |
402 | api key quota exceeded: the key spent its own limit. | Raise or remove the limit on the API Keys page. |
402 | claude_minimum_balance: Claude is paid from topped-up balance only, and it is empty or the key is pinned to another wallet. | Top up. |
403 | No wallet can pay; the message names which balance is empty. | Top up. |
429 | model_capacity_exceeded: gpt-5.6-luna has no free slot. Comes with Retry-After: 1. | Retry after a second. |
429 | model_queue_timeout: a claude-sonnet-5 request waited 30 seconds in the queue without a slot. | Back off and retry. |
429 | The account pool is busy for this model. Retry-After says when the first account frees up. | Retry after Retry-After. |
503 | Temporarily unavailable. | Retry with backoff. |
Concurrency on two models
| Model | When every slot is taken |
|---|---|
claude-sonnet-5 | Waits in a first-in, first-out queue for up to 30 seconds, then 429 model_queue_timeout. |
gpt-5.6-luna | Refused at once with 429 model_capacity_exceeded and Retry-After: 1. |
Every other model has no per-model cap: you are bounded by your balance and by how many pool accounts are free at that moment.
Retrying
The OpenAI and Anthropic SDKs already retry 429 and 5xx and honour Retry-After. Calling the API directly, use the header when it is present and fall back to exponential backoff when it is not.
for attempt in 1 2 3 4 5; do
status=$(curl -sS -o resp.json -D headers.txt -w '%{http_code}' \
https://token-share.app/v1/messages \
-H "x-api-key: $TOKEN_SHARE_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5", "max_tokens": 256, "messages": [{"role": "user", "content": "ping"}]}')
if [ "$status" != "429" ] && [ "$status" != "503" ]; then
cat resp.json; break
fi
wait=$(awk 'tolower($1) == "retry-after:" { print $2 }' headers.txt | tr -d '\r')
sleep "${wait:-$((2 ** attempt))}"
doneWhen you are charged
A request is charged after it completes, not reserved before. The pre-flight check only asks whether the wallet is non-empty, so a burst of concurrent requests on a nearly empty balance can take it slightly below zero; the shortfall is recorded, not waived. A billed request costs at least $0.0001, and a Claude request at least $0.001.
A stream cut off halfway is still charged for the tokens already produced. If it is cut before any usage is reported, the request is recorded as unbilled. The Billing API shows what each request cost.
Ready? Three steps to start
- 1Sign in to the console
- 2Top up your balance
- 3Create an API key