Errors & limits
Errors use the OpenAI error object, so SDKs surface them the same way:
{
"error": {
"message": "Invalid proxy server token passed.",
"type": "auth_error",
"code": "invalid_api_key"
}
}Status codes
| Status | Usually means | What to do |
|---|---|---|
400 | Malformed JSON or a required field missing. | Fix the request body. |
401 | Missing, malformed or revoked key, or the key lacks this group. | Check /v1/models; ask for a key. |
403 | Blocked at the edge because the path is not on the client allow-list. | Use /v1/* or /health/*. |
404 | Unknown route; the edge exposes only /v1/* and /health/*. | Check the path. |
422 | Validation failed, or the key is over budget. | Inspect error.message; top up. |
429 | Key or upstream rate limit. | Back off and retry. |
500 | Internal proxy error. | Retry once; report with a request id. |
502/503 | Upstream provider error or no healthy upstream. | Retry; fallback may already have run. |
504 | Upstream timed out (router timeout is 600 s). | Stream, or lower max_tokens. |
Retries and fallbacks
The router retries a failed call twice and falls back from deepseek-v4-pro to
deepseek-flash. Retries are automatic but not infinite. If a provider is down and
the fallback also fails, the client sees the upstream status.
Budgets
A key's budget is checked before each request. Text tokens and video jobs both
consume it. The check has no reservation for in-flight work: video tasks are
charged when they report cost, so concurrent creates can overspend before the
next call is rejected. Once the budget is exhausted the key fails every call,
including GET /v1/videos/{id} for a job it already created. Budget the whole
job lifecycle, not just creation.
What is public
Only the client API (/v1/*) and the health probes are public. Admin and
console paths are blocked at the edge. A client never needs them; spend is
tracked against the key's budget.
curl -sS "https://llms.party/health/readiness"