Error codes
Every error from the tenant and decide APIs answers { "error": { "code", "message", "details"? } }, and code is one of these.
| Code | HTTP status | Meaning |
|---|---|---|
bad_request | 400 | The request is malformed or missing a required value. |
unauthorized | 401 | The API key or EdgeKit session is missing or invalid. |
forbidden | 403 | The caller is identified but not allowed to do this. |
not_found | 404 | The resource does not exist, or this route does not apply here. |
conflict | 409 | The request conflicts with current state, such as an existing record. |
unprocessable_entity | 422 | The request parsed but failed validation; `details` says where. |
payload_too_large | 413 | The body is over the route’s size cap and was refused unread. |
too_many_requests | 429 | A rate limit was hit. Retry after the `Retry-After` header. |
internal_error | 500 | An unexpected failure on EdgeKit’s side. The message carries no detail. |
service_unavailable | 503 | A 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_missing | 401 | The exchange carried no `external_credential`. Not retried. |
external_credential_expired | 401 | The `external_credential` has expired. Not retried. |
external_credential_invalid | 401 | The `external_credential` failed verification. Deliberately unspecific. Not retried. |
identity_provider_unreachable | 503 | The `identity_provider` did not answer. Retry after `Retry-After`. |
identity_provider_rate_limited | 503 | The `identity_provider` is rate limiting EdgeKit. Retry after `Retry-After`. |
seat_limit_reached | 403 | The invitation cannot be accepted: the `user_org` has no free seat. |
snapshot_event_unsupported | 400 | A 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.