Rate limits

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:

  1. 1Balance — the wallet that pays for the request is empty.
  2. 2Key limit — the key has its own USD limit and has spent it.
  3. 3Concurrency — only on claude-sonnet-5 and gpt-5.6-luna.
  4. 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.

StatusMeaningWhat to do
401invalid api key: missing, unknown, revoked or expired key.Copy the key again; look for a stray space.
402api key quota exceeded: the key spent its own limit.Raise or remove the limit on the API Keys page.
402claude_minimum_balance: Claude is paid from topped-up balance only, and it is empty or the key is pinned to another wallet.Top up.
403No wallet can pay; the message names which balance is empty.Top up.
429model_capacity_exceeded: gpt-5.6-luna has no free slot. Comes with Retry-After: 1.Retry after a second.
429model_queue_timeout: a claude-sonnet-5 request waited 30 seconds in the queue without a slot.Back off and retry.
429The account pool is busy for this model. Retry-After says when the first account frees up.Retry after Retry-After.
503Temporarily unavailable.Retry with backoff.

Concurrency on two models

ModelWhen every slot is taken
claude-sonnet-5Waits in a first-in, first-out queue for up to 30 seconds, then 429 model_queue_timeout.
gpt-5.6-lunaRefused 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))}"
done

When 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

  1. 1Sign in to the console
  2. 2Top up your balance
  3. 3Create an API key