Raw schema
{
"type": "object",
"properties": {
"command": {
"type": "string",
"enum": [
"setup",
"search",
"purchase",
"propose",
"status",
"checkout",
"reconcile",
"address",
"credentials"
],
"description": "Use `search` to find an item with OneSearch, `purchase` to buy an authorized item, and `status` to track it."
},
"query": {
"type": "string",
"description": "Describe the product, variant, budget and preferred store if any. `search` uses OneSearch to find matching items and merchant pages (5¢)."
},
"item": {
"type": "string",
"description": "What exactly is being bought, in the user's words — variant, size, quantity (`purchase`, `propose`)."
},
"merchant": {
"type": "string",
"description": "Merchant host or URL, e.g. bombas.com (`purchase`, `propose`, `credentials`)."
},
"retry_of": {
"type": "string",
"format": "uuid",
"description": "For propose only: the previous approval ID resolved by the owner as no order/payment. Use only when the user requests a new attempt; omit confirmed and show the fresh approval link. Never vary item text or confirmation to bypass replay or locks."
},
"store_connection_id": {
"type": "string",
"description": "Merchant account connection ID from /store-connections. Required when multiple accounts are connected to the same store. Sign in and enter verification codes directly on that page, never in chat."
},
"booking": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "flight"
},
"travelers": {
"type": "integer",
"minimum": 1,
"maximum": 9
},
"segments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"origin": {
"type": "string",
"pattern": "^[A-Z]{3}$"
},
"destination": {
"type": "string",
"pattern": "^[A-Z]{3}$"
},
"departureDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"departureTime": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"flightNumber": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"cabin": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"fare": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
}
},
"required": [
"origin",
"destination",
"departureDate",
"departureTime",
"flightNumber",
"cabin",
"fare"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 8
},
"baggage": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"changeCancellationTerms": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
}
},
"required": [
"kind",
"travelers",
"segments",
"baggage",
"changeCancellationTerms"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "hotel"
},
"property": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"address": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"checkIn": {
"$ref": "#/anyOf/0/properties/segments/items/properties/departureDate"
},
"checkOut": {
"$ref": "#/anyOf/0/properties/segments/items/properties/departureDate"
},
"rooms": {
"type": "integer",
"minimum": 1,
"maximum": 9
},
"adults": {
"type": "integer",
"minimum": 1,
"maximum": 30
},
"children": {
"type": "integer",
"minimum": 0,
"maximum": 30
},
"roomType": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"ratePlan": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"cancellationTerms": {
"$ref": "#/anyOf/0/properties/segments/items/properties/flightNumber"
},
"paymentTiming": {
"type": "string",
"enum": [
"pay_now",
"pay_at_property",
"deposit"
]
},
"mandatoryFeesCents": {
"type": "integer",
"minimum": 0
}
},
"required": [
"kind",
"property",
"address",
"checkIn",
"checkOut",
"rooms",
"adults",
"children",
"roomType",
"ratePlan",
"cancellationTerms",
"paymentTiming",
"mandatoryFeesCents"
],
"additionalProperties": false
}
],
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Required for Expedia flights and Booking.com hotels: exact itinerary/stay, counts, fare/room, baggage/cancellation and payment terms. These are shown for approval and cannot be substituted. Traveler identity documents are entered directly on the merchant page, never in chat. Final booking review requires the authenticated handoff page."
},
"total_cents": {
"type": "number",
"description": "The full total the user will pay, in cents (`purchase`, `propose`)."
},
"currency": {
"type": "string",
"description": "ISO currency, default 'usd'."
},
"url": {
"type": "string",
"description": "The exact product page the item came from — the driver starts there (`purchase`, `propose`)."
},
"notes": {
"type": "string",
"description": "One line for the driver/user: variant, size, colour, quantity, delivery window."
},
"confirmed": {
"type": "boolean",
"description": "true when the user has said yes to this exact item and total in the conversation (`purchase`, `propose`)."
},
"confirmation": {
"type": "string",
"description": "The user's own words approving it, verbatim (`purchase`, `propose`)."
},
"approval_id": {
"type": "string",
"description": "The approval returned by purchase/propose (`status`, `checkout`)."
},
"params": {
"type": "object",
"description": "The merchant's own purchase body (product id, quantity, email, shipping) for a protocol merchant (`purchase`, `checkout`).",
"additionalProperties": true
},
"name": {
"type": "string",
"description": "Full name for shipping (`address`)."
},
"line1": {
"type": "string",
"description": "Street address (`address`)."
},
"line2": {
"type": "string",
"description": "Apartment / unit (`address`)."
},
"city": {
"type": "string",
"description": "City (`address`)."
},
"state": {
"type": "string",
"description": "State / region (`address`)."
},
"postal_code": {
"type": "string",
"description": "Postal / ZIP code (`address`)."
},
"country": {
"type": "string",
"description": "Two-letter country code, e.g. US (`address`)."
},
"phone": {
"type": "string",
"description": "Contact phone for delivery (`address`)."
},
"email": {
"type": "string",
"description": "Contact email for the order; defaults to the account email (`address`)."
},
"username": {
"type": "string",
"description": "Email/username at the merchant (`credentials`)."
},
"password": {
"type": "string",
"description": "Password at the merchant — stored encrypted, never returned (`credentials`)."
}
},
"required": [
"command"
]
}