PortingExperimental
Cancel a port-in request
Requests cancellation of a pending port-in. Cancellation is asynchronous: the status moves to cancelling and becomes cancelled once the provider confirms, or is cancelled at once when the provider had already cancelled it. An eSIM that waits for its port before going live stays pre-active after a confirmed cancellation — submit a corrected request or abandon to activate with the temporary number.
/profiles/{profileReference}/esims/{esimReference}/port-ins/{portInRequestReference}/cancelAuthorization
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)
portInRequestReferencestringrequiredPublic port-in request reference (8-char uppercase base36)
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
Responses
200Cancellation requestedapplication/jsonShow response bodyHide response body
dataobjectoptionalShow propertiesHide properties
portInRequestReferencestringPublic opaque port-in request reference (8-char uppercase base36)
profileReferencestringesimReferencestringThe eSIM this port-in belongs to
msisdnstringThe number being ported, in international format (E.164 without a leading +)
detailsone of Belgium | NetherlandsoptionalDonor details of the number to port. Their shape depends on the country of the selected eSIM's variant: the Belgian or the Dutch shape. Unknown fields are rejected.
Show propertiesHide properties
BelgiumobjectoptionalDonor details of a Belgian number. A prepaid contract takes donorIccid and/or donorSimNumber; a postpaid contract any of donorIccid, donorSimNumber and donorAccountNumber; a business contract donorAccountNumber only.
Show propertiesHide properties
donorContractTypestringContract type of the number at the donor operator
prepaidpostpaidbusinessdonorIccidstringoptionalICCID of the donor SIM card, with a valid check digit. The preferred proof of a donor SIM: most donor operators accept it.
donorSimNumberstringoptionalThe number printed on the donor SIM card. Send it only when the donor SIM's ICCID is not available; donorIccid is accepted by more donor operators.
donorAccountNumberstringoptionalAccount/customer number at the donor operator
NetherlandsobjectoptionalDonor details of a Dutch number. A postpaid contract requires donorAccountNumber.
Show propertiesHide properties
donorContractTypestringContract type of the number at the donor operator
prepaidpostpaiddonorAccountNumberstringoptionalCustomer number at the donor operator
statusstringrequested: Accepted by Firsty; provider submission in progressapproved: The donor accepted the port;scheduledAtis when the number moves, once known, which can be days ahead. The port finishes atcompletedcancelling: Cancellation requested, awaiting provider confirmationcompleted: The donor released the number and it is assigned to this SIMrejected: Donor rejected the request (seereason); submit a corrected request. A rejection the customer can still correct may keep the requestrequesteduntil it is finalfailed: Port failed (seereason); submit a corrected requestcancelled: Cancellation confirmed; the eSIM stays pre-active for a corrected request or abandon
requestedapprovedcancellingcompletedrejectedfailedcancelledreasonobjectoptionalWhy the port-in was rejected or failed. Present when status is rejected or failed, and on a requested port-in the donor has rejected for a reason the customer can still correct
Show propertiesHide properties
codestringNormalized cause of the rejection or failure, the same for every porting provider. provider_failure covers every cause without a more specific code. The list of values is open-ended; new values may be added
msisdn_sim_mismatchmsisdn_account_mismatchdonor_contract_type_mismatchnumber_not_activenumber_not_portablenumber_porting_in_progressporting_window_unavailableprovider_failuremessagestring | nullHuman-readable detail of the cause for support; free-form, not intended to be parsed. Null when there is none
scheduledAtstring | null · date-timeWhen the number moves to this SIM, as the donor agreed when it approved the port; null until known. It may move until the port completes
submittedAtstring | null · date-timeWhen the port-in was submitted to the provider; null while submission is still pending, and for a port-in whose request was not accepted
completedAtstring | null · date-timeWhen the port completed
abandonedbooleanoptionalWhether porting was abandoned in favour of the temporary number (irreversible; no corrected request possible)
createdAtstring · date-timeupdatedAtstring · date-time409Attempt is not cancellable in its current status, including a port that has already completedapplication/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_unavailable422The network refused the cancellation (`port_in_cancel_refused`)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_unavailable401Unauthorized - 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