LLM API error reference
The errors OpenAI, Anthropic and Gemini document and Salyro's own error codes, with the status, whether to retry, what to fix, and what Salyro answers.
This page lists the errors an LLM API can answer with, in two kinds of row. Provider rows are the errors Anthropic, OpenAI and Gemini document. Salyro rows are the codes Salyro's own API and Behaviors answer with. Each row gives the HTTP status, what the error means and whether to retry it. It also says what to fix and what a Salyro caller receives in the error's place.
The Retry column reads Yes, Not as it is, Depends or Unknown. Not as it is means the same request will fail again until its cause changes. Depends means the answer rests on what the provider reported, as the Errors page says of a normalised provider error. Unknown means the source does not say. OpenAI's rows say what its SDK does instead: SDK retries by default or SDK does not retry.
Where the rows come from
Provider rows quote each provider's own page or schema, and the Source column gives the page and the day it was read.
- Anthropic: its errors page on platform.claude.com, which gives each
error.typeits status, meaning and fix. - OpenAI: the error table and retry rules of its Python SDK's README on GitHub, by HTTP status. What each
typeandcodein an OpenAI error body means is unknown. Its Retry cells say what the SDK does with the status by default, not that the error will clear. The SDK retries aninsufficient_quota429 like any other 429. - Gemini: the canonical
google.rpc.Codedefinitions on GitHub, whose names a Gemini error'serror.statuscarries. They are Google's general meanings, not the Gemini API's own.
Salyro rows come from Salyro's contract in its shared code, the definitions the gateway answers with. They give each code's family and status. A Public API code also has a default message: the sentence Salyro writes when nothing more specific was written. A Behavior code's message is written where the error is raised. The Errors page explains the families.
The Through Salyro column is the gateway's own mapping from the HTTP status that reaches it to a Salyro code. Whether a provider's own status reaches Salyro unchanged depends on Salyro's routing layer, which this page does not claim. So each cell says what Salyro answers when that status reaches it. The mapping reads only the status. A provider's error body never reaches a Salyro caller, so its type and message do not change the answer.
When a failure comes after Salyro's stream has started, the 200 has already been sent. Salyro then writes one error frame instead. It carries the code the same status would have had when the failure reports a status. It is provider_timeout when Salyro's own clock ran out, and provider_error when the provider failed with no status, closed the connection or sent a malformed stream. The Salyro rows list these ways each code is sent, among others.
The LLM error decoder reads the same facts. Paste an error into it to see which row it is.
How often it is checked
Every provider fact has the day it was read. Each is due to be read again 90 days later, and Salyro's data report lists every fact with its re-check date. A fact past its date is flagged, not removed. Who re-reads the pages, and whether 90 days is the right interval, is still an open decision. Salyro's own rows change only when Salyro's code does, and the table is rebuilt from the data every time the site is built. Nothing in it is typed by hand.
What it does not know
- xAI's errors. Its page could not be read, so its row says unknown.
- OpenAI's error types and codes, such as
insufficient_quota. Its error-codes guide could not be read, so only the SDK's status table is here, and What to fix is unknown. - What an error means for the Gemini API in particular, such as which quota a
RESOURCE_EXHAUSTEDis. Gemini's troubleshooting page could not be read, so its rows give the general definitions, and most say unknown about retrying. - Errors documented after the day shown.
Search by code or meaning, filter by source or retry verdict, sort by any column, and download the rows you see as CSV. Each row has its own link: select the error.
69 rows
invalid_ | Anthropic | error. | 400 | There was an issue with the format or content of your request. | Not as it is | Fix the format or content of the request. A 400 is also returned when usage reaches an organization or workspace spend limit you set. | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
|---|---|---|---|---|---|---|---|---|
authentication_ | Anthropic | error. | 401 | There's an issue with your API key — for example, it's malformed, revoked, or expired. | Not as it is | Check the API key: it may be malformed, revoked or expired. | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
billing_ | Anthropic | error. | 402 | There's an issue with your billing or payment information. | Not as it is | Check your payment details in the Claude Console. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
permission_ | Anthropic | error. | 403 | Your API key does not have permission to use the specified resource. | Not as it is | Check your organization's access and workspace settings in the Claude Console. | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
not_ | Anthropic | error. | 404 | The requested resource was not found. | Not as it is | Check the endpoint path and any resource IDs in the request URL. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
conflict_ | Anthropic | error. | 409 | The request conflicts with the current state of a resource. | Not as it is | Resolve the conflict, then retry the request. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
request_ | Anthropic | error. | 413 | Request exceeds the maximum allowed number of bytes. | Not as it is | Send a smaller request: the Messages API accepts up to 32 MB. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
rate_ | Anthropic | error. | 429 | Your organization has hit a rate limit, reached its usage tier's monthly spend cap, or reached a spend limit on the Claude Code workspace. | Yes | Wait, then retry — honouring `retry-after`. A 429 with no `retry-after` is a spend cap, and keeps failing until access resumes. | When this status reaches Salyro, it answers provider_rate_limit_exceeded (HTTP 429): “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
api_ | Anthropic | error. | 500 | An unexpected error has occurred internal to Anthropic's systems. | Yes | Retry with exponential backoff; if it persists, contact support with the request ID. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
timeout_ | Anthropic | error. | 504 | The request timed out while processing. | Yes | For long-running requests, consider the streaming Messages API. | When this status reaches Salyro, it answers provider_timeout (HTTP 504): “The upstream model provider did not respond in time. The request was not retried.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
overloaded_ | Anthropic | error. | 529 | The API is temporarily overloaded. | Yes | Retry later, with backoff: the API is overloaded across all users, not by this request. | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | platform.claude.com/docs/en/api/errors (read 2026-09-26) |
400 | OpenAI | HTTP status | 400 | `BadRequestError` in OpenAI's SDK. | SDK does not retry | unknown | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
401 | OpenAI | HTTP status | 401 | `AuthenticationError` in OpenAI's SDK. | SDK does not retry | unknown | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
403 | OpenAI | HTTP status | 403 | `PermissionDeniedError` in OpenAI's SDK. | SDK does not retry | unknown | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
404 | OpenAI | HTTP status | 404 | `NotFoundError` in OpenAI's SDK. | SDK does not retry | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
408 | OpenAI | HTTP status | 408 | Request Timeout. | SDK retries by default | unknown | When this status reaches Salyro, it answers provider_timeout (HTTP 504): “The upstream model provider did not respond in time. The request was not retried.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L752 (read 2026-09-26) |
409 | OpenAI | HTTP status | 409 | Conflict. | SDK retries by default | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L752 (read 2026-09-26) |
422 | OpenAI | HTTP status | 422 | `UnprocessableEntityError` in OpenAI's SDK. | SDK does not retry | unknown | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
429 | OpenAI | HTTP status | 429 | `RateLimitError` in OpenAI's SDK. | SDK retries by default | unknown | When this status reaches Salyro, it answers provider_rate_limit_exceeded (HTTP 429): “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
5xx | OpenAI | HTTP status | 5xx | `InternalServerError` in OpenAI's SDK. | SDK retries by default | unknown | When one of these reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” — except 504: provider_timeout (HTTP 504): “The upstream model provider did not respond in time. The request was not retried.” | github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706 (read 2026-09-26) |
| unknown | OpenAI | — | — | OpenAI's error-codes guide is blocked by this build's network egress and was not read. What each `type` and `code` in an OpenAI error body means (`insufficient_quota`, `invalid_api_key`, …) is not recorded until somebody reads it; the SDK's status table above is what is known. | Unknown | unknown | Depends on the HTTP status that reaches Salyro: see the provider_… codes in Salyro’s rows. | platform.openai.com/docs/guides/error-codes (tried, not read, 2026-09-26) |
CANCELLED | Gemini | error. | 499 | The operation was cancelled, typically by the caller. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L41 (read 2026-09-26) |
UNKNOWN | Gemini | error. | 500 | Unknown error. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L50 (read 2026-09-26) |
INVALID_ | Gemini | error. | 400 | The client specified an invalid argument — problematic regardless of the state of the system. | Not as it is | unknown | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L58 (read 2026-09-26) |
DEADLINE_ | Gemini | error. | 504 | The deadline expired before the operation could complete. | Unknown | unknown | When this status reaches Salyro, it answers provider_timeout (HTTP 504): “The upstream model provider did not respond in time. The request was not retried.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L67 (read 2026-09-26) |
NOT_ | Gemini | error. | 404 | Some requested entity was not found. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L78 (read 2026-09-26) |
ALREADY_ | Gemini | error. | 409 | The entity that a client attempted to create already exists. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L84 (read 2026-09-26) |
PERMISSION_ | Gemini | error. | 403 | The caller does not have permission to execute the specified operation. | Unknown | unknown | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L96 (read 2026-09-26) |
UNAUTHENTICATED | Gemini | error. | 401 | The request does not have valid authentication credentials for the operation. | Unknown | unknown | When this status reaches Salyro, it answers provider_authentication_failed (HTTP 502): “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L102 (read 2026-09-26) |
RESOURCE_ | Gemini | error. | 429 | Some resource has been exhausted, perhaps a per-user quota. | Unknown | unknown | When this status reaches Salyro, it answers provider_rate_limit_exceeded (HTTP 429): “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L108 (read 2026-09-26) |
FAILED_ | Gemini | error. | 400 | The system is not in a state required for the operation's execution. | Not as it is | unknown | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L128 (read 2026-09-26) |
ABORTED | Gemini | error. | 409 | The operation was aborted, typically due to a concurrency issue. | Yes | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L137 (read 2026-09-26) |
OUT_ | Gemini | error. | 400 | The operation was attempted past the valid range. | Unknown | unknown | When this status reaches Salyro, it answers invalid_request (HTTP 400): “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L156 (read 2026-09-26) |
UNIMPLEMENTED | Gemini | error. | 501 | The operation is not implemented or is not supported/enabled in this service. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L162 (read 2026-09-26) |
INTERNAL | Gemini | error. | 500 | Internal errors: some invariants expected by the underlying system have been broken. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L169 (read 2026-09-26) |
UNAVAILABLE | Gemini | error. | 503 | The service is currently unavailable — most likely a transient condition. | Yes | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L180 (read 2026-09-26) |
DATA_ | Gemini | error. | 500 | Unrecoverable data loss or corruption. | Unknown | unknown | When this status reaches Salyro, it answers provider_error (HTTP 502): “The upstream model provider failed to serve the request.” | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L185 (read 2026-09-26) |
| unknown | Gemini | — | — | Gemini's troubleshooting page is blocked by this build's network egress and was not read. What each status means for the Gemini API in particular — which quota a RESOURCE_EXHAUSTED is, what to change for an INVALID_ARGUMENT — is not recorded; only google.rpc.Code's general definitions above are. | Unknown | unknown | Depends on the HTTP status that reaches Salyro: see the provider_… codes in Salyro’s rows. | ai.google.dev/gemini-api/docs/troubleshooting (tried, not read, 2026-09-26) |
| unknown | xAI | — | — | xAI's API reference is blocked by this build's network egress and was not read. xAI speaks the Chat Completions format, but what its error bodies carry, and what each means, is not recorded until somebody reads its page. | Unknown | unknown | Depends on the HTTP status that reaches Salyro: see the provider_… codes in Salyro’s rows. | docs.x.ai/docs/api-reference (tried, not read, 2026-09-26) |
invalid_ | Salyro Public API | error. | 400 | error.type invalid_request_error. Default message: “The request is not valid.” | Not as it is | Change the request. See the Errors page. | Sent, among others, when a 400 or 422 reaches Salyro: “The model provider rejected this request as invalid. A parameter the selected model does not support is the usual cause; check the model in GET /v1/models.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
unknown_ | Salyro Public API | error. | 400 | error.type invalid_request_error. Default message: “The request contains an argument that is not supported.” | Not as it is | Change the request. See “A parameter the provider does not support” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
unsupported_ | Salyro Public API | error. | 400 | error.type invalid_request_error. Default message: “The selected model does not support what this request asks of it.” | Not as it is | Change the request. See “A parameter the provider does not support” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
provider_ | Salyro Public API | error. | 400 | error.type invalid_request_error. Default message: “This gateway has no active credential for the provider that serves the requested model. Connect one in the Salyro dashboard, then call GET /v1/models to confirm.” | Not as it is | Change the request. See the Errors page. | Sent, among others, when the gateway has no active credential for the model’s provider: “This gateway has no active ‹provider› credential, which `‹model›` requires. Connect one in the Salyro dashboard.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types, and the engine’s own error sites |
payload_ | Salyro Public API | error. | 413 | error.type invalid_request_error. Default message: “The request body is larger than this endpoint accepts.” | Not as it is | Change the request. See the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
invalid_ | Salyro Public API | error. | 401 | error.type authentication_error. Default message: “Incorrect API key provided. Send a Salyro API key as `Authorization: Bearer <key>`.” | Not as it is | Fix the key. See “Authentication” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
permission_ | Salyro Public API | error. | 403 | error.type permission_error. Default message: “This API key is not permitted to perform that request.” | Not as it is | The key or the gateway has to change first. See “Authentication” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
gateway_ | Salyro Public API | error. | 403 | error.type permission_error. Default message: “This gateway is disabled. Re-enable it in the Salyro dashboard to resume serving requests.” | Not as it is | The key or the gateway has to change first. See “Authentication” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
unknown_ | Salyro Public API | error. | 404 | error.type not_found_error. Default message: “No such endpoint.” | Not as it is | Change the request. See the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
model_ | Salyro Public API | error. | 404 | error.type not_found_error. Default message: “The requested model does not exist or is not available to this gateway.” | Not as it is | Change the request. See the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
rate_ | Salyro Public API | error. | 429 | error.type rate_limit_error. Default message: “This API key's request rate limit was exceeded.” | Yes | Back off, then retry. See “Rate limit exceeded” on the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
provider_ | Salyro Public API | error. | 429 | error.type rate_limit_error. Default message: “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.” | Yes | Back off, then retry. See “Rate limit exceeded” on the Errors page. | Sent, among others, when a 429 reaches Salyro: “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
provider_ | Salyro Public API | error. | 502 | error.type provider_error. Default message: “The upstream model provider failed to serve the request.” | Depends | It rests on what the provider reported: a transient failure on its side is worth another attempt, a rejection of the request as written is not. The request log shows the provider’s status. See “Normalised provider error” on the Errors page. | Sent, among others, when any other provider status reaches Salyro: “The upstream model provider failed to serve the request.”; when a provider fails part-way through a stream with no status, in one error frame: “The upstream model provider failed part-way through the answer.”; when the provider’s answer has no choice with content or a tool call, or its stream no chunk at all: “The upstream model provider returned no completion.”; when the provider closed the connection part-way through a stream, in one error frame: “The upstream model provider closed the connection before the answer was complete. What was received is partial.”; when a stream turned malformed part-way through, in one error frame: “The upstream model provider sent a malformed response and the stream was ended. What was received is partial.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types, and the engine’s own error sites |
provider_ | Salyro Public API | error. | 502 | error.type provider_error. Default message: “The model provider rejected this gateway's credential. Reconnect the provider credential in the dashboard.” | Not as it is | The provider refused the gateway’s stored credential, not your Salyro key. It has to be reconnected in the dashboard first. See “Normalised provider error” on the Errors page. | Sent, among others, when a 401 or 403 reaches Salyro: “The model provider rejected this gateway's credential. Reconnect the provider credential in the Salyro dashboard.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
provider_ | Salyro Public API | error. | 504 | error.type provider_error. Default message: “The upstream model provider did not respond in time.” | Yes | Usually, with backoff. Salyro did not retry it: an inference call is not idempotent, and a retry is a second bill. See “Normalised provider error” on the Errors page. | Sent, among others, when a 408 or 504 reaches Salyro: “The upstream model provider did not respond in time. The request was not retried.”; when Salyro’s own clock ran out before the provider answered: “The upstream model provider did not respond in time. The request was not retried.”; when the provider stopped answering part-way through a stream, by Salyro’s clock, in one error frame: “The upstream model provider stopped responding before the answer was complete. The request was not retried.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types, and the engine’s own error sites |
service_ | Salyro Public API | error. | 503 | error.type service_unavailable_error. Default message: “Salyro is temporarily unable to serve this request.” | Yes | Usually, with backoff. See the Errors page. | Sent, among others, when Salyro could not reach its routing layer, or a stream was malformed before its first chunk: “Salyro could not reach the model routing layer. This is a Salyro fault; retry shortly.”; when Salyro could not check the key’s rate limit: “Salyro could not check this key’s rate limit and will not serve the request without it. Retry shortly.” | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types, and the engine’s own error sites |
server_ | Salyro Public API | error. | 500 | error.type server_error. Default message: “Salyro encountered an unexpected error. Quote the x-request-id from this response when reporting it.” | Yes | Usually, with backoff. See the Errors page. | Raised by Salyro itself. No provider status becomes it. | Salyro’s contract: PUBLIC_API_ERROR_CODES and PUBLIC_API_DEFAULT_MESSAGES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 404 | error.type not_found_error. No default message: it is written where the error is raised. | Not as it is | Check the Behavior key and the gateway. An archived Behavior, one of another tenant and one that never existed all answer this identically. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 409 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | The Behavior exists but has no active version: publish and activate one in the dashboard. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 404 | error.type not_found_error. No default message: it is written where the error is raised. | Not as it is | The pinned `version` has never been published by this Behavior. Pin a published version, or send no `version` to run the active one. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 400 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | `input` violates the Input Contract. `param` is a JSON pointer to the field. No model was called, so the request cost nothing. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 502 | error.type provider_error. No default message: it is written where the error is raised. | Depends | The model answered with something the Output Contract refuses. Nothing you sent was wrong; the provider returned an object that breaks the schema it was given. | Raised by Salyro’s Behaviors API for the reason under What to fix. Also, among others: when a run fails for any other reason — a provider failure such as a 429 among them — the Run record carries this code, while the call itself gets the original error: “This run failed before it produced an answer.” | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types, and the engine’s own error sites |
behavior_ | Salyro Behaviors | error. | 400 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | `stream: true` was sent to a Behavior with a structured Output Contract. Call it without `stream`. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 409 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | The Behavior is activated but cannot run as it stands — a tool it names was renamed, drifted, lost its grant or its connection was disabled. Somebody in the dashboard fixes it; the request itself is fine. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 400 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | `stream` and `mode` were both sent and ask for different deliveries. Send one of them. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 404 | error.type not_found_error. No default message: it is written where the error is raised. | Not as it is | No such Run under this Behavior in this gateway. Check the run id. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 409 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | The run used its whole step budget without answering. Raise `agentConfig.limits.maxSteps` or fix the tools in the dashboard. Every step was a real model call, so the run is billed. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 504 | error.type provider_error. No default message: it is written where the error is raised. | Depends | The run hit `agentConfig.limits.timeoutMs` before answering. The limit is the Behavior’s configuration, set in the dashboard. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 409 | error.type invalid_request_error. No default message: it is written where the error is raised. | Not as it is | The run was cancelled on somebody’s instruction. Start a new run if it is still wanted. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
behavior_ | Salyro Behaviors | error. | 500 | error.type server_error. No default message: it is written where the error is raised. | Yes | Salyro lost the execution — its process stopped without recording an outcome, and reconciliation closed the run. Nothing you sent was wrong; start a new run. | Raised by Salyro’s Behaviors API. No provider status becomes it. | Salyro’s contract: BEHAVIOR_RUN_ERROR_CODES in @salyro/types |
Where the rows come from
- Gemini (tried, not reachable from the build): ai.google.dev/gemini-api/docs/troubleshooting, 2026-09-26.
- xAI (tried, not reachable from the build): docs.x.ai/docs/api-reference, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L102, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L108, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L128, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L137, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L156, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L162, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L169, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L180, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L185, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L41, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L50, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L58, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L67, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L78, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L84, 2026-09-26.
- Gemini (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/rpc/code.proto#L96, 2026-09-26.
- OpenAI (read): github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L706, 2026-09-26.
- OpenAI (read): github.com/openai/openai-python/blob/384fee3252e2336a85450ff38f9bae41f9199616/README.md#L752, 2026-09-26.
- Anthropic (read): platform.claude.com/docs/en/api/errors, 2026-09-26.
- OpenAI (tried, not reachable from the build): platform.openai.com/docs/guides/error-codes, 2026-09-26.
