REST API reference
Airalo API
13 endpoints for Airalo. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/airalo
- Connects with
- Your own Airalo account (email and password, or Google or Apple sign-in). Airalo emails a verification code on a login from a new device, which you enter once when you connect.
- Integration page
- Airalo
| Endpoint | Access | Description |
|---|---|---|
| search_packages | read | eSIM packages from the store for a country or region, with data, validity and price. |
| list_esims | read | eSIMs under My eSIMs, with destination, ICCID and whether they can be topped up. |
| get_esim | read | Details of one eSIM: ICCID, package history, whether it is rechargeable and whether renewals are offered and on. |
| get_data_usage | read | Remaining and used data on an eSIM and when the current package expires. |
| get_install_instructions | read | QR code, SM-DP+ address and activation code to install the eSIM, from Install or share. |
| list_topup_packages | read | Top-up packages available for a rechargeable eSIM, with data, validity and price. |
| list_orders | read | Your orders from Profile > Orders: package, date, amount and order number. |
| get_airmoney | read | Airmoney balance in USD, from Airmoney & Membership. |
| buy_esim | write | Buy a package from search_packages; the eSIM appears under My eSIMs, ready to install. |
| top_up_esim | write | Add a top-up package to a rechargeable eSIM. |
| set_renewals | write | Turn renewals on or off for an eSIM, when it offers them. |
| redeem_voucher | write | Redeem an eSIM voucher code, which adds one package to your account. |
| request_refund | write | Ask for a refund on an eligible order, the same as the Request Refund button. |
Search packages
readPOST https://cotlet.dev/api/v1/airalo/search_packages
Returns the packages the Airalo store lists for a destination. Each item has the data amount, validity in days and price in USD, and says whether the eSIM is rechargeable, which Airalo shows under Additional information. Use package_id with buy_esim.
Parameters
| Name | Type | Description |
|---|---|---|
| destination required | string | Country or region, e.g. Japan, Europe, Global. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/search_packages \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"destination":"destination"}' result = client.call("airalo", "search_packages", {"destination":"destination"}) const result = await cotlet.call('airalo', 'search_packages', {"destination":"destination"}); cotlet call airalo search_packages --data '{"destination":"destination"}' Example response
{
"packages": [
{
"package_id": "jp-7d-5gb",
"title": "Japan 5 GB, 7 days",
"data_gb": 5,
"validity_days": 7,
"price_usd": 9.5,
"rechargeable": true
},
{
"package_id": "jp-30d-10gb",
"title": "Japan 10 GB, 30 days",
"data_gb": 10,
"validity_days": 30,
"price_usd": 19.5,
"rechargeable": true
}
]
} List my eSIMs
readPOST https://cotlet.dev/api/v1/airalo/list_esims
Lists the eSIMs in your account with destination, package, ICCID and whether the eSIM is rechargeable. Use esim_id from each item with the other eSIM tools. Set rechargeable_only to see only the eSIMs a top-up can reach.
Parameters
| Name | Type | Description |
|---|---|---|
| rechargeable_only | boolean | Only eSIMs that can be topped up. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/list_esims \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("airalo", "list_esims") const result = await cotlet.call('airalo', 'list_esims'); cotlet call airalo list_esims Example response
{
"esims": [
{
"esim_id": "es_48213",
"destination": "Thailand",
"package": "Thailand 5 GB, 30 days",
"iccid": "8910300000000048213",
"rechargeable": true
},
{
"esim_id": "es_47790",
"destination": "Japan",
"package": "Japan 5 GB, 7 days",
"iccid": "8910300000000047790",
"rechargeable": false
}
]
} Get eSIM details
readPOST https://cotlet.dev/api/v1/airalo/get_esim
Returns one eSIM as My eSIMs shows it under Details: ICCID, the packages bought for it (Package History) and whether renewals are offered and switched on. Use it before set_renewals.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/get_esim \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"esim_8c41d2"}' result = client.call("airalo", "get_esim", {"esim_id":"esim_8c41d2"}) const result = await cotlet.call('airalo', 'get_esim', {"esim_id":"esim_8c41d2"}); cotlet call airalo get_esim --data '{"esim_id":"esim_8c41d2"}' Example response
{
"esim_id": "es_48213",
"destination": "Thailand",
"iccid": "8910300000000048213",
"rechargeable": true,
"renewals": {
"offered": true,
"enabled": false
},
"package_history": [
{
"order_id": "2026100198765",
"package": "Thailand 5 GB, 30 days"
}
]
} Get data usage
readPOST https://cotlet.dev/api/v1/airalo/get_data_usage
Returns the data bar from My eSIMs: total, used and remaining data and the expiry date. Airalo shows the bar only "if available"; when it is missing, usage_available is false and no numbers come back.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/get_data_usage \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"esim_8c41d2"}' result = client.call("airalo", "get_data_usage", {"esim_id":"esim_8c41d2"}) const result = await cotlet.call('airalo', 'get_data_usage', {"esim_id":"esim_8c41d2"}); cotlet call airalo get_data_usage --data '{"esim_id":"esim_8c41d2"}' Example response
{
"esim_id": "es_48213",
"usage_available": true,
"total_gb": 5,
"used_gb": 4.2,
"remaining_gb": 0.8,
"expires_at": "2026-11-02T23:59:00+07:00"
} POST https://cotlet.dev/api/v1/airalo/get_install_instructions
Returns what Install or share, Share and more shows in the app: a QR code image and the manual installation details (SM-DP+ address, activation code and a confirmation code if Airalo gives one). The tool does not install anything; you scan the QR code or enter the codes on the phone.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/get_install_instructions \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"esim_8c41d2"}' result = client.call("airalo", "get_install_instructions", {"esim_id":"esim_8c41d2"}) const result = await cotlet.call('airalo', 'get_install_instructions', {"esim_id":"esim_8c41d2"}); cotlet call airalo get_install_instructions --data '{"esim_id":"esim_8c41d2"}' Example response
{
"esim_id": "es_48213",
"qr_code_url": "https://example.com/qr/es_48213.png",
"smdp_address": "smdp.example-esim.com",
"activation_code": "K2-AB12CD-XY34ZW",
"confirmation_code": null
} List top-up packages
readPOST https://cotlet.dev/api/v1/airalo/list_topup_packages
Returns the top-up packages Airalo offers for one eSIM. The list is empty for an eSIM that is not rechargeable or whose network carrier has changed; in that case you need a new eSIM. Use package_id with top_up_esim.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/list_topup_packages \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"esim_8c41d2"}' result = client.call("airalo", "list_topup_packages", {"esim_id":"esim_8c41d2"}) const result = await cotlet.call('airalo', 'list_topup_packages', {"esim_id":"esim_8c41d2"}); cotlet call airalo list_topup_packages --data '{"esim_id":"esim_8c41d2"}' Example response
{
"esim_id": "es_48213",
"packages": [
{
"package_id": "th-topup-1gb-7d",
"title": "Thailand 1 GB, 7 days",
"price_usd": 2.5
},
{
"package_id": "th-topup-3gb-30d",
"title": "Thailand 3 GB, 30 days",
"price_usd": 6.5
}
]
} List orders
readPOST https://cotlet.dev/api/v1/airalo/list_orders
Lists the orders in your account with order number, package, date and amount in USD. Use order_id with request_refund.
Parameters
| Name | Type | Description |
|---|---|---|
| since | date | Only orders on or after this date. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/list_orders \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("airalo", "list_orders") const result = await cotlet.call('airalo', 'list_orders'); cotlet call airalo list_orders Example response
{
"orders": [
{
"order_id": "2026101112345",
"package": "Japan 5 GB, 7 days",
"ordered_at": "2026-10-11T08:40:00Z",
"amount_usd": 9.5
},
{
"order_id": "2026100198765",
"package": "Thailand 5 GB, 30 days",
"ordered_at": "2026-10-01T10:05:00Z",
"amount_usd": 11.5
}
]
} Get Airmoney
readPOST https://cotlet.dev/api/v1/airalo/get_airmoney
Returns your Airmoney balance. Airmoney is tied to US dollars. Airalo applies it at checkout only when the balance is at least 1 USD, and it cannot pay for renewals; applies_at_checkout tells you which side of that line you are on.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/airalo/get_airmoney \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("airalo", "get_airmoney") const result = await cotlet.call('airalo', 'get_airmoney'); cotlet call airalo get_airmoney Example response
{
"balance_usd": 4.3,
"applies_at_checkout": true
} POST https://cotlet.dev/api/v1/airalo/buy_esim
Prepares the order for one package. Set airmoney_usd to apply Airmoney, which needs a balance of at least 1 USD. When Airalo's checkout needs payment or extra authentication, the tool stops and returns a checkout_url for you to finish; Cotlet never enters card details. Once the order completes, the eSIM appears in My eSIMs and get_install_instructions can follow. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| package_id required | string | Package ID from search_packages. |
| airmoney_usd | number | Amount of Airmoney to apply, in USD. Default: 0. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/buy_esim \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"package_id":"package_8c41d2"}' result = client.call("airalo", "buy_esim", {"package_id":"package_8c41d2"}) const result = await cotlet.call('airalo', 'buy_esim', {"package_id":"package_8c41d2"}); cotlet call airalo buy_esim --data '{"package_id":"package_8c41d2"}' Example response
{
"order_id": "2026101112345",
"package": "Japan 5 GB, 7 days",
"price_usd": 9.5,
"airmoney_applied_usd": 2.4,
"due_usd": 7.1,
"status": "checkout_required",
"checkout_url": "https://example.com/checkout/2026101112345"
} POST https://cotlet.dev/api/v1/airalo/top_up_esim
Adds a package from list_topup_packages to an eSIM you already installed. Set airmoney_usd to apply Airmoney. When Airalo's checkout needs payment or extra authentication, the tool stops and returns a checkout_url for you to finish; Cotlet never enters card details. It fails for an eSIM that is not rechargeable. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
| package_id required | string | Top-up package ID from list_topup_packages. |
| airmoney_usd | number | Amount of Airmoney to apply, in USD. Default: 0. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/top_up_esim \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4}' result = client.call("airalo", "top_up_esim", {"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4}) const result = await cotlet.call('airalo', 'top_up_esim', {"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4}); cotlet call airalo top_up_esim --data '{"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4}' Example response
{
"esim_id": "es_48213",
"order_id": "2026101112399",
"package": "Thailand 3 GB, 30 days",
"price_usd": 6.5,
"airmoney_applied_usd": 2.4,
"due_usd": 4.1,
"status": "checkout_required",
"checkout_url": "https://example.com/checkout/2026101112399"
} POST https://cotlet.dev/api/v1/airalo/set_renewals
Switches the Renewals toggle under My eSIMs, Details. A renewal repeats your original package and is bought when about 10% of the data remains. It cannot be turned on once the data is used up or the validity has ended, and it needs a saved payment method. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| esim_id required | string | eSIM ID from list_esims. |
| enabled required | boolean | true turns renewals on, false turns them off. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/set_renewals \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"esim_id":"es_48102","enabled":false}' result = client.call("airalo", "set_renewals", {"esim_id":"es_48102","enabled":False}) const result = await cotlet.call('airalo', 'set_renewals', {"esim_id":"es_48102","enabled":false}); cotlet call airalo set_renewals --data '{"esim_id":"es_48102","enabled":false}' Example response
{
"esim_id": "es_48213",
"renewals": "off"
} POST https://cotlet.dev/api/v1/airalo/redeem_voucher
Redeems an eSIM voucher under Airmoney & Membership, Redeem Voucher. The voucher adds one specific eSIM package to your account, which you then use like any package you bought. A voucher is used up once redeemed. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| code required | string | eSIM voucher code. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/redeem_voucher \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"code":"code"}' result = client.call("airalo", "redeem_voucher", {"code":"code"}) const result = await cotlet.call('airalo', 'redeem_voucher', {"code":"code"}); cotlet call airalo redeem_voucher --data '{"code":"code"}' Example response
{
"status": "redeemed",
"esim_id": "es_49002",
"package": "Europe 3 GB, 15 days"
} POST https://cotlet.dev/api/v1/airalo/request_refund
Requests a refund the way the Request Refund button does under Package History or Profile > Orders. The button appears only for eligible orders, and expired or fully used eSIMs are not eligible; otherwise the call returns an error. Airmoney refunds are instant. Refunds to the original payment method typically take 7 to 10 business days. Several recent automated refunds can send a request to manual review. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| order_id required | string | Order number from list_orders. |
| reason required | enum | wrong_purchase, plans_changed, installation_issues or esim_not_working. |
| refund_to | enum | airmoney or original_payment. original_payment only for installation_issues and esim_not_working. Default: airmoney. |
Request
curl -X POST https://cotlet.dev/api/v1/airalo/request_refund \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"}' result = client.call("airalo", "request_refund", {"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"}) const result = await cotlet.call('airalo', 'request_refund', {"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"}); cotlet call airalo request_refund --data '{"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"}' Example response
{
"order_id": "2026101112345",
"reason": "wrong_purchase",
"refund_to": "airmoney",
"refund_usd": 9.5,
"status": "refunded"
}