Travel eSIMs for 200+ countries. Browse plans, price a multi-country trip, and open a checkout.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
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.
Build an eSIM plan to the traveller's liking for one destination: how much data, for how many days, optionally which network it runs on and whether calls and texts are bundled. Returns the one real plan that matches, with its id and live price, never a made-up combination: a shape nobody sells is snapped to the nearest one that is, one axis at a time, and every change is spelled out in `adjustments` so you can read it back. Use it when the traveller knows what they want ("10 GB on Docomo for two weeks"); use plan-trip when they want a recommendation or the trip has several countries. To buy, pass `plan.id` to get-checkout-link when a person is paying, or to create-checkout-session when you are. Read-only: it reserves nothing and charges nothing.
Data allowance wanted, in megabytes: 1 GB is 1024 MB, so 5 GB is 5120. Pass 0 for an unlimited plan. Snapped to the nearest size sold when no plan has exactly this size.
ISO 3166-1 alpha-2 code of the destination, e.g. "JP". Look it up with list-destinations rather than guessing.
How many days the plan should stay valid, 1 to 365. Snapped to the nearest length sold for the chosen size.
Optional. True to require a plan that bundles calls and texts. Defaults to false, data only. If no such plan exists the answer is data only and says so.
Optional. The mobile network the plan should run on, by carrier name as `options.networks` lists them, e.g. "NTT Docomo" or "au". Matching is case-insensitive and a single carrier of a multi-network plan is enough. Omit for the cheapest network.
Optional. ISO 4217 three-letter code the price is quoted in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http esim-storefront https://simfuse.app/agentic/mcp
Build an eSIM plan to the traveller's liking for one destination: how much data, for how many days, optionally which network it runs on and whether calls and texts are bundled. Returns the one real plan that matches, with its id and live price, never a made-up combination: a shape nobody sells is snapped to the nearest one that is, one axis at a time, and every change is spelled out in `adjustments` so you can read it back. Use it when the traveller knows what they want ("10 GB on Docomo for two weeks"); use plan-trip when they want a recommendation or the trip has several countries. To buy, pass `plan.id` to get-checkout-link when a person is paying, or to create-checkout-session when you are. Read-only: it reserves nothing and charges nothing.
| Argument | Type | Description |
|---|---|---|
| voice | boolean | Optional. True to require a plan that bundles calls and texts. Defaults to false, data only. If no such plan exists the answer is data only and says so. |
| data_mb* | integer | Data allowance wanted, in megabytes: 1 GB is 1024 MB, so 5 GB is 5120. Pass 0 for an unlimited plan. Snapped to the nearest size sold when no plan has exactly this size. |
| network | string | Optional. The mobile network the plan should run on, by carrier name as `options.networks` lists them, e.g. "NTT Docomo" or "au". Matching is case-insensitive and a single carrier of a multi-network plan is enough. Omit for the cheapest network. |
| currency | string | Optional. ISO 4217 three-letter code the price is quoted in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing. |
| country_code* | string | ISO 3166-1 alpha-2 code of the destination, e.g. "JP". Look it up with list-destinations rather than guessing. |
| validity_days* | integer | How many days the plan should stay valid, 1 to 365. Snapped to the nearest length sold for the chosen size. |
{
"type": "object",
"required": [
"country_code",
"data_mb",
"validity_days"
],
"properties": {
"voice": {
"type": "boolean",
"default": false,
"description": "Optional. True to require a plan that bundles calls and texts. Defaults to false, data only. If no such plan exists the answer is data only and says so."
},
"data_mb": {
"type": "integer",
"minimum": 0,
"description": "Data allowance wanted, in megabytes: 1 GB is 1024 MB, so 5 GB is 5120. Pass 0 for an unlimited plan. Snapped to the nearest size sold when no plan has exactly this size."
},
"network": {
"type": "string",
"description": "Optional. The mobile network the plan should run on, by carrier name as `options.networks` lists them, e.g. \"NTT Docomo\" or \"au\". Matching is case-insensitive and a single carrier of a multi-network plan is enough. Omit for the cheapest network."
},
"currency": {
"type": "string",
"description": "Optional. ISO 4217 three-letter code the price is quoted in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "ISO 3166-1 alpha-2 code of the destination, e.g. \"JP\". Look it up with list-destinations rather than guessing."
},
"validity_days": {
"type": "integer",
"maximum": 365,
"minimum": 1,
"description": "How many days the plan should stay valid, 1 to 365. Snapped to the nearest length sold for the chosen size."
}
}
}Answer "does this eSIM plan work in X?" for one destination, as a yes or no rather than a country list. Takes a plan id and a destination (a country name or two-letter code). Reports whether the destination is covered, and separately whether it is explicitly excluded from an otherwise regional plan. Use get-plan-coverage when you need the full list of countries instead.
| Argument | Type | Description |
|---|---|---|
| plan_id* | string | The plan id (a ULID) as returned by list-plans. |
| destination* | string | The country to check: a name ("Japan") or a two-letter code ("JP"). |
{
"type": "object",
"required": [
"plan_id",
"destination"
],
"properties": {
"plan_id": {
"type": "string",
"description": "The plan id (a ULID) as returned by list-plans."
},
"destination": {
"type": "string",
"description": "The country to check: a name (\"Japan\") or a two-letter code (\"JP\")."
}
}
}How much data an eSIM has used and how much is left, for one eSIM on a paid order. Identified by the order id and the email that bought it, plus the ICCID from get-order-status or get-esim-activation. Allowances are in megabytes. Readings are served from a cache refreshed every couple of minutes: checked_at says when the reading was taken. An unlimited plan reports its full-speed allowance for the current period rather than a total.
| Argument | Type | Description |
|---|---|---|
| email* | string | The email address the order was bought with. |
| iccid* | string | The ICCID of the eSIM to read, as returned by get-order-status. |
| order_id* | string | The order id from the buyer's confirmation email or order page. |
{
"type": "object",
"required": [
"order_id",
"email",
"iccid"
],
"properties": {
"email": {
"type": "string",
"description": "The email address the order was bought with."
},
"iccid": {
"type": "string",
"description": "The ICCID of the eSIM to read, as returned by get-order-status."
},
"order_id": {
"type": "string",
"description": "The order id from the buyer's confirmation email or order page."
}
}
}Open a checkout session for one or more eSIM plans at frozen prices, using the plan ids that plan-trip, list-plans or get-plan returned. Use it once the traveller has chosen what to buy. It CHARGES NOTHING and reserves no stock: it prices the basket, freezes those prices until the session's price_locked_until, and hands back the session plus a bearer agent key. Payment, completion and cancellation happen afterwards over the SimFuse agentic HTTP API with that key, as the session's `note` explains, and the eSIM is delivered by email once payment settles. Each call opens a NEW session and mints a NEW key, so call it once per basket rather than retrying it to re-read one.
| Argument | Type | Description |
|---|---|---|
| items* | array | What to buy: one entry per plan, 1 to 50 entries. Pass the whole basket in one call, e.g. [{"id":"01JVQ...","quantity":1}]. |
| currency | string | Optional. ISO 4217 three-letter code to price the session in, e.g. "USD", "EUR", "GBP". Defaults to EUR. Every amount in the answer is minor units (cents) of this currency. |
| agent_name | string | Optional. Name of the assistant or app opening the session, e.g. "Claude". Recorded on the agent key so we can tell integrations apart. Defaults to "mcp-client". |
| buyer_email | string | Optional but strongly recommended. The traveller's email address, where the eSIM and its installation details are sent once payment settles. Ask for it rather than inventing one. |
{
"type": "object",
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"quantity"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"description": "A plan id (26-character ULID) from plan-trip, list-plans, get-plan or the product feed, e.g. \"01JVQ2S6D4X8N0RMB7YQZ5K3TA\". Never invent one."
},
"quantity": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "How many of this plan to buy, 1 to 20. One eSIM per unit, so 2 means two separate eSIMs of the same plan (one traveller normally needs 1)."
}
}
},
"maxItems": 50,
"minItems": 1,
"description": "What to buy: one entry per plan, 1 to 50 entries. Pass the whole basket in one call, e.g. [{\"id\":\"01JVQ...\",\"quantity\":1}]."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 three-letter code to price the session in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. Every amount in the answer is minor units (cents) of this currency."
},
"agent_name": {
"type": "string",
"maxLength": 100,
"description": "Optional. Name of the assistant or app opening the session, e.g. \"Claude\". Recorded on the agent key so we can tell integrations apart. Defaults to \"mcp-client\"."
},
"buyer_email": {
"type": "string",
"maxLength": 255,
"description": "Optional but strongly recommended. The traveller's email address, where the eSIM and its installation details are sent once payment settles. Ask for it rather than inventing one."
}
}
}Get the page where a person buys one specific eSIM plan, for an assistant to hand them a link. The page sells exactly this plan with Apple Pay, Google Pay and card, takes the email at payment, and sends the eSIM there. Nothing is charged or reserved by this call and the buyer needs no account. Use this whenever a PERSON is going to pay. Use create-checkout-session instead when the agent is settling the purchase itself, or for more than one plan or unit.
| Argument | Type | Description |
|---|---|---|
| source | string | The name of the assistant or app sending the buyer, recorded as the campaign source on the link (e.g. "claude"). Optional. |
| plan_id* | string | The plan id (a ULID) as returned by list-plans, get-plan or plan-trip. |
| currency | string | Three-letter currency code for the price quoted back to you (e.g. "USD", "EUR"). Defaults to EUR. The page itself prices in the buyer's own currency. |
{
"type": "object",
"required": [
"plan_id"
],
"properties": {
"source": {
"type": "string",
"description": "The name of the assistant or app sending the buyer, recorded as the campaign source on the link (e.g. \"claude\"). Optional."
},
"plan_id": {
"type": "string",
"description": "The plan id (a ULID) as returned by list-plans, get-plan or plan-trip."
},
"currency": {
"type": "string",
"description": "Three-letter currency code for the price quoted back to you (e.g. \"USD\", \"EUR\"). Defaults to EUR. The page itself prices in the buyer's own currency."
}
}
}Details for one destination: its name and codes, region, how many eSIM plans are sold there, the cheapest and most expensive, the smallest and largest data bundles, and its storefront page. Takes a country name ("Japan") or two-letter code ("JP"). Use this to describe a destination before pulling its full plan ladder with list-plans. Whether a plan can be topped up varies by plan and is reported by list-plans, not here.
| Argument | Type | Description |
|---|---|---|
| currency | string | Three-letter currency code for the prices (e.g. "USD", "EUR"). Defaults to EUR. |
| destination* | string | The destination: a country name ("Japan") or a two-letter code ("JP"). |
{
"type": "object",
"required": [
"destination"
],
"properties": {
"currency": {
"type": "string",
"description": "Three-letter currency code for the prices (e.g. \"USD\", \"EUR\"). Defaults to EUR."
},
"destination": {
"type": "string",
"description": "The destination: a country name (\"Japan\") or a two-letter code (\"JP\")."
}
}
}Fetch the installable eSIM(s) for a paid order: the QR code image, the LPA activation string, the SM-DP+ address and activation code for manual entry, one-tap install links for iPhone and Android, and a hosted install page to send the buyer. Identified by the order id together with the email that bought it. Returns an empty esims list while provisioning is still in flight, which normally clears within a minute of payment.
| Argument | Type | Description |
|---|---|---|
| email* | string | The email address the order was bought with. Required: the order id alone does not identify a buyer. |
| order_id* | string | The order id from the buyer's confirmation email or order page. |
{
"type": "object",
"required": [
"order_id",
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address the order was bought with. Required: the order id alone does not identify a buyer."
},
"order_id": {
"type": "string",
"description": "The order id from the buyer's confirmation email or order page."
}
}
}Check an eSIM order after payment: whether it completed and whether its eSIMs have been provisioned yet. Identified by the order id together with the email that bought it, both of which are on the buyer's confirmation email. Provisioning usually finishes within a minute of payment, so an order that is paid but lists no eSIMs yet is normal: check again shortly. Once an eSIM is listed, use get-esim-activation to fetch its QR code and install details.
| Argument | Type | Description |
|---|---|---|
| email* | string | The email address the order was bought with. Required: the order id alone does not identify a buyer. |
| order_id* | string | The order id from the buyer's confirmation email or order page. |
{
"type": "object",
"required": [
"order_id",
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address the order was bought with. Required: the order id alone does not identify a buyer."
},
"order_id": {
"type": "string",
"description": "The order id from the buyer's confirmation email or order page."
}
}
}Read everything about one eSIM plan by its id: data allowance, how long it stays valid, what happens after a fair-use cap, whether hotspot and top-ups are supported, the network it runs on, and the retail price in the currency you ask for. Use it to answer a specific question about a plan already found with list-plans or plan-trip, and before buying, to confirm the plan really matches what the traveller asked for. Ask get-plan-coverage instead when the question is which countries it works in. Read-only: it reserves nothing and charges nothing.
| Argument | Type | Description |
|---|---|---|
| plan_id* | string | The plan id: a 26-character ULID as returned by list-plans or plan-trip, e.g. "01JVQ2S6D4X8N0RMB7YQZ5K3TA". Slugs and supplier codes are not accepted, and an id must never be invented. |
| currency | string | Optional. ISO 4217 three-letter code the price is quoted in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing. |
{
"type": "object",
"required": [
"plan_id"
],
"properties": {
"plan_id": {
"type": "string",
"description": "The plan id: a 26-character ULID as returned by list-plans or plan-trip, e.g. \"01JVQ2S6D4X8N0RMB7YQZ5K3TA\". Slugs and supplier codes are not accepted, and an id must never be invented."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 three-letter code the price is quoted in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
}
}
}List every country one eSIM plan works in, plus any country of its own region that it leaves out. Use it to answer "does this plan also cover Austria?" for a regional or worldwide plan, where the plan name says a region and the traveller needs the actual list. For a single-country plan the answer is that one country. Ask get-plan instead for the data allowance, validity or price. Read-only.
| Argument | Type | Description |
|---|---|---|
| plan_id* | string | The plan id: a 26-character ULID as returned by list-plans or plan-trip, e.g. "01JVQ2S6D4X8N0RMB7YQZ5K3TA". Slugs and supplier codes are not accepted, and an id must never be invented. |
{
"type": "object",
"required": [
"plan_id"
],
"properties": {
"plan_id": {
"type": "string",
"description": "The plan id: a 26-character ULID as returned by list-plans or plan-trip, e.g. \"01JVQ2S6D4X8N0RMB7YQZ5K3TA\". Slugs and supplier codes are not accepted, and an id must never be invented."
}
}
}Find the countries SimFuse sells eSIMs for, with the cheapest plan price ("from" price) for each in the currency you ask for. Start here when someone names a place: it turns "Portugal" into the two-letter country code the other tools take, and shows what that destination starts at. For one destination, follow it with list-plans; for a trip covering two or more countries, use plan-trip instead. Read-only, and it answers from the SimFuse catalog alone.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. Maximum destinations to return, 1 to 300. Defaults to 300, which is the whole list. |
| search | string | Optional. Match destinations by name, ISO 3166-1 alpha-2 or alpha-3 code, case-insensitively. A partial name works: "port" matches Portugal. Omit to list every destination. |
| currency | string | Optional. ISO 4217 three-letter code the "from" prices are quoted in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 300,
"minimum": 1,
"description": "Optional. Maximum destinations to return, 1 to 300. Defaults to 300, which is the whole list."
},
"search": {
"type": "string",
"maxLength": 100,
"description": "Optional. Match destinations by name, ISO 3166-1 alpha-2 or alpha-3 code, case-insensitively. A partial name works: \"port\" matches Portugal. Omit to list every destination."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 three-letter code the \"from\" prices are quoted in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
}
}
}Show the eSIM plans on sale for one country or region, or search the whole catalog, narrowing by data allowance, validity and price. Use destination with a country code from list-destinations, or region with a slug from list-regions; never both. Use it when the traveller wants to compare what is available or find a plan inside a budget. Prices are live retail prices in the currency you ask for. For a trip covering two or more countries, use plan-trip first: it compares one plan for the whole route against one plan per country and picks the cheapest complete answer. Pass a plan id from here to get-plan, get-plan-coverage or create-checkout-session. Read-only, and it answers from the SimFuse catalog alone.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. Maximum plans to return, 1 to 100. Defaults to 25. |
| region | string | Optional. Canonical region slug, e.g. "europe", "southeast-asia" or "global", to search that regional shelf. Cannot be combined with destination. Unknown regions return no plans. |
| currency | string | Optional. ISO 4217 three-letter code prices are quoted and filtered in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing. |
| destination | string | Optional. ISO 3166-1 alpha-2 destination country code, e.g. "US", "GB", "DE". Look it up with list-destinations rather than guessing. Cannot be combined with region. Omit both destination and region to search the whole catalog. |
| max_price_cents | integer |
Discover available eSIM regions, including worldwide scopes, with their canonical slugs, display names, member countries and starting prices. Only published regions with active displayed regional plans are listed. Pass a returned region slug to list-plans as region, not destination. Country membership describes the region, not a promise that every plan covers every member: check get-plan-coverage for a specific plan. Read-only; no account or key is needed.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional. Maximum regions to return, 1 to 300. Defaults to 300. total reports the match count before this limit. |
| search | string | Optional. Case-insensitive partial match on the canonical region slug or display name, e.g. "asia". Omit to list all available regions. |
| currency | string | Optional. ISO 4217 code for starting prices, e.g. "EUR" or "USD". Defaults to EUR; unknown codes fall back to the base currency. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 300,
"minimum": 1,
"description": "Optional. Maximum regions to return, 1 to 300. Defaults to 300. total reports the match count before this limit."
},
"search": {
"type": "string",
"maxLength": 100,
"description": "Optional. Case-insensitive partial match on the canonical region slug or display name, e.g. \"asia\". Omit to list all available regions."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 code for starting prices, e.g. \"EUR\" or \"USD\". Defaults to EUR; unknown codes fall back to the base currency."
}
}
}Data top-ups that can be added to an eSIM the buyer already has, narrowed to what its network will actually accept. Identified by the order id and the email that bought it, plus the ICCID. Read-only: a top-up is bought in the SimFuse app, not through this server, and the response carries the link that opens this eSIM there. Do not pass these package ids to create-checkout-session, which would buy a separate new eSIM rather than add data to this one.
| Argument | Type | Description |
|---|---|---|
| email* | string | The email address the order was bought with. |
| iccid* | string | The ICCID of the eSIM to top up, as returned by get-order-status. |
| currency | string | Three-letter currency code for the prices (e.g. "USD", "EUR"). Defaults to EUR. |
| order_id* | string | The order id from the buyer's confirmation email or order page. |
{
"type": "object",
"required": [
"order_id",
"email",
"iccid"
],
"properties": {
"email": {
"type": "string",
"description": "The email address the order was bought with."
},
"iccid": {
"type": "string",
"description": "The ICCID of the eSIM to top up, as returned by get-order-status."
},
"currency": {
"type": "string",
"description": "Three-letter currency code for the prices (e.g. \"USD\", \"EUR\"). Defaults to EUR."
},
"order_id": {
"type": "string",
"description": "The order id from the buyer's confirmation email or order page."
}
}
}Answer "which eSIM should I buy for this trip?". Give it the stops, a country code and the days spent in each, and it compares one plan covering the whole route against one plan per country against a mix of the two, on live prices, then flags the cheapest option that covers everything and explains the choice in a sentence you can quote. It also estimates the data each stop needs, names any country SimFuse cannot cover, and returns package ids that go straight into create-checkout-session. Use it whenever a trip has two or more countries, and for a single country when the traveller wants a recommendation rather than a list. Read-only: nothing is reserved and nothing is charged, and the totals are today's catalog prices, not a quote held for later.
| Argument | Type | Description |
|---|---|---|
| start | string | Optional. Departure date as YYYY-MM-DD, e.g. "2026-04-18". Only used to date the stops in the answer; it does not change prices. Defaults to today. |
| stops* | array | The trip, one entry per country, in travel order. 1 to 12 stops, e.g. [{"country":"JP","days":7},{"country":"KR","days":5}]. |
| usage | string | Optional. Trip-wide data usage for stops that do not set their own: "light" (about 300 MB a day), "regular" (about 800 MB a day) or "heavy" (about 2 GB a day). Defaults to "regular". |
| currency | string | Optional. ISO 4217 three-letter code every price is quoted in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.
| Optional. Only plans at or below this retail price, in minor units (cents) of `currency`: 2500 is 25.00. |
| min_price_cents | integer | Optional. Only plans at or above this retail price, in minor units (cents) of `currency`: 500 is 5.00. |
| max_validity_days | integer | Optional. Only plans valid for at most this many days. |
| min_validity_days | integer | Optional. Only plans valid for at least this many days, e.g. 14 for a two-week trip. |
| max_data_amount_mb | integer | Optional. Only plans with at most this much data, in megabytes. |
| min_data_amount_mb | integer | Optional. Only plans with at least this much data, in MEGABYTES: 1 GB is 1024, 10 GB is 10240. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Optional. Maximum plans to return, 1 to 100. Defaults to 25."
},
"region": {
"type": "string",
"pattern": "^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$",
"maxLength": 100,
"minLength": 1,
"description": "Optional. Canonical region slug, e.g. \"europe\", \"southeast-asia\" or \"global\", to search that regional shelf. Cannot be combined with destination. Unknown regions return no plans."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 three-letter code prices are quoted and filtered in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
},
"destination": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "Optional. ISO 3166-1 alpha-2 destination country code, e.g. \"US\", \"GB\", \"DE\". Look it up with list-destinations rather than guessing. Cannot be combined with region. Omit both destination and region to search the whole catalog."
},
"max_price_cents": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans at or below this retail price, in minor units (cents) of `currency`: 2500 is 25.00."
},
"min_price_cents": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans at or above this retail price, in minor units (cents) of `currency`: 500 is 5.00."
},
"max_validity_days": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans valid for at most this many days."
},
"min_validity_days": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans valid for at least this many days, e.g. 14 for a two-week trip."
},
"max_data_amount_mb": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans with at most this much data, in megabytes."
},
"min_data_amount_mb": {
"type": "integer",
"minimum": 0,
"description": "Optional. Only plans with at least this much data, in MEGABYTES: 1 GB is 1024, 10 GB is 10240."
}
}
}{
"type": "object",
"required": [
"stops"
],
"properties": {
"start": {
"type": "string",
"maxLength": 10,
"minLength": 10,
"description": "Optional. Departure date as YYYY-MM-DD, e.g. \"2026-04-18\". Only used to date the stops in the answer; it does not change prices. Defaults to today."
},
"stops": {
"type": "array",
"items": {
"type": "object",
"required": [
"country",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 365,
"minimum": 1,
"description": "Days spent in that country, 1 to 365. Count the nights of the stay."
},
"usage": {
"enum": [
"light",
"regular",
"heavy"
],
"type": "string",
"description": "Optional. How heavily data is used during this stop: \"light\" (about 300 MB a day, maps and messaging), \"regular\" (about 800 MB a day) or \"heavy\" (about 2 GB a day, video and hotspot). Overrides the trip-wide `usage` for this stop only."
},
"country": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. \"JP\" for Japan. Look one up with list-destinations rather than guessing. Each country may appear once: give one stop with the total days rather than two visits."
}
}
},
"maxItems": 12,
"minItems": 1,
"description": "The trip, one entry per country, in travel order. 1 to 12 stops, e.g. [{\"country\":\"JP\",\"days\":7},{\"country\":\"KR\",\"days\":5}]."
},
"usage": {
"enum": [
"light",
"regular",
"heavy"
],
"type": "string",
"default": "regular",
"description": "Optional. Trip-wide data usage for stops that do not set their own: \"light\" (about 300 MB a day), \"regular\" (about 800 MB a day) or \"heavy\" (about 2 GB a day). Defaults to \"regular\"."
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3,
"description": "Optional. ISO 4217 three-letter code every price is quoted in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
}
}
}