Telling our errors from upstream’s
Upstream errors reach you unmodified, in the provider’s own shape. Errors we generate carry an x-lcllm-error: true header and a machine-readable code prefixed lcllm_. That distinction matters during an incident: it tells you in one header whether to look at the provider’s status page or ours.
Our error codes
| Status | Code | What it means | What to do |
|---|---|---|---|
401 | lcllm_invalid_key | Key is malformed, revoked, or expired. | Check the prefix and expiry in the dashboard. |
402 | lcllm_insufficient_credit | Balance reached zero. | Top up. Enable auto-reload to avoid it entirely. |
402 | lcllm_budget_exceeded | This key hit its own monthly spend cap. | Raise the cap, or find what is burning it. |
403 | lcllm_model_not_allowed | Key's allowlist excludes this model. | Add the model to the key, or use another key. |
404 | lcllm_model_not_available | We do not carry this model. | Check the pricing page. We never substitute. |
429 | lcllm_rate_limited | Your tier limit, enforced by us. | Back off; see retries |
502 | lcllm_upstream_error | Provider returned something unusable. | Retry. Original body is in error.upstream. |
503 | lcllm_upstream_unavailable | Provider is down or unreachable. | See failover |
Reporting a problem
Send us the x-lcllm-request-id and nothing else is strictly necessary. It resolves to the full trace, including the upstream provider’s own request ID, timings, and the exact error body we received. Do not paste your prompt into a support email; we do not need it and would rather not have it.