Get install details
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"profileId": "01K2Z3AB4R5S6T7V8WXYZABCDE",
"status": "ready",
"activationCode": "LPA:1$smdp.example.com$K2-1A2B3C4D5E",
"qrCodePayload": "LPA:1$smdp.example.com$K2-1A2B3C4D5E",
"universalLinkUrl": "https://esim.example.com/i/K2-1A2B3C4D5E",
"manual": {
"smdpAddress": "smdp.example.com",
"activationCode": "K2-1A2B3C4D5E"
},
"iccid": "8944478000000123456"
}{
"statusCode": 400,
"message": "Must be a valid identifier.",
"code": "validation_failed",
"errors": [
{
"message": "Must be a valid identifier.",
"field": "accountId",
"code": "custom",
"path": [
"accountId"
]
}
]
}{
"statusCode": 401,
"code": "INVALID_API_KEY",
"message": "Invalid or inactive API credentials."
}{
"statusCode": 404,
"code": "resource_not_found",
"message": "Resource not found."
}{
"statusCode": 429,
"message": "Too many API requests. Try again later.",
"code": "api_key_rate_limit_exceeded",
"retryAfterSeconds": 17
}{
"statusCode": 500,
"code": "internal_server_error",
"message": "An unexpected error occurred."
}eSIM
Get install details
Everything a device needs to install the eSIM, in the three forms a device accepts.
GET
/
v1
/
esims
/
{profileId}
/
installation
Get install details
curl --request GET \
--url https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox-api.sakawave.example/v1/esims/{profileId}/installation"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"profileId": "01K2Z3AB4R5S6T7V8WXYZABCDE",
"status": "ready",
"activationCode": "LPA:1$smdp.example.com$K2-1A2B3C4D5E",
"qrCodePayload": "LPA:1$smdp.example.com$K2-1A2B3C4D5E",
"universalLinkUrl": "https://esim.example.com/i/K2-1A2B3C4D5E",
"manual": {
"smdpAddress": "smdp.example.com",
"activationCode": "K2-1A2B3C4D5E"
},
"iccid": "8944478000000123456"
}{
"statusCode": 400,
"message": "Must be a valid identifier.",
"code": "validation_failed",
"errors": [
{
"message": "Must be a valid identifier.",
"field": "accountId",
"code": "custom",
"path": [
"accountId"
]
}
]
}{
"statusCode": 401,
"code": "INVALID_API_KEY",
"message": "Invalid or inactive API credentials."
}{
"statusCode": 404,
"code": "resource_not_found",
"message": "Resource not found."
}{
"statusCode": 429,
"message": "Too many API requests. Try again later.",
"code": "api_key_rate_limit_exceeded",
"retryAfterSeconds": 17
}{
"statusCode": 500,
"code": "internal_server_error",
"message": "An unexpected error occurred."
}Offer these in the order they appear, because the first that works is the one nobody has to think about:
| Field | How it is used |
|---|---|
universalLinkUrl | One tap on a device that supports it. Nothing to scan or type. |
qrCodePayload | Render as a QR code. It must be scanned from another device — a phone cannot scan its own screen. |
manual | The SM-DP+ address and activation code, for typing in by hand. |
The activation code installs a working SIM. Treat it as a credential: show it to the person the eSIM is for, and do not log it.
Error codes
| Status | code | Cause |
|---|---|---|
404 | esim_profile_not_found | No such eSIM for this business. |
401 | INVALID_API_KEY | The key is missing, invalid, inactive, expired, from the other environment, or blocked by its IP allowlist. |
429 | api_key_rate_limit_exceeded | The per-minute limit for this key was exceeded. |
503 | esim_feature_disabled | eSIM is not enabled on this deployment. |
503 | esim_catalog_unavailable | The catalog is empty and could not be refreshed from the provider. |
503 | esim_provider_unavailable | The eSIM provider could not be reached. Nothing was charged. |
Authorizations
A secret API key, sent as Authorization: Bearer sk_test_… in sandbox or Bearer sk_live_… in live.
Path Parameters
eSIM ULID. A 26-character ULID.
Required string length:
26Pattern:
^[0-7][0-9A-HJKMNP-TV-Z]{25}$Example:
"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
Response
Successful response.
A 26-character ULID.
Required string length:
26Pattern:
^[0-7][0-9A-HJKMNP-TV-Z]{25}$Example:
"01K2Z3AB4C5D6E7F8G9HJKMNPQ"
The LPA string, e.g. LPA:1$smdp.example.com$MATCHING-ID.
The same string. Render it as a QR code for the traveller to scan.
One-tap install on a device that supports it.
Show child attributes
Show child attributes