Errors
All errors return OpenAI-shaped JSON:
{ "error": { "message": "...", "type": "...", "code": "..." } }
| HTTP | code | type | Retryable | What to do |
|---|---|---|---|---|
| 400 | missing_model | invalid_request_error | no | Add "model" to the body or use a prompt that pins one. |
| 400 | unknown_model | invalid_request_error | no | Slug not in catalog. See platform models list. |
| 503 | vendor_unavailable | service_unavailable | wait | A dependency inside odnoga is failing. The message is deliberately generic and never carries the provider's own text: a supplier-account problem is ours, not yours. x-odnoga-ticket carries the ticket already open with the odnoga team at highest priority. Retry shortly or send another model. |
| 400 | model_deprecated | invalid_request_error | no | The model is retired. The message names the retirement date and the replacement; move to it. An organisation admin can instead enable Organisation → Defaults → Retired models so the same-vendor replacement serves the old name automatically (the response then carries x-odnoga-model-fallback). |
| 400 | model_not_allowed | invalid_request_error | no | Workspace allowlist rejected this model. Add it under Routing → Allowed models. |
| 400 | missing_messages | invalid_request_error | no | Send messages (or prompt). |
| 400 | invalid_prompt | invalid_request_error | no | Prompt slug not found or label/version mismatch. |
| 401 | invalid_api_key | authentication_error | no | Wrong / revoked virtual key. Mint a new one. |
| 402 | budget_exhausted | billing_error | wait | Active budget window is full. Wait for reset or raise cap. |
| 402 | end_user_exhausted | billing_error | no | That end user's wallet is empty. Nothing was sent to a vendor and nothing was charged. Expected, not an incident — catch it and show your own top-up or upgrade screen. The message names the unit you configured. Credit the wallet with wallets.adjust, or turn off "block at zero" to meter without enforcing. |
| 402 | subscription_inactive | billing_error | no | Workspace billing canceled/unpaid. Fix in Pay odnoga. |
| 402 | no_vendor_key | billing_error | no | No vault key for that vendor. Add one in Routing → Vault keys. |
| 429 | rate_limited | rate_limit_error | yes (backoff) | Honor x-ratelimit-reset. Exponential backoff. |
| 502 | upstream_error | api_error | yes | Vendor returned an error. Check Request Inspector. |
| 504 | timeout | api_error | yes | Vendor didn't respond in time. Retry with backoff. |
| 500 | internal | api_error | yes | Open a ticket with the x-airouter-request-id. |
Retry policy (consumer)
- Never retry
4xxother than429and408. - Retry with exponential backoff for
429,5xx, network errors. Cap at 3 attempts. - Always respect
x-ratelimit-resetwhen present.
See Retries and timeouts for a tested helper.