Errors & retries
Errors use the OpenAI error shape, so existing handling keeps working. Every response carries an X-Request-Id — quote it when contacting support.
Error shape
{
"error": {
"message": "Insufficient balance. Please top up your account.",
"type": "insufficient_quota",
"param": null,
"code": "insufficient_quota"
}
}Retry guidance
| Code | Action |
|---|---|
| 400 | Do not retry. This came from the upstream — the message explains what is wrong with the request. |
| 401 | Do not retry. Fix the key. |
| 402 | Do not retry. Top up or raise the key limit. |
| 404 | Do not retry. Fix the model ID. |
| 429 | Retry with exponential backoff, honouring Retry-After. |
| 503 | Retry after a few seconds. If it persists, all upstreams are down. |
What to retry
We already retry across upstream accounts internally before returning a failure, so a 503 means every channel for that model was unavailable — not a transient blip. Back off rather than retrying immediately.
Errors mid-stream
If an upstream drops after streaming has started, we emit a final SSE event containing an error object and then close. You are billed only for what was actually generated.
data: {"error":{"message":"Upstream connection interrupted","type":"upstream_error"}}
data: [DONE]