Skip to main content
Glama

Get eSIM plan details

get-plan
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
plan_idYesThe 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.
currencyNoOptional. 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.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe plan id (a 26-character ULID). Pass it to get-plan, get-plan-coverage or create-checkout-session. Never invent one.
nameYesPlan name as a traveller sees it, e.g. "Spain 5GB".
typeYesWhat the plan sells: data only, or data plus a bundled voice and SMS allowance.
linksYesWhere a person buys this plan on simfuse.app.
regionYesRaw region value for a regional plan, e.g. "Europe". Null for a country plan.
carrierYesThe mobile network this plan runs on, when we can name it. Null when we cannot.
countryYesThe one country this plan is filed under. Null for a regional or worldwide plan.
networkYesThe network name as plain text, or null when unknown.
currencyYesISO 4217 code retail_price_cents is quoted in, e.g. "EUR".
operatorsYesNetwork operators the plan roams on, as a list. Empty when none are published.
is_worldwideYesTrue when the plan is sold as a worldwide bundle.
network_typeYesFastest network generation the plan is sold as.
region_labelYesThe region formatted for a person to read. Null for a country plan.
coverage_typeYesScope of the plan: one country, a region, or worldwide.
validity_daysYesHow many days the plan stays valid once it activates.
coverage_countYesHow many countries coverage_countries holds.
data_amount_mbYesData allowance in megabytes (1 GB is 1024 MB). 0 on an unlimited plan, where data_usage_policy carries the real terms.
excluded_countYesHow many countries excluded_countries holds.
supports_topupYesWhether more data can be bought for the same eSIM once it runs low.
data_usage_policyYesWhat the plan really gives you. Null when the supplier has never published its terms, which is different from having no limits.
coverage_countriesYesEvery country the plan works in.
excluded_countriesYesCountries in this plan's own region that it does NOT cover. Always empty for a country plan and for a worldwide one.
retail_price_centsYesRetail price in minor units (cents) of `currency`, so 1250 in EUR is 12.50 EUR. This is what a buyer pays for one eSIM.
supports_tetheringYesWhether hotspot or tethering is allowed. Null means no supplier has declared it, which is not the same as "no".
retail_prices_centsNoPrices in other currencies, keyed by ISO 4217 code, in minor units. Only the multi-currency surfaces (the catalog export) carry one, so it is absent here: read retail_price_cents and currency instead.
data_restriction_typeYesWhether the allowance is capped ("limited") or unmetered ("unlimited").

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / currency / description
      Previous value: -"Three-letter currency code for the price (e.g. \"USD\", \"EUR\"). Defaults to EUR."New value: +"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."
    • addedInput schema / properties / currency / maxLength
      Added value: +3
    • addedInput schema / properties / currency / minLength
      Added value: +3
    • changedInput schema / properties / plan_id / description
      Previous value: -"The plan id (a ULID) as returned by list-plans."New value: +"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."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "carrier": {
      +      "description": "The mobile network this plan runs on, when we can name it. Null when we cannot.",
      +      "properties": {
      +        "logo_url": {
      +          "description": "Carrier logo image URL.",
      +          "type": "string"
      +        },
      +        "name": {
      +          "description": "Carrier name, e.g. \"KPN\".",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "logo_url"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "country": {
      +      "description": "The one country this plan is filed under. Null for a regional or worldwide plan.",
      +      "properties": {
      +        "currency": {
      +          "description": "ISO 4217 code the from_price_cents beside it is expressed in, which is the currency you asked for, e.g. \"EUR\". Null exactly when from_price_cents is null, which is what a country nested on a plan answers: nothing priced it there.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "from_price_cents": {
      +          "description": "Cheapest plan for this destination, in minor units (cents) of the response currency, so 1250 is 12.50. Null when this response did not price the destination.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "iso2": {
      +          "description": "ISO 3166-1 alpha-2 code, e.g. \"ES\". This is the code list-plans and plan-trip take.",
      +          "type": "string"
      +        },
      +        "iso3": {
      +          "description": "ISO 3166-1 alpha-3 code, e.g. \"ESP\".",
      +          "type": "string"
      +        },
      +        "links": {
      +          "properties": {
      +            "country": {
      +              "properties": {
      +                "path": {
      +                  "description": "Path on the storefront, e.g. \"/esim/es\".",
      +                  "type": "string"
      +                },
      +                "query": {
      +                  "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +                  "type": "object"
      +                },
      +                "url": {
      +                  "description": "The full storefront URL for this country's storefront page. Safe to show to a person.",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "path",
      +                "query",
      +                "url"
      +              ],
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "country"
      +          ],
      +          "type": "object"
      +        },
      +        "name": {
      +          "description": "English country name, e.g. \"Spain\".",
      +          "type": "string"
      +        },
      +        "region": {
      +          "description": "The region this country is filed under, e.g. \"Europe\". Null when it is filed under none.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "iso2",
      +        "iso3",
      +        "region",
      +        "from_price_cents",
      +        "currency",
      +        "links"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "coverage_count": {
      +      "description": "How many countries coverage_countries holds.",
      +      "type": "integer"
      +    },
      +    "coverage_countries": {
      +      "description": "Every country the plan works in.",
      +      "items": {
      +        "properties": {
      +          "iso2": {
      +            "description": "ISO 3166-1 alpha-2 code, or null for a country we could not match to a code.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "description": "English country name.",
      +            "type": "string"
      +          },
      +          "operators": {
      +            "description": "Networks in that country, when the country could be attributed. Empty means not attributed, never \"no coverage\".",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "iso2",
      +          "operators"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "coverage_type": {
      +      "description": "Scope of the plan: one country, a region, or worldwide.",
      +      "enum": [
      +        "country",
      +        "region",
      +        "global"
      +      ],
      +      "type": "string"
      +    },
      +    "currency": {
      +      "description": "ISO 4217 code retail_price_cents is quoted in, e.g. \"EUR\".",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "data_amount_mb": {
      +      "description": "Data allowance in megabytes (1 GB is 1024 MB). 0 on an unlimited plan, where data_usage_policy carries the real terms.",
      +      "type": "integer"
      +    },
      +    "data_restriction_type": {
      +      "description": "Whether the allowance is capped (\"limited\") or unmetered (\"unlimited\").",
      +      "enum": [
      +        "limited",
      +        "unlimited"
      +      ],
      +      "type": "string"
      +    },
      +    "data_usage_policy": {
      +      "description": "What the plan really gives you. Null when the supplier has never published its terms, which is different from having no limits.",
      +      "properties": {
      +        "high_speed_data_mb": {
      +          "description": "Full-speed allowance in megabytes PER RESET PERIOD, so 1 GB a day for 30 days is 1024, not 30720. 0 means genuinely uncapped.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "max_speed_kbps": {
      +          "description": "Speed ceiling in kbit/s from the first megabyte. Null means no ceiling.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "reduced_speed_kbps": {
      +          "description": "Speed in kbit/s after the full-speed allowance is used. Null means the data STOPS rather than slowing down.",
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "reset_period": {
      +          "description": "How often the full-speed allowance resets. Null means it covers the whole plan.",
      +          "enum": [
      +            "daily",
      +            "weekly",
      +            "monthly",
      +            null
      +          ],
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "high_speed_data_mb",
      +        "reset_period",
      +        "max_speed_kbps",
      +        "reduced_speed_kbps"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "excluded_count": {
      +      "description": "How many countries excluded_countries holds.",
      +      "type": "integer"
      +    },
      +    "excluded_countries": {
      +      "description": "Countries in this plan's own region that it does NOT cover. Always empty for a country plan and for a worldwide one.",
      +      "items": {
      +        "properties": {
      +          "iso2": {
      +            "description": "ISO 3166-1 alpha-2 code.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "description": "English country name.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "iso2"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "id": {
      +      "description": "The plan id (a 26-character ULID). Pass it to get-plan, get-plan-coverage or create-checkout-session. Never invent one.",
      +      "type": "string"
      +    },
      +    "is_worldwide": {
      +      "description": "True when the plan is sold as a worldwide bundle.",
      +      "type": "boolean"
      +    },
      +    "links": {
      +      "description": "Where a person buys this plan on simfuse.app.",
      +      "properties": {
      +        "country": {
      +          "description": "The country page on its own, or null when the plan has no single country.",
      +          "properties": {
      +            "path": {
      +              "description": "Path on the storefront, e.g. \"/esim/es\".",
      +              "type": "string"
      +            },
      +            "query": {
      +              "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +              "type": "object"
      +            },
      +            "url": {
      +              "description": "The full storefront URL for the plan's country page. Safe to show to a person.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "query",
      +            "url"
      +          ],
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "plan": {
      +          "properties": {
      +            "path": {
      +              "description": "Path on the storefront, e.g. \"/esim/es\".",
      +              "type": "string"
      +            },
      +            "query": {
      +              "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +              "type": "object"
      +            },
      +            "url": {
      +              "description": "The full storefront URL for the page this plan is bought on, with the plan preselected. Safe to show to a person.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "query",
      +            "url"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "plan",
      +        "country"
      +      ],
      +      "type": "object"
      +    },
      +    "name": {
      +      "description": "Plan name as a traveller sees it, e.g. \"Spain 5GB\".",
      +      "type": "string"
      +    },
      +    "network": {
      +      "description": "The network name as plain text, or null when unknown.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "network_type": {
      +      "description": "Fastest network generation the plan is sold as.",
      +      "enum": [
      +        "5G",
      +        "LTE"
      +      ],
      +      "type": "string"
      +    },
      +    "operators": {
      +      "description": "Network operators the plan roams on, as a list. Empty when none are published.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "region": {
      +      "description": "Raw region value for a regional plan, e.g. \"Europe\". Null for a country plan.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "region_label": {
      +      "description": "The region formatted for a person to read. Null for a country plan.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "retail_price_cents": {
      +      "description": "Retail price in minor units (cents) of `currency`, so 1250 in EUR is 12.50 EUR. This is what a buyer pays for one eSIM.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "retail_prices_cents": {
      +      "description": "Prices in other currencies, keyed by ISO 4217 code, in minor units. Only the multi-currency surfaces (the catalog export) carry one, so it is absent here: read retail_price_cents and currency instead.",
      +      "type": "object"
      +    },
      +    "supports_tethering": {
      +      "description": "Whether hotspot or tethering is allowed. Null means no supplier has declared it, which is not the same as \"no\".",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "supports_topup": {
      +      "description": "Whether more data can be bought for the same eSIM once it runs low.",
      +      "type": "boolean"
      +    },
      +    "type": {
      +      "description": "What the plan sells: data only, or data plus a bundled voice and SMS allowance.",
      +      "enum": [
      +        "data",
      +        "data_voice_sms"
      +      ],
      +      "type": "string"
      +    },
      +    "validity_days": {
      +      "description": "How many days the plan stays valid once it activates.",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "name",
      +    "carrier",
      +    "network",
      +    "operators",
      +    "data_amount_mb",
      +    "data_usage_policy",
      +    "validity_days",
      +    "type",
      +    "data_restriction_type",
      +    "coverage_type",
      +    "region",
      +    "region_label",
      +    "is_worldwide",
      +    "coverage_countries",
      +    "coverage_count",
      +    "excluded_countries",
      +    "excluded_count",
      +    "retail_price_cents",
      +    "currency",
      +    "supports_topup",
      +    "supports_tethering",
      +    "network_type",
      +    "country",
      +    "links"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The closing line ('reserves nothing and charges nothing') reinforces but does not materially extend that. It does usefully signal the fair-use-cap, hotspot, and top-up disclosure behavior, but the return format is left to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the list of returned facts, followed by usage guidance and the alternative. No sentence is filler; the id and currency behaviors are folded into the schema rather than repeated in prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose explanation, and the description still names the returned fields at a high level. With the id format, currency fallback, sibling alternative, and safety profile all covered, an agent has everything required to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the ULID format, the rejection of slugs/supplier codes, and the EUR fallback for unknown currency codes. The description only adds that the price is quoted 'in the currency you ask for', which is a marginal restatement of the currency parameter's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read everything about one eSIM plan by its id') and enumerates exactly which facts it returns. It is immediately distinguishable from list-plans, plan-trip, and get-plan-coverage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (answering a specific question about an already-found plan, confirming before buying) and names the sibling to use instead when the question is coverage: 'Ask get-plan-coverage instead when the question is which countries it works in.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources