Title: Errors %E2%80%94 LLM EU Canonical: https://llmeu.com/en/docs/errors/ Markdown mirror: https://llmeu.com/en/docs/errors.md Machine-readable: https://llmeu.com/llms.txt (index) - https://llmeu.com/llms-full.txt (full catalogue) - https://llmeu.com/llms-catalogue.json Get started - [Quickstart](/en/docs/quickstart/) - [Console](/en/docs/console/) - [Migration](/en/docs/migration/) - [API reference](/en/docs/api/) Reference - [Authentication](/en/docs/authentication/) - [Endpoints](/en/docs/endpoints/) - [Errors](/en/docs/errors/) - [Rate limits](/en/docs/rate-limits/) - [Streaming](/en/docs/streaming/) - [Policies](/en/docs/policies/) - [Routing and policy](/en/docs/routing/) - [Residency and regions](/en/docs/residency/) - [Evidence and verification](/en/docs/evidence/) - [OpenAI compatibility](/en/docs/openai-compat/) Operate - [Self-hosting](/en/docs/self-hosting/) # Errors Every error code this API can answer with, the HTTP status that carries it, and what to do about it. The envelope is OpenAI-shaped with one namespaced addition. ## The envelope error.message is written for a person reading a log, error.type names the class of failure, and error.code is the stable identifier to branch on %E2%80%94 message text is not a contract. Where the API has structured detail (which policy, which endpoint, which model) it arrives in error.llmeu and never replaces the three standard fields. ``` { "error": { "message": "No endpoint satisfies residency eu-owned. Residency is never relaxed silently.", "type": "conflict_error", "code": "no_endpoint_for_policy", "llmeu": { "requested": "llmeu-auto" } } } ``` ## type follows status The mapping below is the one the API applies, rendered from the same table that builds its responses. ## Codes Every code that can reach a client. A test walks the API source and fails when this table and the code disagree in either direction, so a code cannot be invented here or added there without being documented. ## no_endpoint_for_policy is the product working A 409 with this code means the policy and the request together admit no endpoint, and the router refused to relax either one silently. It is not transient: retrying without changing the request, the policy or the residency fails the same way. The error carries the requested residency, and the trace records why each endpoint was rejected. ## Errors inside a stream A streaming request that fails after the headers are sent writes the error as a final SSE frame and then the terminator, so a client that follows the format sees a failure instead of a truncated success. ``` data: {"error":{"message":"No endpoint could start the stream.","type":"api_error","code":"upstream_error"}} data: [DONE] ```