changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "properties": {
+ "checkout": {
+ "description": "How to act on the recommendation.",
+ "properties": {
+ "checkout_sessions": {
+ "description": "HTTP endpoint that opens a checkout session, if you would rather not use the create-checkout-session tool.",
+ "type": "string"
+ },
+ "human_url": {
+ "description": "Where to send a person to buy this themselves.",
+ "type": "string"
+ },
+ "items": {
+ "description": "The recommended option as checkout line items, ready to pass to create-checkout-session. Null when nothing covers the trip.",
+ "items": {
+ "properties": {
+ "id": {
+ "description": "Plan id.",
+ "type": "string"
+ },
+ "quantity": {
+ "description": "How many to buy.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "id",
+ "quantity"
+ ],
+ "type": "object"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "note": {
+ "description": "What the totals are and are not: catalog prices today, never a reservation.",
+ "type": "string"
+ },
+ "register": {
+ "description": "HTTP endpoint that mints an agent key for that API.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "items",
+ "checkout_sessions",
+ "register",
+ "human_url",
+ "note"
+ ],
+ "type": "object"
+ },
+ "contract": {
+ "description": "Version of this answer's shape. \"1\" today; it only changes when an existing field changes meaning.",
+ "type": "string"
+ },
+ "currency": {
+ "description": "ISO 4217 code every amount below is quoted in, e.g. \"EUR\".",
+ "type": "string"
+ },
+ "options": {
+ "description": "Every way of buying the trip that we could price, cheapest-first within each strategy. Empty when nothing we sell covers it.",
+ "items": {
+ "properties": {
+ "complete": {
+ "description": "True when this option covers every stop. False means at least one stop is left without data.",
+ "type": "boolean"
+ },
+ "esims": {
+ "description": "How many eSIMs the traveller installs under this option.",
+ "type": "integer"
+ },
+ "items": {
+ "description": "The plans this option buys.",
+ "items": {
+ "properties": {
+ "covers": {
+ "description": "ISO 3166-1 alpha-2 codes of the stops this line covers.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "data": {
+ "description": "Allowance written for a person, e.g. \"5 GB\" or \"Unlimited\".",
+ "type": "string"
+ },
+ "data_mb": {
+ "description": "Allowance in megabytes. 0 on an unlimited plan, where `policy` carries the real terms.",
+ "type": [
+ "integer",
+ "null"
+ ]
+ },
+ "name": {
+ "description": "Plan name as a traveller sees it.",
+ "type": "string"
+ },
+ "package_id": {
+ "description": "The plan id to buy. Pass it to create-checkout-session or get-plan.",
+ "type": "string"
+ },
+ "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"
+ ]
+ },
+ "price": {
+ "description": "The same price formatted for a person.",
+ "type": "string"
+ },
+ "price_cents": {
+ "description": "Price for one of this plan, in minor units (cents) of the response currency.",
+ "type": "integer"
+ },
+ "quantity": {
+ "description": "How many of this plan to buy.",
+ "type": "integer"
+ },
+ "unlimited": {
+ "description": "True when the plan is sold as unlimited, which almost always means unlimited up to a fair-use cap.",
+ "type": "boolean"
+ },
+ "validity_days": {
+ "description": "How many days the plan stays valid once it activates.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "package_id",
+ "name",
+ "covers",
+ "quantity",
+ "data",
+ "data_mb",
+ "unlimited",
+ "validity_days",
+ "policy",
+ "price_cents",
+ "price"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "purchasable": {
+ "description": "False when the option needs more eSIMs than one order can carry.",
+ "type": "boolean"
+ },
+ "recommended": {
+ "description": "True on the one option this answer recommends.",
+ "type": "boolean"
+ },
+ "saves_cents": {
+ "description": "What this option saves against the next cheapest complete alternative, in minor units. 0 when there is none or when it is dearer.",
+ "type": "integer"
+ },
+ "strategy": {
+ "description": "How this option buys the trip.",
+ "enum": [
+ "single",
+ "per_country",
+ "mixed"
+ ],
+ "type": "string"
+ },
+ "total": {
+ "description": "The same total formatted for a person, e.g. \"24.50 EUR\".",
+ "type": "string"
+ },
+ "total_cents": {
+ "description": "Total price in minor units (cents) of the response currency, so 2450 is 24.50.",
+ "type": "integer"
+ },
+ "warnings": {
+ "description": "What this option does not do: a stop it leaves uncovered, a plan that runs out or expires early. Empty when there is nothing to say.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "strategy",
+ "recommended",
+ "esims",
+ "total_cents",
+ "total",
+ "complete",
+ "purchasable",
+ "saves_cents",
+ "items",
+ "warnings"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "planner_url": {
+ "description": "The same trip on the SimFuse website, for a person who wants to finish it themselves.",
+ "type": "string"
+ },
+ "reason": {
+ "description": "One sentence explaining the recommendation, written to be quoted to the traveller verbatim.",
+ "type": "string"
+ },
+ "recommendation": {
+ "description": "Which strategy won: one plan for the whole route, one plan per country, or a mix. Null when nothing we sell covers the trip.",
+ "enum": [
+ "single",
+ "per_country",
+ "mixed"
+ ],
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "trip": {
+ "description": "The trip as it was understood, which is worth reading back to the traveller.",
+ "properties": {
+ "end": {
+ "description": "Last day of the trip, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "span_days": {
+ "description": "Total days from arrival at the first stop to departure from the last.",
+ "type": "integer"
+ },
+ "start": {
+ "description": "First day of the trip, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "stops": {
+ "description": "The stops, in travel order, with their dates and data estimates.",
+ "items": {
+ "properties": {
+ "arrive": {
+ "description": "Arrival date, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "country": {
+ "description": "ISO 3166-1 alpha-2 code of the stop.",
+ "type": "string"
+ },
+ "depart": {
+ "description": "Departure date, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "estimated_data": {
+ "description": "The same estimate written for a person, e.g. \"3.9 GB\".",
+ "type": "string"
+ },
+ "estimated_mb": {
+ "description": "Data this stop is estimated to need, in megabytes (1 GB is 1024 MB).",
+ "type": "integer"
+ },
+ "nights": {
+ "description": "Days spent at this stop.",
+ "type": "integer"
+ },
+ "usage": {
+ "description": "The data appetite used for this stop.",
+ "enum": [
+ "light",
+ "regular",
+ "heavy"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "country",
+ "nights",
+ "usage",
+ "arrive",
+ "depart",
+ "estimated_mb",
+ "estimated_data"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "token": {
+ "description": "Compact encoding of the trip, for the planner_url link.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "token",
+ "start",
+ "end",
+ "span_days",
+ "stops"
+ ],
+ "type": "object"
+ },
+ "warnings": {
+ "description": "Trip-level caveats: a country SimFuse does not sell, or a gap the recommended option leaves. Say these out loud rather than dropping them.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "contract",
+ "currency",
+ "trip",
+ "recommendation",
+ "reason",
+ "options",
+ "warnings",
+ "planner_url",
+ "checkout"
+ ],
+ "type": "object"
+}