{"openapi":"3.1.0","info":{"title":"Vuelo Agent Commerce API","version":"1.0.0","description":"Vuelo is a travel booking and payments platform for people and AI agents. Agents can search live flights and hotels, retrieve bookable prices and create travel bookings through Vuelo.\n\nVuelo for AI agents is in early access. Search is open to any agent now, with no key. Booking is open to invited partners first: request access at https://mcp.getvuelo.com/agents#request-access or by email to agents@getvuelo.com. Without a partner key, create_order answers 403 EARLY_ACCESS.\n\nThe usual flow is four calls: search_flights or search_hotels, then revalidate_offer, then create_order, then get_order. Search results are offers, not bookings. Vuelo never takes card details through this API and never returns a payment link. create_order does one of three things: books at once inside a mandate the traveller gave you (send their consumer_ref); asks them to approve with their passkey on Vuelo's screen (next_action passkey_approval, a link you show them); or texts them a secure link to confirm and pay, or apply for a payment plan, on their phone. Stop and ask the traveller whenever a response says requires_user_confirmation.\n\nNo key is needed. Without one: 20 live searches an hour per IP (then cached or sample results, marked live: false), 10 revalidations and 5 orders an hour. Partners get a key for higher limits. Send X-Agent-Platform (for example instinct, chatgpt, claude) so Vuelo can support your platform; an unknown platform is fine.","contact":{"url":"https://mcp.getvuelo.com/agents"}},"servers":[{"url":"https://mcp.getvuelo.com/agent/v1"}],"components":{"securitySchemes":{"partnerKey":{"type":"http","scheme":"bearer","description":"Optional. A partner key (vp_...) for higher limits and your own orders."}},"parameters":{"platform":{"name":"X-Agent-Platform","in":"header","schema":{"type":"string"},"description":"Your agent platform, for example instinct. Optional."},"session":{"name":"X-Agent-Session-Id","in":"header","schema":{"type":"string"},"description":"Your session id, so Vuelo can relate your calls. Optional."}},"schemas":{"VoyaSearchRequest":{"type":"object","properties":{"vertical":{"type":"string","enum":["hotel","flight"],"description":"hotel unless origin is given."},"query":{"type":"string","maxLength":600,"description":"The traveller's words, for example \"cheapest refundable 5-star hotel in Venice next weekend with breakfast and a Tripadvisor rating above 4.5\"."},"destination":{"anyOf":[{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"iata":{"type":"string"}},"additionalProperties":true},{"type":"string"}],"description":"Hotels: { city, country }. Flights: the destination airport code, as a string or { iata }."},"check_in":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","description":"Hotels: check-in date."},"check_out":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","description":"Hotels: check-out date."},"adults":{"type":"number","description":"1 to 9. Default 2."},"rooms":{"type":"array","items":{"type":"object","properties":{"adults":{"type":"number"}},"additionalProperties":true}},"origin":{"type":"string","description":"Flights: IATA airport, for example LHR."},"depart_date":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","description":"Flights: outbound date."},"return_date":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","description":"Flights: return date, for a return."},"objective":{"type":"string","enum":["best_value","cheapest","cheapest_refundable","best_rated","luxury","flexible","business","shortest","direct"]},"constraints":{"type":"object","properties":{"min_stars":{"type":"number"},"max_stars":{"type":"number"},"min_rating":{"type":"number","description":"Out of 5."},"min_reviews":{"type":"number"},"rating_source":{"type":"string","enum":["any","tripadvisor","supplier"]},"breakfast":{"type":"boolean"},"refundable":{"type":"boolean"},"near":{"type":"object","properties":{"name":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"radius_km":{"type":"number"}},"required":["radius_km"],"additionalProperties":false},"chains":{"type":"array","items":{"type":"string"}},"airlines":{"type":"array","items":{"type":"string"}},"loyalty":{"type":"array","items":{"type":"string"}},"max_stops":{"type":"number"},"cabin":{"type":"string","enum":["economy","premium_economy","business","first"]},"max_total":{"type":"object","properties":{"amount":{"type":"number","description":"In major units, for example 450.00."},"currency":{"type":"string"}},"required":["amount"],"additionalProperties":false}},"additionalProperties":true},"intent":{"type":"object","properties":{"objective":{"type":"string","enum":["best_value","cheapest","cheapest_refundable","best_rated","luxury","flexible","business","shortest","direct"]},"constraints":{"type":"object","properties":{"min_stars":{"type":"number"},"max_stars":{"type":"number"},"min_rating":{"type":"number","description":"Out of 5."},"min_reviews":{"type":"number"},"rating_source":{"type":"string","enum":["any","tripadvisor","supplier"]},"breakfast":{"type":"boolean"},"refundable":{"type":"boolean"},"near":{"type":"object","properties":{"name":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"radius_km":{"type":"number"}},"required":["radius_km"],"additionalProperties":false},"chains":{"type":"array","items":{"type":"string"}},"airlines":{"type":"array","items":{"type":"string"}},"loyalty":{"type":"array","items":{"type":"string"}},"max_stops":{"type":"number"},"cabin":{"type":"string","enum":["economy","premium_economy","business","first"]},"max_total":{"type":"object","properties":{"amount":{"type":"number","description":"In major units, for example 450.00."},"currency":{"type":"string"}},"required":["amount"],"additionalProperties":false}},"additionalProperties":true}},"additionalProperties":false,"description":"objective and constraints, nested. Either form is accepted."},"market":{"type":"string","enum":["GB","US"],"description":"Where the traveller is. Otherwise from their mobile or the destination."},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$"},"contact":{"type":"object","properties":{"mobile":{"type":"string"}},"additionalProperties":true},"trip_id":{"type":"string","description":"Add this search to an existing trip."},"limit":{"type":"number","description":"Results to return, 1 to 30. Default 10."}},"additionalProperties":true},"VoyaBookRequest":{"type":"object","properties":{"search_id":{"type":"string","minLength":1,"description":"From the search."},"offer_id":{"type":"string","minLength":1,"description":"A best_offer or other_offers id from that search."},"contact":{"type":"object","properties":{"mobile":{"type":"string","description":"UK or US mobile, to text the secure link to."},"email":{"type":"string"}},"additionalProperties":true},"travellers":{"type":"array","items":{"type":"object","properties":{"given_name":{"type":"string"},"family_name":{"type":"string"},"name":{"type":"string"},"date_of_birth":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","description":"YYYY-MM-DD; flights need it."}},"additionalProperties":true}},"consumer_ref":{"type":"string","description":"The vc_ reference the traveller gave you, to book inside their mandate."},"notify_url":{"type":"string","format":"uri","description":"Your https address, for the booking.confirmed event."},"notify_token":{"type":"string"}},"required":["search_id","offer_id"],"additionalProperties":true},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","recoverable","suggested_action"],"properties":{"code":{"type":"string","examples":["OFFER_EXPIRED","PRICE_CHANGED","OFFER_UNAVAILABLE","INVALID_DATES","RATE_LIMITED","TRAVELLER_DETAILS_REQUIRED","IDEMPOTENCY_KEY_REUSED","SUPPLIER_TIMEOUT"]},"message":{"type":"string"},"recoverable":{"type":"boolean"},"suggested_action":{"enum":["SEARCH_AGAIN","REVALIDATE","ASK_USER","REAUTHENTICATE","RETRY","CONTACT_SUPPORT"],"description":"What to do next."},"details":{"type":"object"}}}}},"PaymentOption":{"type":"object","properties":{"type":{"enum":["pay_in_full","reserve_now","payment_plan"]},"available":{"type":"boolean"},"summary":{"type":"string","description":"Show this to the traveller exactly as given."},"requires_customer_application":{"type":"boolean","description":"A payment plan is applied for on Vuelo's secure page. Never say or imply the traveller will be approved."},"notice":{"type":"string","description":"Vuelo's only words for a payment plan. Show them verbatim beside the plan, and say nothing else about it."}}},"Confirmation":{"type":"object","properties":{"requires_user_confirmation":{"type":"boolean","description":"True: stop and ask the traveller before going on."},"confirmation_reason":{"enum":["price_changed","booking_commitment","payment","cancellation","traveller_details","terms","credit_application","regulated_disclosure"]}}}}},"paths":{"/search/flights":{"post":{"operationId":"search_flights","summary":"Search live flight availability","description":"Use this when a traveller wants flights. Results are offers, not bookings, and are not guaranteed until the offer is revalidated. Default 10 offers; sort by recommended, cheapest, fastest or best_rated. The facts behind the order (price, stops, duration) are in each offer, so you can choose for yourself.","parameters":[{"$ref":"#/components/parameters/platform"},{"$ref":"#/components/parameters/session"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["origin","destination","departure_date"],"properties":{"origin":{"type":"string","description":"IATA airport code, for example LHR."},"destination":{"type":"string","description":"IATA airport code, for example LIS."},"departure_date":{"type":"string","format":"date"},"return_date":{"type":"string","format":"date","description":"Leave out for one way."},"travellers":{"type":"array","items":{"type":"object","properties":{"type":{"const":"adult"}}},"description":"One entry per adult."},"cabin_class":{"type":"string","examples":["economy"]},"currency":{"const":"GBP"},"preferences":{"type":"object","properties":{"max_stops":{"type":"integer"},"max_total_price":{"type":"number","description":"Pounds, two decimal places."}}},"sort":{"enum":["recommended","cheapest","fastest","best_rated"]},"limit":{"type":"integer","default":10,"maximum":50}}}}}},"responses":{"200":{"description":"Offers. live is false when these are cached or sample results."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/search/hotels":{"post":{"operationId":"search_hotels","summary":"Search live hotel availability","description":"Use this when a traveller wants somewhere to stay. Each offer has the property, star rating, room, board basis, cancellation policy, total price and images as fields, not prose. page_url is a public page for the stay (photos, details, price): send it to the traveller in a chat that cannot show images, such as WhatsApp, SMS or Telegram, where it shows as a preview with the hotel's photo. It books nothing, so it is safe to share; the payment link never is. Revalidate before ordering.","parameters":[{"$ref":"#/components/parameters/platform"},{"$ref":"#/components/parameters/session"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["destination","check_in","check_out"],"properties":{"destination":{"type":"object","required":["city"],"properties":{"city":{"type":"string"},"country":{"type":"string","description":"ISO country code, for example PT."}}},"check_in":{"type":"string","format":"date"},"check_out":{"type":"string","format":"date"},"rooms":{"type":"array","maxItems":1,"items":{"type":"object","properties":{"adults":{"type":"integer"},"children":{"const":0}}}},"currency":{"const":"GBP"},"preferences":{"type":"object","properties":{"minimum_star_rating":{"type":"integer","minimum":1,"maximum":5},"max_total_price":{"type":"number","description":"Pounds, two decimal places."},"refundable_only":{"type":"boolean"}}},"sort":{"enum":["recommended","cheapest","best_rated"]},"limit":{"type":"integer","default":10,"maximum":50}}}}}},"responses":{"200":{"description":"Offers."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/offers/{offer_id}":{"get":{"operationId":"get_offer","summary":"One offer, with its payment options","parameters":[{"name":"offer_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The offer."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/offers/{offer_id}/revalidate":{"post":{"operationId":"revalidate_offer","summary":"Check an offer is still bookable at its price","description":"Call this before create_order. Send expected_total, the price you showed the traveller. status is available, price_changed, unavailable or expired. On price_changed, show the traveller current_total and ask them to confirm; Vuelo never accepts a price increase silently. On unavailable or expired, search again.","parameters":[{"name":"offer_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"expected_total":{"type":"number","description":"Pounds, two decimal places."}}}}}},"responses":{"200":{"description":"The offer's status."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks":{"get":{"tags":["Partner"],"operationId":"list_webhooks","summary":"Your registered webhook addresses","security":[{"partnerKey":[]}],"responses":{"200":{"description":"data: each address, its events and whether it is active."},"401":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Partner"],"operationId":"register_webhook","summary":"Be told of every booking you originate, without passing notify_url each time","description":"Partner key required. Register one https address; Vuelo POSTs booking.confirmed and booking.reserved for every order you create, the moment the traveller pays, signed (X-Vuelo-Signature: t=<unix>,v1=<HMAC-SHA256 of \"<t>.<body>\">) and retried with backoff. The signing secret is in this response only. Without a partner key, pass notify_url on create_order instead, or poll get_order.","security":[{"partnerKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"enum":["booking.confirmed","booking.reserved"]}}}}}}},"responses":{"200":{"description":"id, url, events and the signing secret (shown once)."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/search":{"post":{"operationId":"search","summary":"Voya: search the whole market and get the best offer for each hotel or itinerary","description":"One call for hotels or flights across Vuelo's inventory and its partners'. Send what the traveller wants as fields, as their own words in query, or both (fields win). Voya compares every seller on the full price and terms, matches the same hotel across sellers, applies every constraint (and says why offers were left out), and returns each result's best_offer, the market breadth, the saving against Vuelo's own price, why it won and how it would be booked. Also at /a2a/search.","parameters":[{"$ref":"#/components/parameters/platform"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoyaSearchRequest"}}}},"responses":{"200":{"description":"search_id, trip_id, market (sources searched and answered, offers compared, why offers were left out) and results, each with best_offer, other_offers, comparison, why and execution."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/book":{"post":{"operationId":"book","summary":"Voya: book an offer from a search, by the best route","description":"Send search_id and an offer_id from it, with contact.mobile and travellers. Voya quotes the offer again, compares it once more with the other sellers of the same product, switches to the next one if it got worse, and books by the best route. The traveller confirms and pays on Vuelo's secure page by a texted link (or, for some partners, on the partner's own checkout: next_action open_url). The answer is the same booking object whatever the route. Send an Idempotency-Key. Also at /a2a/book.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"A new UUID per order. Retrying with the same key returns the first answer and never creates a second order."},{"$ref":"#/components/parameters/platform"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoyaBookRequest"}}}},"responses":{"201":{"description":"booking_id, trip_id, status (customer_action_required, confirmed, handed_off, unavailable), route, total, verification, price_changed and switched_from when they apply, next_action."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/trips/{trip_id}":{"get":{"operationId":"get_trip","summary":"Voya: a trip and every booking made for it","parameters":[{"name":"trip_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The trip, its searches and bookings, whichever route each took."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders":{"post":{"operationId":"create_order","summary":"Create an order; Vuelo books within the traveller's mandate or asks them to approve","description":"Only after the traveller has chosen the offer and how to pay. Vuelo checks, in order, the traveller, this agent, the traveller's mandate for it, the mandate's limits, the risk and the saved card. Inside the mandate it pays with the saved card by its token and books, with no action from the traveller (status booked or reserved). Otherwise, if they have a passkey, next_action is passkey_approval: show them its url, where they approve with Face ID, Touch ID or their device's check (safe to show: only their passkey can approve it). Otherwise Vuelo texts their mobile a secure link. A payment plan always needs its own application. Vuelo never returns a payment link to the agent, and never card details. Every decision is in authorisation.steps. Send expected_total (the revalidated price) and an Idempotency-Key. Flights need each passenger's name and date of birth.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"A new UUID per order. Retrying with the same key returns the first answer and never creates a second order."},{"$ref":"#/components/parameters/platform"},{"$ref":"#/components/parameters/session"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["offer_id"],"properties":{"offer_id":{"type":"string"},"expected_total":{"type":"number","description":"Pounds, two decimal places."},"consumer_ref":{"type":"string","description":"The vc_ reference the traveller gave you when they authorised you (get_order returns it once, after they set a mandate on the approval screen). Identifies them without their mobile. Only good with the partner key it was issued to."},"payment_option":{"enum":["pay_in_full","reserve_now","payment_plan"],"default":"pay_in_full","description":"One the offer lists as available. payment_plan only when the traveller has asked for one."},"contact":{"type":"object","properties":{"mobile":{"type":"string","description":"The traveller's mobile, in international format (+44 7700 900123, +1 415 555 2671); a UK number may also start 07. Required unless you send consumer_ref. Identifies them, and is where a fallback text goes."}}},"travellers":{"type":"array","items":{"type":"object","properties":{"given_name":{"type":"string"},"family_name":{"type":"string"},"date_of_birth":{"type":"string","format":"date"}}}},"agent_context":{"type":"object","properties":{"platform":{"type":"string"},"agent_session_id":{"type":"string"}}},"notify_url":{"type":"string","format":"uri","description":"Your https address. The moment the traveller confirms on their phone, Vuelo POSTs it a booking.confirmed (or booking.reserved) event with the reference, trip, dates and amount, so you can tell them without being asked. Retried once."},"notify_token":{"type":"string","description":"A secret of yours. Sent back in X-Vuelo-Notify-Token; the body is signed with it in X-Vuelo-Signature (sha256=HMAC-SHA256 of the raw body)."}}}}}},"responses":{"201":{"description":"status booked or reserved (inside a mandate); or customer_action_required with next_action { type: passkey_approval, url } or { type: customer_confirmation, channel: sms }. authorisation has the outcome and each step. Then wait for your notify_url, or poll get_order."},"400":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{order_id}":{"get":{"operationId":"get_order","summary":"Where an order is, and the booking once confirmed","description":"Poll every few seconds after create_order. status is customer_action_required, customer_confirming, booked, reserved, declined or link_expired. Once booked, booking has the reference and dates. If the traveller set a mandate for you while approving, consumer_ref appears here once: keep it, and send it on their future orders.","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The order."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{order_id}/payment-option":{"post":{"operationId":"change_payment_option","summary":"Change how an order is paid for","description":"When the traveller wants to pay a different way before they confirm, for example reserve now instead of paying in full. Only an option the offer lists as available. The link already texted stays the same and opens with the new option; nothing new is sent.","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payment_option"],"properties":{"payment_option":{"enum":["pay_in_full","reserve_now","payment_plan"]}}}}}},"responses":{"201":{"description":"Changed; payment_options says what is available."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{order_id}/resend-link":{"post":{"operationId":"resend_link","summary":"Text the secure link again","description":"When the traveller says the link has not arrived, or asks for another. Vuelo texts the same link again to the same number the first time (at least a minute after the first text, while unopened). After that, or once the link has been opened, or after it expires, Vuelo cancels it and texts a fresh one to the same number: only the newest link works. At most three links an order. get_order shows where the text got to (link.status: sent, delivered, not_delivered with a reason, opened, expired).","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Sent again."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{order_id}/cancel":{"post":{"operationId":"cancel_order","summary":"Call off an unconfirmed order","description":"Close an order the traveller has not confirmed: the texted link stops working and nothing is booked or charged, so the same trip can be ordered again cleanly. Use it when the traveller changes their mind before confirming, or when an order cannot be resent (out of links, or past renewing) and needs replacing. It refuses once the traveller has opened the link and may be paying, and it cannot undo a confirmed booking, which is theirs to manage in Vuelo.","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Cancelled; the link no longer works."},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{order_id}/payment-options":{"get":{"operationId":"get_payment_options","summary":"Ways to pay for an order","description":"Never decide credit eligibility. A payment plan is only ever \"available to apply for\"; show its notice verbatim.","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Options.","content":{"application/json":{"schema":{"type":"object","properties":{"options":{"type":"array","items":{"$ref":"#/components/schemas/PaymentOption"}}}}}}},"404":{"description":"An error an agent can act on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"tags":[{"name":"Agent Commerce","description":"Search, price, book and follow a booking."},{"name":"Partner","description":"For agents with a partner key: be told of every booking you originate."}]}