Skip to content
Salyro
Reference

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.type its status, meaning and fix.
  • OpenAI: the error table and retry rules of its Python SDK's README on GitHub, by HTTP status. What each type and code in 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 an insufficient_quota 429 like any other 429.
  • Gemini: the canonical google.rpc.Code definitions on GitHub, whose names a Gemini error's error.status carries. 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_EXHAUSTED is. 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

The errors each provider documents and Salyro’s own error codes: status, meaning, whether to retry (for OpenAI, what its SDK does by default), what to fix, and what Salyro answers
invalid_request_errorAnthropicerror.type400There was an issue with the format or content of your request.Not as it isFix 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_errorAnthropicerror.type401There's an issue with your API key — for example, it's malformed, revoked, or expired.Not as it isCheck 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_errorAnthropicerror.type402There's an issue with your billing or payment information.Not as it isCheck 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_errorAnthropicerror.type403Your API key does not have permission to use the specified resource.Not as it isCheck 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_found_errorAnthropicerror.type404The requested resource was not found.Not as it isCheck 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_errorAnthropicerror.type409The request conflicts with the current state of a resource.Not as it isResolve 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_too_largeAnthropicerror.type413Request exceeds the maximum allowed number of bytes.Not as it isSend 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_limit_errorAnthropicerror.type429Your organization has hit a rate limit, reached its usage tier's monthly spend cap, or reached a spend limit on the Claude Code workspace.YesWait, 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_errorAnthropicerror.type500An unexpected error has occurred internal to Anthropic's systems.YesRetry 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_errorAnthropicerror.type504The request timed out while processing.YesFor 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_errorAnthropicerror.type529The API is temporarily overloaded.YesRetry 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)
400OpenAIHTTP status400`BadRequestError` in OpenAI's SDK.SDK does not retryunknownWhen 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)
401OpenAIHTTP status401`AuthenticationError` in OpenAI's SDK.SDK does not retryunknownWhen 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)
403OpenAIHTTP status403`PermissionDeniedError` in OpenAI's SDK.SDK does not retryunknownWhen 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)
404OpenAIHTTP status404`NotFoundError` in OpenAI's SDK.SDK does not retryunknownWhen 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)
408OpenAIHTTP status408Request Timeout.SDK retries by defaultunknownWhen 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)
409OpenAIHTTP status409Conflict.SDK retries by defaultunknownWhen 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)
422OpenAIHTTP status422`UnprocessableEntityError` in OpenAI's SDK.SDK does not retryunknownWhen 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)
429OpenAIHTTP status429`RateLimitError` in OpenAI's SDK.SDK retries by defaultunknownWhen 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)
5xxOpenAIHTTP status5xx`InternalServerError` in OpenAI's SDK.SDK retries by defaultunknownWhen 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)
unknownOpenAI——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.UnknownunknownDepends 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)
CANCELLEDGeminierror.status499The operation was cancelled, typically by the caller.UnknownunknownWhen 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)
UNKNOWNGeminierror.status500Unknown error.UnknownunknownWhen 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_ARGUMENTGeminierror.status400The client specified an invalid argument — problematic regardless of the state of the system.Not as it isunknownWhen 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_EXCEEDEDGeminierror.status504The deadline expired before the operation could complete.UnknownunknownWhen 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_FOUNDGeminierror.status404Some requested entity was not found.UnknownunknownWhen 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_EXISTSGeminierror.status409The entity that a client attempted to create already exists.UnknownunknownWhen 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_DENIEDGeminierror.status403The caller does not have permission to execute the specified operation.UnknownunknownWhen 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)
UNAUTHENTICATEDGeminierror.status401The request does not have valid authentication credentials for the operation.UnknownunknownWhen 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_EXHAUSTEDGeminierror.status429Some resource has been exhausted, perhaps a per-user quota.UnknownunknownWhen 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_PRECONDITIONGeminierror.status400The system is not in a state required for the operation's execution.Not as it isunknownWhen 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)
ABORTEDGeminierror.status409The operation was aborted, typically due to a concurrency issue.YesunknownWhen 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_OF_RANGEGeminierror.status400The operation was attempted past the valid range.UnknownunknownWhen 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)
UNIMPLEMENTEDGeminierror.status501The operation is not implemented or is not supported/enabled in this service.UnknownunknownWhen 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)
INTERNALGeminierror.status500Internal errors: some invariants expected by the underlying system have been broken.UnknownunknownWhen 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)
UNAVAILABLEGeminierror.status503The service is currently unavailable — most likely a transient condition.YesunknownWhen 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_LOSSGeminierror.status500Unrecoverable data loss or corruption.UnknownunknownWhen 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)
unknownGemini——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.UnknownunknownDepends 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)
unknownxAI——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.UnknownunknownDepends 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_requestSalyro Public APIerror.code400error.type invalid_request_error. Default message: “The request is not valid.”Not as it isChange 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_parameterSalyro Public APIerror.code400error.type invalid_request_error. Default message: “The request contains an argument that is not supported.”Not as it isChange 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_capabilitySalyro Public APIerror.code400error.type invalid_request_error. Default message: “The selected model does not support what this request asks of it.”Not as it isChange 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_credential_missingSalyro Public APIerror.code400error.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 isChange 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_too_largeSalyro Public APIerror.code413error.type invalid_request_error. Default message: “The request body is larger than this endpoint accepts.”Not as it isChange 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_api_keySalyro Public APIerror.code401error.type authentication_error. Default message: “Incorrect API key provided. Send a Salyro API key as `Authorization: Bearer <key>`.”Not as it isFix 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_deniedSalyro Public APIerror.code403error.type permission_error. Default message: “This API key is not permitted to perform that request.”Not as it isThe 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_disabledSalyro Public APIerror.code403error.type permission_error. Default message: “This gateway is disabled. Re-enable it in the Salyro dashboard to resume serving requests.”Not as it isThe 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_endpointSalyro Public APIerror.code404error.type not_found_error. Default message: “No such endpoint.”Not as it isChange 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_not_foundSalyro Public APIerror.code404error.type not_found_error. Default message: “The requested model does not exist or is not available to this gateway.”Not as it isChange 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_limit_exceededSalyro Public APIerror.code429error.type rate_limit_error. Default message: “This API key's request rate limit was exceeded.”YesBack 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_rate_limit_exceededSalyro Public APIerror.code429error.type rate_limit_error. Default message: “The model provider's rate limit was exceeded for this gateway's credential. Back off and retry.”YesBack 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_errorSalyro Public APIerror.code502error.type provider_error. Default message: “The upstream model provider failed to serve the request.”DependsIt 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_authentication_failedSalyro Public APIerror.code502error.type provider_error. Default message: “The model provider rejected this gateway's credential. Reconnect the provider credential in the dashboard.”Not as it isThe 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_timeoutSalyro Public APIerror.code504error.type provider_error. Default message: “The upstream model provider did not respond in time.”YesUsually, 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_unavailableSalyro Public APIerror.code503error.type service_unavailable_error. Default message: “Salyro is temporarily unable to serve this request.”YesUsually, 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_errorSalyro Public APIerror.code500error.type server_error. Default message: “Salyro encountered an unexpected error. Quote the x-request-id from this response when reporting it.”YesUsually, 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_not_foundSalyro Behaviorserror.code404error.type not_found_error. No default message: it is written where the error is raised.Not as it isCheck 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_not_activatedSalyro Behaviorserror.code409error.type invalid_request_error. No default message: it is written where the error is raised.Not as it isThe 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_version_not_foundSalyro Behaviorserror.code404error.type not_found_error. No default message: it is written where the error is raised.Not as it isThe 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_input_invalidSalyro Behaviorserror.code400error.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_output_invalidSalyro Behaviorserror.code502error.type provider_error. No default message: it is written where the error is raised.DependsThe 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_streaming_unsupportedSalyro Behaviorserror.code400error.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_not_runnableSalyro Behaviorserror.code409error.type invalid_request_error. No default message: it is written where the error is raised.Not as it isThe 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_run_mode_conflictSalyro Behaviorserror.code400error.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_run_not_foundSalyro Behaviorserror.code404error.type not_found_error. No default message: it is written where the error is raised.Not as it isNo 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_agent_step_limitSalyro Behaviorserror.code409error.type invalid_request_error. No default message: it is written where the error is raised.Not as it isThe 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_agent_timeoutSalyro Behaviorserror.code504error.type provider_error. No default message: it is written where the error is raised.DependsThe 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_run_cancelledSalyro Behaviorserror.code409error.type invalid_request_error. No default message: it is written where the error is raised.Not as it isThe 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_run_abandonedSalyro Behaviorserror.code500error.type server_error. No default message: it is written where the error is raised.YesSalyro 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