Skip to main content

Errors

{ "error": { "code": "…", "message": "…", "request_id": "…", "details": [ … ] } }
CodeStatusMeaning
validation_failed400 / 422The body did not match the schema. details names the path.
unauthorized401No or invalid session or key.
forbidden403Permission missing.
not_found404Does not exist, or belongs to another workspace.
conflict409State conflict; the message says which. Includes an ambiguous idempotency lease: query the resource before retrying.
rate_limited429Honour retry-after.
internal_error500Quote the request id.
provider_unavailable502 / 503The provider could not be reached.
idempotency_key_required400Missing or over 255 characters.
idempotency_conflict409Same key, different request.
idempotency_in_progress409The first request is still running.
live_entitlement_required403Live needs an entitlement this workspace does not hold.
live_operations_disabled403The deployment's live switch is off.
environment_mismatch403 / 409A key naming the other environment, or a connection bound elsewhere.
live_key_in_test_environment422Refused before storage. details[].guidance says what to do.
test_key_in_live_environment422The reverse.
credential_invalid / credential_prefix_rejected422Shape or provider validation failed.
credential_revoked409The connection's credential was revoked.
connection_not_active409Not ACTIVE or dispatchable.
connection_kind_invalid422A pooled demo connection where a direct one is required.
provider_validation_failed422The provider rejected the credential.
webhook_secret_missing409The connection has no secret for this webhook kind.
no_eligible_route422No connection survived the filters. details carries the route decision id.
intent_state_invalid409The intent is not in a state that allows this.
amount_invariant_violation422Capture or refund exceeds what is allowed, or a live per-dispatch cap.
capture_unsupported422Manual capture on a method that is sale-only.
refund_exceeds_captured / refund_cap_exceeded422 / 429Refund limits.
seller_not_found404
beneficiary_fingerprint_conflict409The same account is already registered.
cooling_off_active409The change's window has not elapsed or a notice is undelivered.
approval_required409The action needs a second approver and cannot complete in this call. The success form of the same situation is a 202 with an approval_id in the body (payout approve and release, connection live requests).
approver_must_differ422The requester tried to approve.
approval_stale409The content changed since approval.
step_up_required403A fresh second factor is needed. details.step_up.freshness_minutes.
ato_session_blocked403Credentials changed in the last 24 hours.
evidence_tier_insufficient422Fulfillment evidence too weak for this release.
fulfillment_source_unknown / fulfillment_signature_invalid / fulfillment_event_replayed422Fulfillment ingestion refusals.
policy_state_invalid409Wrong lifecycle state, replay required or stale, type mismatch.
policy_validation_failed400The definition did not parse; findings in details.
policy_not_published409
webhook_signature_invalid400An inbound provider event failed verification.
webhook_url_rejected422Not HTTPS on 443, or a private address.
demo_rate_limited / demo_readonly_credential429 / 403Demo workspace limits.

When the API itself rejects a request before a route runs: 400, 413, 415 and 422 map to validation_failed; 401 to unauthorized; 403 to forbidden; 404 to not_found; 409 to conflict; 429 to rate_limited.