Porting
Cancel a port-in request
Experimental. This endpoint is still settling — its request and response shape may change without a deprecation cycle.
Requests cancellation of a pending port-in. Cancellation is asynchronous: the status moves to cancelling and becomes cancelled once the provider confirms. After a confirmed cancellation the eSIM stays pre-active — 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 using a deterministic fingerprint. The fingerprint is computed by canonicalizing the JSON (sorting object keys recursively) and hashing with SHA-256. 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 the fingerprint
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
dataobjectShow propertiesHide properties
portInRequestReferencestringrequiredPublic opaque port-in request reference (8-char uppercase base36)
profileReferencestringrequiredesimReferencestringrequiredThe eSIM this port-in belongs to
msisdnstringrequiredThe number being ported, in international format (E.164 without a leading +)
detailsobjectProvider-specific donor details. The exact fields and validation depend on the eSIM variant. Fields that are accepted, required, or mutually exclusive are resolved from the selected eSIM's number-porting provider. Unknown fields are rejected.
Show propertiesHide properties
donorContractTypestringrequiredContract type of the number at the donor operator
prepaidpostpaiddonorIccidstringDonor SIM ICCID at the donor operator. Exact format is validated per eSIM variant.
donorAccountNumberstringAccount/customer number at the donor operator
statusstringrequiredrequested: Accepted by Firsty; provider submission in progressapproved: Donor/provider accepted the portscheduled: Port scheduled for a future date (reserved for future markets)cancelling: Cancellation requested, awaiting provider confirmationcompleted: Number ported — the eSIM activates with the ported numberrejected: Donor rejected the request (see reason)failed: Port failed (see reason)cancelled: Cancellation confirmed
requestedapprovedscheduledcancellingcompletedrejectedfailedcancelledreasonobject | nullFailure/rejection detail, present when status is rejected or failed
Show propertiesHide properties
codestringrequiredNormalized failure/rejection code
messagestring | nullHuman-readable detail when available
scheduledDatestring | null · datePlanned porting date when known (reserved for future markets)
submittedAtstring | null · date-timeWhen the port-in was submitted to the provider; null while submission is still pending
completedAtstring | null · date-timeWhen the port completed
abandonedbooleanWhether porting was abandoned in favour of the temporary number (irreversible; no corrected request possible)
createdAtstring · date-timerequiredupdatedAtstring · date-timerequired409Attempt is not cancellable in its current statusapplication/problem+jsonShow response bodyHide response body
typestring · urirequiredURI reference to error documentation
titlestringrequiredShort, consistent error summary
statusintegerrequiredHTTP status code
detailstringrequiredHuman-readable explanation specific to this occurrence
401Unauthorized - missing or invalid API key403Forbidden - client does not have access to this resource404Resource not found429Rate limit exceeded500Internal server error