eSIMExperimental
Update eSIM lifecycle
Changes the lifecycle of an eSIM.
Operations:
suspend: Suspends anactiveeSIM. Its packages stay active and their validity keeps running.reactivate: Reactivates asuspendedeSIM.terminate: Permanently terminates an eSIM and ends the profile's packages outside a subscription. This cannot be undone.activate: Activates apreactiveeSIM or physical SIM for the first time.
Repeating suspend or reactivate on an eSIM already in that state changes nothing.
The change completes asynchronously: the response reports the eSIM's current lifecycleStatus, and
the esim.lifecycle.* webhook reports the change once it is made.
/profiles/{profileReference}/esims/{esimReference}/lifecycleAuthorization
Authorization: Bearer {token} — an OAuth2 access token from the client-credentials flow. How authentication works
Path parameters
profileReferencestringrequiredThe eSIM's profile reference (16-digit numeric string)
esimReferencestringrequiredeSIM reference identifier (18-digit opaque token)
Headers
X-Idempotency-KeystringOptional idempotency key for mutating requests (POST, PATCH). If provided, duplicate requests with the same key within 48 hours will return the cached original response without duplicating side effects.
Behavior:
- Same key + same request body → returns cached response (prevents duplicate operations)
- Same key + different request body → returns 422 error
- Same key + in-flight request → returns 409 error with Retry-After header
- Keys expire after 48 hours
Request Body Matching: Request bodies are compared by their JSON content. Object key order, including in nested objects, and whitespace do not affect matching. This means:
{"a":1,"b":2}and{"b":2,"a":1}are treated as identical ✓- Whitespace differences are ignored ✓
- URL parameters and headers are NOT included in request body matching
Best Practices:
- Use UUIDs or client-generated unique strings
- Store keys on your side to support retries
- Don't reuse keys across different operations
Request body
application/json · required
operationstringThe lifecycle operation to perform. Either operation or action must be provided.
suspend: Temporarily suspend the eSIM (can be reactivated)reactivate: Reactivate a suspended eSIMterminate: Permanently terminate the eSIM (cannot be undone)activate: Activate apreactiveeSIM or physical SIM for the first time
suspendreactivateterminateactivateactionstringAlias for operation. Either operation or action must be provided.
suspendreactivateterminateactivateResponses
200eSIM lifecycle operation completed successfullyapplication/jsonShow response bodyHide response body
dataobjectoptionalShow propertiesHide properties
profileReferencestringoptionalesimReferencestringoptionaleSIM reference identifier (18-digit opaque token)
iccidstringoptionalstatusstringoptionalProfile state on the device, as reported by the SM-DP+. A physical SIM has no download lifecycle and stays released; its service state is lifecycleStatus.
released: Ready for use; an eSIM profile in this state is available for download (QR code ready)downloaded: Profile has been downloaded to the deviceinstalled: Profile is installed on the eSIM chipenabled: Profile is active on the devicedisabled: Profile is installed but disabled on the devicedeleted: Profile has been removed from the devicefaulted: Profile failed to download or install on the device
releaseddownloadedinstalledenableddisableddeletedfaultedlifecycleStatusstringoptionalNetwork service state of the eSIM.
preactive: not live on the network yetactive: live on the networksuspended: temporarily without network service; can be reactivatedterminated: permanently without network servicefaulted,stale: network service could not be set up; contact support
preactiveactivesuspendedterminatedfaultedstaleupdatedAtstring · date-timeoptional409The operation does not apply to the eSIM now: `invalid_state_transition`, `esim_terminated`, `esim_not_provisioned`, `esim_change_pending`, `esim_swap_pending` or `port_in_pending`.application/problem+jsonShow response bodyHide response body
typestring · uriURI reference to error documentation
titlestringShort, consistent error summary
statusintegerHTTP status code
detailstringHuman-readable explanation specific to this occurrence
codestringExtensible enum. Machine-readable error slug. This is the field clients should branch on. The URI in type documents the code. Handle an unknown code by its HTTP status.
bad_requestvalidation_failedunauthorizedpayment_requiredfeature_not_enabledforbiddenbalance_not_foundesim_not_foundnot_foundnumber_registration_not_foundport_in_not_foundprofile_not_foundscheduled_action_not_foundsubscription_not_foundsubscription_plan_not_foundwebhook_endpoint_not_foundbalance_not_availablebalance_update_pendingconcurrent_modificationconflictesim_change_pendingesim_not_activeesim_not_provisionedesim_suspendedesim_swap_cooldownesim_swap_pendingesim_terminatedinvalid_state_transitionlimit_reachedno_esim_availablenumber_registration_pendingport_in_pendingservices_change_pendingservices_not_availablebalance_not_supportedbalance_operation_not_supportedbalance_update_refusedclient_transaction_id_reusedesim_variant_not_allowedesim_variant_not_swappableidempotency_key_reusedinsufficient_balancenumber_not_availablenumber_registration_not_supportedport_in_cancel_refusedporting_not_supportedservices_change_refusedservices_not_changeableservices_not_supportedsim_refused_by_networkunprocessable_entitylockedrate_limit_exceededinternal_errorbad_gatewayservice_unavailable400Bad request - invalid parameters401Unauthorized - missing or invalid API key403Forbidden - client does not have access to this resource404Resource not found429Rate limit exceeded. A `429` can also arrive without these headers or this body; handle it by its status code.500Internal server error