authentication_failed | Missing, malformed, or invalid Authorization bearer key. | Not retryable without fixing credentials. |
authorization_failed | The principal is authenticated but not permitted for this resource/action. | Not retryable without a grant/scope change. |
entitlement_failed | The tenant’s plan/entitlement does not cover the request. | Not retryable without a plan change. |
rate_limited | The key’s per-key rate-limit tier was exceeded. | Retryable — honor retryAfterMs when present. |
invalid_request | Request failed schema validation. | Not retryable without fixing the request — see fieldErrors. |
provider_failed | An upstream model/inference provider failed. | Often retryable. |
tool_failed | A tool invocation failed. Compare against a tool.failed event on the same toolCallId. | Situational — see that event’s own retryable. |
tool_timed_out | A tool call exceeded its timeout. | Often retryable. |
approval_timed_out | An approval.required pause’s expiresAt passed before a decision was posted. | Not retryable as-is — the action must be re-proposed. |
memory_failed | A memory read/write failed. | Often retryable. |
stream_interrupted | The SSE connection dropped mid-run. | Retryable — resume via Last-Event-ID on run events. |
cancelled | The run was cancelled (e.g. via POST /v1/runs/:id/cancel). | Terminal — not retryable. |
conflict | Includes: an Idempotency-Key was reused with a different request body than the original. | Not retryable without changing the key or matching the original request. |
idempotency_replay | An Idempotency-Key was reused. Overlaps with the request.accepted.replayed event field — see the note below. | Not an error to retry; informational. |
internal_failed | Unexpected server-side failure. | Generally retryable with backoff. |