Error codes

Every error response has one shape: { error: { type, code, message, param, doc_url, request_id, details? } }. Branch on type for the class of failure and on code for the exact reason; meanings never change. retry says whether repeating can help: never (fix the request), after_delay (wait for Retry-After, then send it again unchanged), same_key (send it again with the same Idempotency-Key) or refetch_then_retry (read the resource again first).

codestatustyperetrymeaning
acknowledgement_required409conflictneverThe change set has flags (`plan.flags`) the confirmation did not acknowledge.
ai_assistant_disabled403permissionnever
ai_draft_rejected422invalid_requestnever
ai_drafting_disabled403permissionnever
ai_unavailable503api_errorafter_delay
alias_conflict409conflictnever
already_exists409conflictnever
anonymous_id_retired403permissionnever
asset_processing_unavailable503api_errorafter_delay
asset_quota_exceeded409conflictnever
audit_reason_required403permissionnever
authentication_required401authenticationneverNo credential was sent. Send `Authorization: Bearer <key or token>`.
batch_too_large400invalid_requestneverMore than 100 events (25 on customer routes) in one request; nothing was stored.
battle_pass_paused409conflictnever
battle_pass_unavailable409conflictnever
billing_unavailable503api_errornever
body_too_large413invalid_requestnever
capability_unavailable501api_errornever
change_set_expired409conflictneverThe change set is past its `expires_at` (24 hours after it was proposed). Propose it again.
change_set_not_pending409conflictneverThe change set was already committed, cancelled, stale or expired.
claim_invalid404not_foundnever
concurrent_update409conflictsame_keyA concurrent change got there first. Send the same request again with the same key after `Retry-After`.
config_format_required409conflictneverA v1 configuration export was asked for an environment that needs v2. Request `schema=orishare.config/v2`.
confirmation_required403permissionneverOnly a signed-in owner or admin confirming in the dashboard commits a change set. Hand over the change set id; never retry with a token or key.
connector_order_pending503api_errorafter_delay
contribution_conflict409conflictnever
conversation_expired409conflictnever
conversation_full409conflictnever
credentials_revoked401authenticationnever
csrf_invalid403permissionnever
customer_admission_unavailable503api_errorafter_delay
customer_credential_retired410authenticationneverA legacy browser credential (anonymous_id or an HMAC customer token) was used after activation. Use customer sessions.
customer_session_limit409conflictafter_delayThe session family already has four live tokens, so a renewal or an embed (hosted widget) exchange in it is refused. Your own renewal: wait for a token of the family to expire or revoke one you no longer use, then renew, or exchange again for a new family. The hosted widget: hand it a freshly minted token that nothing else uses (a new family).
customer_surface_inactive403permissionneverThe environment's customer surface is not activated yet; customer sessions cannot be created.
energy_archived409conflictnever
energy_paused409conflictnever
entitlement_required403permissionnever
environment_activating503api_errorafter_delay
environment_required403permissionneverA personal access token or dashboard session called an environment route without `X-Orishare-Environment`.
environment_served_elsewhere421invalid_requestnever
evaluation_failed502api_errorsame_key
event_id_conflict409conflictneverThe event id was already used with a different payload or for another customer. Never resend it with a new body; use a new id for a new event.
event_requires_secret_key403permissionneverThe event is not `client_allowed`; only a backend with a secret key may send it.
event_too_large413invalid_requestnever
forbidden403permissionneverThe credential is valid but its kind or role may not do this: for example a management route called with an API key instead of a personal access token or dashboard session, a publishable key or customer session on a route for secret keys or members, or a member who is not an owner or admin.
free_allowance_exhausted402rate_limitednever
idempotency_in_progress409idempotencyafter_delayA request with the same key is still running. Wait for `Retry-After` and send it again unchanged.
idempotency_key_required400idempotencyneverThe route needs an `Idempotency-Key` header.
idempotency_key_reused422idempotencyneverThe `Idempotency-Key` was already used with a different body. Use a new key for a new intent.
insufficient_balance409conflictnever
insufficient_customer_scope403permissionneverThe customer session lacks the capability the route needs (`customer:read`, `customer:write` or `events:write_client`, after the grant policy and the keys narrowed it), or the publishable key cannot exchange or renew sessions (`customer_sessions:exchange`). Mint without narrowing `capabilities`, or use a key with that scope.
insufficient_energy409conflictnever
insufficient_items409conflictnever
insufficient_scope403permissionneverThe credential lacks a scope the route needs; `details.required` names it. Ask the operator for a key or token with that scope (GET /v1/principal shows what you hold).
internal_error500api_errornever
invalid_credentials401authenticationneverThe `Authorization` header is malformed (not `Bearer <token>`) or names an unknown key or token. Check the value and its environment; a revoked one answers `credentials_revoked`.
invalid_cursor400invalid_requestnever
invalid_customer_session401authenticationneverThe customer token is missing, expired or revoked (including after logout or a merge). Exchange again.
invalid_economy_request409conflictnever
invalid_json400invalid_requestnever
invalid_session_grant400invalid_requestneverThe exchange was refused: an invalid or expired provider token, a wrong audience or issuer, or an unknown customer.
invalid_state409conflictnever
inventory_full409conflictnever
item_archived409conflictnever
last_owner409conflictnever
live_requires_claim403permissionnever
loot_table_unavailable409conflictnever
match_profile_archived409conflictnever
merge_capacity_exceeded409conflictnever
merge_conflict409conflictnever
mid_period_change_unsupported409conflictnever
not_equippable409conflictnever
occurred_at_in_future400invalid_requestnever`occurred_at` is more than 24 hours in the future.
offer_changed409conflictrefetch_then_retry
offer_unavailable409conflictrefetch_then_retry
operation_running409conflictafter_delay
origin_mismatch403permissionneverA dashboard-only action came from another origin: committing a change set (`POST /v1/change_set_commits`) must come from the signed-in dashboard on the dashboard's own origin. Unlike `origin_not_allowed`, which is about a browser integration's origin missing from the client configuration's `allowed_origins`, this cannot be fixed by configuration: confirm in the dashboard.
origin_not_allowed403permissionneverThe request's `Origin` is not in the environment's allowed origins.
playbook_refused409conflictneverThe playbook preview was refused; `details.refusals` lists missing events, weaker trust, key collisions and parameter bounds.
playbook_too_large413invalid_requestnever
portal_unavailable503api_errorneverThe hosted widget cannot start a session: it is not enabled for this deployment, or the portal is unknown in this environment, disabled or has no published version. Publish or enable the portal; check that the publishable key belongs to its environment.
portal_version_stale409conflictrefetch_then_retry
premium_required409conflictnever
preview_stale409conflictneverThe configuration or a planned resource changed after the change set was previewed. Propose the same commands again.
pricing_unavailable503api_errornever
proof_of_work_invalid422invalid_requestnever
purchase_limit_reached409conflictnever
quota_exceeded429rate_limitedafter_delay
rate_limited429rate_limitedafter_delayToo many requests. Wait for `Retry-After`; the request did not run.
resource_in_use409conflictnever
resource_not_found404not_foundneverNo such resource in this environment (also for ids of other environments). For events, poll by the `evt_` id, not your business id.
reward_unavailable409conflictnever
route_not_found404not_foundnever
rule_invalid422invalid_requestneverThe rule definition was refused; `details.errors` lists `rule_invalid.*` codes with paths, such as `rule_invalid.action_reference` for an unknown program key or `rule_invalid.capability_unavailable`.
selection_empty409conflictnever
selection_too_large400invalid_requestnever
selection_unsupported409conflictnever
source_time_untrusted400invalid_requestnever
stale_write409conflictrefetch_then_retryThe revision you sent (`If-Match` or `expected_revision`) is no longer current, or it is missing where required. Read the resource again and decide anew.
streak_repair_limit_reached409conflictnever
streak_repair_unavailable409conflictnever
test_environment_resetting409conflictafter_delay
test_player_limit403permissionnever
tier_already_claimed409conflictnever
tier_not_reached409conflictnever
too_many_boosts409conflictnever
trust_insufficient403permissionnever
turn_in_progress409conflictafter_delay
unsupported_media_type415invalid_requestnever
usage_allowance_exhausted402rate_limitednever
validation_failed400invalid_requestneverThe request did not match the schema or a rule of the route; `param` names the field. Fix the request.