Prepaid travel data eSIMs: checkout links for people, autonomous purchases from a prepaid wallet.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <wallet code>: the prepaid wallet's secret from create_wallet. Only the four wallet tools (get_wallet, create_deposit, get_deposit, purchase_esim) need it; the catalogue and the checkout flow work without it.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create an order for a person to pay. Returns token, checkout_url (the gateway's page: hand it to the person) and order_url (the order page in `lang`, with the QR code once paid: show it to the buyer only, the token is a secret). Confirm the plan and the price first: every call creates a new unpaid order, so do not retry while a checkout is open. `email` (optional) also gets the eSIM by mail. `period_num` (1–365) only for daily_unlimited plans. `topup_iccid` with a plan_id from list_topups tops up an existing eSIM. A 403 means the caller's jurisdiction is embargoed. To pay from a wallet use purchase_esim.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create an order for a person to pay. Returns token, checkout_url (the gateway's page: hand it to the person) and order_url (the order page in `lang`, with the QR code once paid: show it to the buyer only, the token is a secret). Confirm the plan and the price first: every call creates a new unpaid order, so do not retry while a checkout is open. `email` (optional) also gets the eSIM by mail. `period_num` (1–365) only for daily_unlimited plans. `topup_iccid` with a plan_id from list_topups tops up an existing eSIM. A 403 means the caller's jurisdiction is embargoed. To pay from a wallet use purchase_esim.
| Argument | Type | Description |
|---|---|---|
| lang | string | |
| any | ||
| plan_id* | integer | |
| period_num | any | |
| topup_iccid | any | |
| payment_method | string |
{
"type": "object",
"title": "create_checkoutArguments",
"required": [
"plan_id"
],
"properties": {
"lang": {
"type": "string",
"title": "Lang",
"default": "en"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email",
"default": null
},
"plan_id": {
"type": "integer",
"title": "Plan Id",
"maximum": 2147483647,
"minimum": 1
},
"period_num": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Period Num",
"default": null
},
"topup_iccid": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topup Iccid",
"default": null
},
"payment_method": {
"enum": [
"crypto",
"card"
],
"type": "string",
"title": "Payment Method",
"default": "crypto"
}
}
}Open a top-up of the wallet and get what is needed to pay it. Floors: $10 for a wallet's first deposit, $1 after that; cap $1000 per deposit. Crypto deposits earn a bonus (+2% from $25, +3% from $50, +5% from $100, capped at $25); every purchase returns 3% cashback. With payment_method "crypto" pass a currency from: BTC, ETH, TRX, USDTTRC, USDTETH, USDTBSC — the answer then carries `pay`: the address, the exact amount in the coin (network fee included) and expires_at (about 15 minutes; after that open a new deposit). Send exactly `pay.amount` to `pay.address` on `pay.network`, then poll get_deposit(token) until status is paid. checkout_url is the hosted pay page for a person; card deposits have only that. Needs the wallet code.
| Argument | Type | Description |
|---|---|---|
| lang | string | |
| currency | any | |
| amount_usd* | any | |
| payment_method | string |
{
"type": "object",
"title": "create_depositArguments",
"required": [
"amount_usd"
],
"properties": {
"lang": {
"type": "string",
"title": "Lang",
"default": "en"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Currency",
"default": null
},
"amount_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"title": "Amount Usd"
},
"payment_method": {
"enum": [
"crypto",
"card"
],
"type": "string",
"title": "Payment Method",
"default": "crypto"
}
}
}Mint a prepaid wallet with no account behind it and get its secret ONCE: `code` (32 hex characters) and the same secret as a 12-word `phrase`. Save the code before doing anything else and send it as `Authorization: Bearer <code>` on every wallet call; there is no recovery and no identity to prove. The balance is spent on eSIMs (retail price, cashback on every purchase) and never paid back out. accept_terms must be true (https://esimker.com/terms). Then create_deposit to fund it. Rate-limited and geo-blocked like checkout.
| Argument | Type | Description |
|---|---|---|
| accept_terms* | boolean |
{
"type": "object",
"title": "create_walletArguments",
"required": [
"accept_terms"
],
"properties": {
"accept_terms": {
"type": "boolean",
"title": "Accept Terms"
}
}
}One deposit of the wallet by its token: status pending → paid (credited, bonus included) | underpaid (nothing credited yet, the rest can still arrive) | payment_held (the payment processor's compliance check stopped the payment and holds it: nothing is credited, do not pay again, the person should write to support) | expired. Poll every ~30 s after sending; crypto needs the network's confirmations. Needs the wallet code.
| Argument | Type | Description |
|---|---|---|
| token* | string |
{
"type": "object",
"title": "get_depositArguments",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"title": "Token"
}
}
}An order by its token. status goes pending (unpaid) → paid → provisioning → ready; also expired, underpaid, failed_provisioning, gift_waiting, and payment_held — the payment processor's compliance check stopped the payment and holds the money: nothing is issued, the person must not pay again and should write to support. When ready, esim.activation_code is the LPA string (render it as a QR code), with iccid, smdp and matching_id. After payment poll every ~10 s; delivery usually takes under a minute.
| Argument | Type | Description |
|---|---|---|
| token* | string |
{
"type": "object",
"title": "get_orderArguments",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"title": "Token"
}
}
}Checkout methods open right now: "crypto" (a hosted invoice: BTC, ETH, TRX, USDT), "card", and "wallet" (a prepaid balance, see create_wallet). `gateways` names the providers behind each method; a checkout that does not ask for one by name goes to the first, which is what these tools do.
No arguments.
{
"type": "object",
"title": "get_payment_methodsArguments",
"properties": {}
}The plans of one destination (slug from search_destinations). Each plan: id (the plan_id for an order), name, gb, days, retail (USD; per day when daily_unlimited is true), daily_unlimited, location_codes (the countries it covers), networks, speed, supports_topup. Also the published rating.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"title": "get_plansArguments",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"title": "Slug"
}
}
}Remaining data and status of an eSIM we issued.
| Argument | Type | Description |
|---|---|---|
| iccid* | string |
{
"type": "object",
"title": "get_usageArguments",
"required": [
"iccid"
],
"properties": {
"iccid": {
"type": "string",
"title": "Iccid"
}
}
}The wallet behind the code: ref (a public handle for support), balance_usd, cashback_percent, the deposit rules that apply to it now (min_usd, max_usd, first, bonus tiers), the last 50 transactions, orders (with their tokens — the wallet is where a buyer's order links are kept) and deposits. Needs the wallet code.
No arguments.
{
"type": "object",
"title": "get_walletArguments",
"properties": {}
}Top-up plans that fit an eSIM we issued: plan_id, name, gb, days, retail. Order one with create_checkout(plan_id, topup_iccid=iccid) or, from a wallet, purchase_esim(plan_id, client_ref, topup_iccid=iccid).
| Argument | Type | Description |
|---|---|---|
| iccid* | string |
{
"type": "object",
"title": "list_topupsArguments",
"required": [
"iccid"
],
"properties": {
"iccid": {
"type": "string",
"title": "Iccid"
}
}
}Charge the wallet and issue an eSIM, no checkout. `client_ref` (1–64 chars) is your own reference for this purchase and makes the call idempotent: a retry with the same value returns the existing order without a second charge, so reuse it after a timeout and never invent a new one for the same purchase. `period_num` (1–365, default 7) only for daily_unlimited plans; the charge is price × days. `topup_iccid` with a plan_id from list_topups tops up an eSIM. Returns the order (status paid) with order_url; poll get_order(token) for ready and the activation code. A 402 is a short balance: create_deposit first. A wallet pays for at most 50 orders in 24 hours (429 beyond that; a retry answered from client_ref does not count). Needs the wallet code.
| Argument | Type | Description |
|---|---|---|
| lang | string | |
| any | ||
| plan_id* | integer | |
| client_ref* | string | |
| period_num | any | |
| topup_iccid | any |
{
"type": "object",
"title": "purchase_esimArguments",
"required": [
"plan_id",
"client_ref"
],
"properties": {
"lang": {
"type": "string",
"title": "Lang",
"default": "en"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email",
"default": null
},
"plan_id": {
"type": "integer",
"title": "Plan Id",
"maximum": 2147483647,
"minimum": 1
},
"client_ref": {
"type": "string",
"title": "Client Ref"
},
"period_num": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Period Num",
"default": null
},
"topup_iccid": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Topup Iccid",
"default": null
}
}
}Destinations on sale. `query` matches the name in any of 18 languages, the slug or the ISO code; empty lists everything. Each item: dest_code, slug, name, min_retail (USD, the cheapest fixed plan), unlimited_from (USD per day of a Daily Unlimited pass, or null), plan_count. Continue with get_plans(slug).
| Argument | Type | Description |
|---|---|---|
| query | string |
{
"type": "object",
"title": "search_destinationsArguments",
"properties": {
"query": {
"type": "string",
"title": "Query",
"default": ""
}
}
}