changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "properties": {
+ "currency": {
+ "description": "ISO 4217 code every price below is quoted in, e.g. \"EUR\".",
+ "type": "string"
+ },
+ "matched": {
+ "description": "How many plans matched the filters, before `limit` was applied.",
+ "type": "integer"
+ },
+ "plans": {
+ "description": "The matching plans. Empty when nothing matched.",
+ "items": {
+ "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"
+ },
+ "type": "array"
+ },
+ "returned": {
+ "description": "How many plans are in this response.",
+ "type": "integer"
+ },
+ "truncated_by_candidate_cap": {
+ "description": "True when a catalog-wide search hit its internal candidate cap, so there are further matches this call could not see. Narrow it with a destination or a tighter data or validity filter rather than assuming you have seen everything.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "matched",
+ "returned",
+ "currency",
+ "truncated_by_candidate_cap",
+ "plans"
+ ],
+ "type": "object"
+}