Skip to content

Error codes

Every error from the tenant and decide APIs answers { "error": { "code", "message", "details"? } }, and code is one of these.

CodeHTTP statusMeaning
bad_request400The request is malformed or missing a required value.
unauthorized401The API key or EdgeKit session is missing or invalid.
forbidden403The caller is identified but not allowed to do this.
not_found404The resource does not exist, or this route does not apply here.
conflict409The request conflicts with current state, such as an existing record.
unprocessable_entity422The request parsed but failed validation; `details` says where.
payload_too_large413The body is over the route’s size cap and was refused unread.
too_many_requests429A rate limit was hit. Retry after the `Retry-After` header.
internal_error500An unexpected failure on EdgeKit’s side. The message carries no detail.
service_unavailable503A dependency is briefly down, or this tenant is not configured for the capability. With `Retry-After`, retry after it; without, a retry will not help until an operator acts.
external_credential_missing401The exchange carried no `external_credential`. Not retried.
external_credential_expired401The `external_credential` has expired. Not retried.
external_credential_invalid401The `external_credential` failed verification. Deliberately unspecific. Not retried.
identity_provider_unreachable503The `identity_provider` did not answer. Retry after `Retry-After`.
identity_provider_rate_limited503The `identity_provider` is rate limiting EdgeKit. Retry after `Retry-After`.
seat_limit_reached403The invitation cannot be accepted: the `user_org` has no free seat.
snapshot_event_unsupported400A Stripe event destination sends snapshot events; register it for thin events.

Checkout is the one exception: its 409 and 422 refusals carry the route’s own code, an open set that includes the billing provider’s decline codes, so a client should render any unknown checkout code by its message.