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
Airalo Endpoints
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.

POST 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

Parameters: search_packages
NameTypeDescription
destination required string Country or region, e.g. Japan, Europe, Global.

Request

cURL
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"}'
Python
result = client.call("airalo", "search_packages", {"destination":"destination"})
Node.js
const result = await cotlet.call('airalo', 'search_packages', {"destination":"destination"});
CLI
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
    }
  ]
}

POST 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

Parameters: list_esims
NameTypeDescription
rechargeable_only boolean Only eSIMs that can be topped up. Default: false.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/airalo/list_esims \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("airalo", "list_esims")
Node.js
const result = await cotlet.call('airalo', 'list_esims');
CLI
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
    }
  ]
}

POST 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

Parameters: get_esim
NameTypeDescription
esim_id required string eSIM ID from list_esims.

Request

cURL
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"}'
Python
result = client.call("airalo", "get_esim", {"esim_id":"esim_8c41d2"})
Node.js
const result = await cotlet.call('airalo', 'get_esim', {"esim_id":"esim_8c41d2"});
CLI
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"
    }
  ]
}

POST 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

Parameters: get_data_usage
NameTypeDescription
esim_id required string eSIM ID from list_esims.

Request

cURL
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"}'
Python
result = client.call("airalo", "get_data_usage", {"esim_id":"esim_8c41d2"})
Node.js
const result = await cotlet.call('airalo', 'get_data_usage', {"esim_id":"esim_8c41d2"});
CLI
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

Parameters: get_install_instructions
NameTypeDescription
esim_id required string eSIM ID from list_esims.

Request

cURL
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"}'
Python
result = client.call("airalo", "get_install_instructions", {"esim_id":"esim_8c41d2"})
Node.js
const result = await cotlet.call('airalo', 'get_install_instructions', {"esim_id":"esim_8c41d2"});
CLI
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
}

POST 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

Parameters: list_topup_packages
NameTypeDescription
esim_id required string eSIM ID from list_esims.

Request

cURL
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"}'
Python
result = client.call("airalo", "list_topup_packages", {"esim_id":"esim_8c41d2"})
Node.js
const result = await cotlet.call('airalo', 'list_topup_packages', {"esim_id":"esim_8c41d2"});
CLI
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
    }
  ]
}

POST 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

Parameters: list_orders
NameTypeDescription
since date Only orders on or after this date.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/airalo/list_orders \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("airalo", "list_orders")
Node.js
const result = await cotlet.call('airalo', 'list_orders');
CLI
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
    }
  ]
}

POST 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
curl -X POST https://cotlet.dev/api/v1/airalo/get_airmoney \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("airalo", "get_airmoney")
Node.js
const result = await cotlet.call('airalo', 'get_airmoney');
CLI
cotlet call airalo get_airmoney

Example response

{
  "balance_usd": 4.3,
  "applies_at_checkout": true
}

Buy eSIM

write Confirm

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

Parameters: buy_esim
NameTypeDescription
package_id required string Package ID from search_packages.
airmoney_usd number Amount of Airmoney to apply, in USD. Default: 0.

Request

cURL
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"}'
Python
result = client.call("airalo", "buy_esim", {"package_id":"package_8c41d2"})
Node.js
const result = await cotlet.call('airalo', 'buy_esim', {"package_id":"package_8c41d2"});
CLI
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"
}

Top up eSIM

write Confirm

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

Parameters: top_up_esim
NameTypeDescription
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
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}'
Python
result = client.call("airalo", "top_up_esim", {"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4})
Node.js
const result = await cotlet.call('airalo', 'top_up_esim', {"esim_id":"es_48213","package_id":"th-topup-3gb-30d","airmoney_usd":2.4});
CLI
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"
}

Set renewals

write Confirm

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

Parameters: set_renewals
NameTypeDescription
esim_id required string eSIM ID from list_esims.
enabled required boolean true turns renewals on, false turns them off.

Request

cURL
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}'
Python
result = client.call("airalo", "set_renewals", {"esim_id":"es_48102","enabled":False})
Node.js
const result = await cotlet.call('airalo', 'set_renewals', {"esim_id":"es_48102","enabled":false});
CLI
cotlet call airalo set_renewals --data '{"esim_id":"es_48102","enabled":false}'

Example response

{
  "esim_id": "es_48213",
  "renewals": "off"
}

Redeem eSIM voucher

write Confirm

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

Parameters: redeem_voucher
NameTypeDescription
code required string eSIM voucher code.

Request

cURL
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"}'
Python
result = client.call("airalo", "redeem_voucher", {"code":"code"})
Node.js
const result = await cotlet.call('airalo', 'redeem_voucher', {"code":"code"});
CLI
cotlet call airalo redeem_voucher --data '{"code":"code"}'

Example response

{
  "status": "redeemed",
  "esim_id": "es_49002",
  "package": "Europe 3 GB, 15 days"
}

Request refund

write Confirm

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

Parameters: request_refund
NameTypeDescription
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
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"}'
Python
result = client.call("airalo", "request_refund", {"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"})
Node.js
const result = await cotlet.call('airalo', 'request_refund', {"order_id":"2026101112345","reason":"wrong_purchase","refund_to":"airmoney"});
CLI
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"
}