Error codes
Every non-2xx response uses one envelope:{ error: { type, code, message, param?, doc_url }, request_id }. Match on the stablecode — never the human-readable message. Each error also carries adoc_url pointing at its page here.
| Code | HTTP | Meaning |
|---|---|---|
validation_failed | 400 | The request body or parameters didn't pass validation. The `param` field names the offender. |
unauthenticated | 401 | No API key was supplied, or the key is unknown, revoked, or malformed. |
forbidden | 403 | The key is valid but lacks the scope required for this operation. |
not_found | 404 | The requested resource doesn't exist in this environment. |
conflict | 409 | The request conflicts with the current state of the resource. |
rate_limited | 429 | You've sent too many requests in a window. The `Retry-After` header says how long to wait. |
internal_error | 500 | Something went wrong on our side. These are rare and tracked. |
idempotency_key_reused | 400 | This `Idempotency-Key` was already used with a different request body. |
idempotency_in_progress | 409 | A request with this `Idempotency-Key` is still being processed. |
iccid_not_found | 404 | No eSIM with that ICCID exists in this environment. |
insufficient_balance | 402 | The wallet doesn't have enough balance to cover this operation. |
bundle_exhausted | 409 | The bundle has no remaining data allowance. |
bundle_stack_limit | 409 | Stacking this bundle would exceed the maximum number of concurrent bundles on the eSIM. |
bundle_incompatible_throttle | 409 | The bundle's throttle policy is incompatible with one already applied to the eSIM. |
bundle_addon_without_base | 409 | This is an add-on bundle, but the eSIM has no active base bundle to attach it to. |
product_unavailable | 400 | The requested product doesn't exist, isn't published, or isn't available in this environment. |
capability_unsupported | 409 | The eSIM's profile or the network doesn't support the requested capability. |
shared_pool_self_share | 409 | The member eSIM is the same as the pool's creator — an eSIM can't join its own pool. |
shared_pool_member_exists | 409 | That eSIM is already a member of the shared pool. |
shared_pool_full | 409 | The shared pool has reached its maximum number of members. |
shared_pool_cross_account | 409 | The member eSIM belongs to a different tenant/sub-account than the pool. |
shared_pool_throttled | 409 | The pool operation was throttled by a rate or policy limit. |
shared_pool_sim_type | 409 | The eSIM's type isn't eligible to join this shared pool. |
shared_pool_not_found | 404 | No shared pool with that id exists in this environment. |