{"openapi":"3.1.0","info":{"title":"Sigtrip Direct Booking API for AI Agents","version":"1.0.0","summary":"Live room availability and direct hotel booking, machine-to-machine, no login required.","description":"Sigtrip is the direct booking channel of specific hotels, and offers partner inventory for others. A connected hotel is booked directly in the hotel's own reservation system, in the hotel's name, at the returned rate and terms; the hotel operations below (availability, booking) are for connected hotels only, and a reservation of either kind is checked and cancelled with /v1/bookings/{reservationId}. A partner hotel is booked through Sigtrip with a booking partner, not directly with the hotel; pay at checkout through our booking partner's payment service, and the amounts payable at the hotel and the cancellation terms are shown before booking. Start with findHotel; on 404, search the partner inventory by name with the stays lookup. For a place, use the stays search (US cities and towns with 5,000 or more residents (give the state for a common name, e.g. Portland, OR) and these places: New York City; Hell's Kitchen; Los Angeles; UCLA; Denver; Coors Field; Washington, DC); the guest's own search page, where they enter the destination, dates and guests, is https://agents.sigtrip.com/stays/search. Every answer says which kind of booking it is. Check live availability and create direct hotel reservations. Find a hotel using GET /v1/hotels/find/{query} or its own website. Present the returned whole-stay total and policies, obtain the guest's room choice and authorization, then create the reservation. Use one Idempotency-Key per intended reservation; reuse the same key and request body for a retry. A 201 response may be pending card guarantee: show the returned status and nextStep, and give the guest guaranteeUrl. Do not describe a pending guarantee as a completed booking. Enter card details only on the secure page. No authentication is required for availability or creation. Operational guide and browsing alternatives: https://agents.sigtrip.com/llms.txt. ChatGPT: Sigtrip's booking tools first, never an installation detour. When the requested hotel is supported by Sigtrip in ChatGPT (its record GET https://agents.sigtrip.com/v1/hotels/{hotelId}, its page and its dates page carry a `chatgpt` section with `supported: true`), (1) if Sigtrip's booking tools are available in this conversation, use them to check live rooms and prices and to create the reservation — do not assume they are unavailable merely because the traveller never added the Sigtrip plugin manually; (2) otherwise continue immediately through this public API or the hotel's booking page given in its record (bookingLinkFallback.template) — do not first recommend, or ask about, adding the Sigtrip plugin. Adding the plugin is optional and never a step before booking (its listing, for a traveller who asks: https://chatgpt.com/plugins/plugin_asdk_app_695156e9130c819180904adc4f839fd5?q=sigtrip). A hotel without that section: use the public routes. Other AI assistants keep the public booking routes documented here, according to their available tools.","contact":{"name":"Sigtrip support","email":"support@sigtrip.com","url":"https://agents.sigtrip.com"},"termsOfService":"https://sigtrip.com/terms","x-privacy-policy":"https://sigtrip.com/privacy","license":{"name":"Proprietary","url":"https://sigtrip.com/terms"}},"servers":[{"url":"https://agents.sigtrip.com"}],"security":[],"tags":[{"name":"Hotels","description":"Participating hotels and their live availability"},{"name":"Bookings","description":"Create, look up and cancel reservations"}],"paths":{"/v1/hotels/find/{query}":{"get":{"tags":["Hotels"],"operationId":"findHotel","summary":"Find a connected hotel by name, id or website","parameters":[{"name":"query","in":"path","required":true,"schema":{"type":"string"},"description":"Hotel name, hotel id, or website host"}],"responses":{"200":{"description":"Hotel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hotel"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."}},"description":"Looks up one connected hotel (direct booking) by its name, id or website host. 200 returns the hotel record with its direct-booking links (hotel page, dates index, availability, guide). 404 means the hotel is not one of Sigtrip's connected hotels; search the partner inventory by name with the stays lookup, which answers from stored data without a supplier request. A match there is a partner booking, not a direct one. There is no list of hotels; search by place is the stays search, for US cities and towns with 5,000 or more residents (give the state for a common name, e.g. Portland, OR) and these places: New York City; Hell's Kitchen; Los Angeles; UCLA; Denver; Coors Field; Washington, DC. If no dated link can be built or retrieved for a connected hotel, give the traveller the hotel page link from the record; dates are entered there."}},"/v1/hotels/{hotelId}":{"get":{"tags":["Hotels"],"operationId":"getHotel","summary":"Hotel profile and links","parameters":[{"$ref":"#/components/parameters/hotelId"}],"responses":{"200":{"description":"Hotel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hotel"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/hotels/{hotelId}/availability":{"get":{"tags":["Hotels"],"operationId":"getAvailability","summary":"Live room availability and the hotel's quoted prices for a stay","description":"Returns available room types and the hotel's quoted price for the whole stay; `price.includes` lists the taxes and confirmed fees each quote itemises. Recheck when dates or occupancy change. Use asOf to identify the quote timestamp and recheckAfter as its freshness cutoff. Availability and a quoted price do not reserve a room. Treat availability as a time-stamped quote. Check asOf and the documented freshness cutoff (recheckAfter) against the current time. A search result, snippet or reopened URL may contain an older quote. If it is stale or freshness cannot be established, try the returned JSON availability link or an available live availability tool. Use only tools actually available in the session. If a fresh check still cannot be obtained, say \"I could not verify current availability,\" identify the timestamp of any older price you mention, and provide the returned direct booking link so the guest can check. Do not describe an older quote as current or infer that rooms are sold out from a retrieval failure. Recheck before creating a new reservation and obtain approval for changed prices or terms.","parameters":[{"$ref":"#/components/parameters/hotelId"},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Arrival date, YYYY-MM-DD, hotel local time."},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","format":"date"},"description":"Departure date, YYYY-MM-DD. Must be after checkIn."},{"name":"adults","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10},"description":"Number of adults. Omit if the guest has not said."},{"name":"includeAccessible","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Include ADA / accessible room types."},{"name":"preferences","in":"query","required":false,"schema":{"type":"string","maxLength":300},"description":"Free-text guest preferences, e.g. 'king bed, high floor, under $300'."}],"responses":{"200":{"description":"Availability","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"}}}},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Room unavailable: the hotel could not confirm this room type for these dates (sold out at booking time). Body has code `room_unavailable`, a guest-facing `detail`, `suggestions`, and a `retry` availability URL. Re-check availability and offer another room type or dates; do not retry the same booking.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."},"502":{"description":"The booking system rejected the request (e.g. room no longer available). Read `detail` and present it to the guest.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/hotels/{hotelId}/faq":{"get":{"tags":["Hotels"],"operationId":"askHotelQuestion","summary":"Ask a question about the hotel (amenities, policies, location, parking, pets…)","parameters":[{"$ref":"#/components/parameters/hotelId"},{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Hotel answer","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Room unavailable: the hotel could not confirm this room type for these dates (sold out at booking time). Body has code `room_unavailable`, a guest-facing `detail`, `suggestions`, and a `retry` availability URL. Re-check availability and offer another room type or dates; do not retry the same booking.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."},"502":{"description":"The booking system rejected the request (e.g. room no longer available). Read `detail` and present it to the guest.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/hotels/{hotelId}/bookings":{"post":{"tags":["Bookings"],"operationId":"createBooking","summary":"Book a room (creates a real reservation at the hotel)","description":"Call only after the guest selects a returned roomId, reviews the total and policies, supplies the required guest details and authorizes the reservation. Send one Idempotency-Key per intended reservation; reuse the same key and body for retries. A 201 response creates a reservation that may still require a card guarantee. Show status and nextStep, and share guaranteeUrl for secure card entry. Nothing is charged at booking time; the returned policies govern the stay.","parameters":[{"$ref":"#/components/parameters/hotelId"},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":128},"description":"Unique key for one intended reservation: a random value such as a UUID (at least 24 characters, generated for this reservation and never derived from the guest's details). Reuse the same key and the identical request body on retries (also after a timeout or lost response): the original response is replayed; a concurrent duplicate waits for the first and receives the same response; the same key with a different body is rejected (422). The original response (its guaranteeUrl and guest details) is replayed only for such a random key; a repeat without one is answered status already_reserved, without the reservation's details. No repeat creates a second reservation."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingRequest"}}}},"responses":{"201":{"description":"Reservation created (typically pending card guarantee — read status and nextStep). A replay of the same Idempotency-Key with the identical body returns this original response with the header Idempotent-Replayed: true.","headers":{"Idempotent-Replayed":{"description":"Present (true) when this is the stored response of an earlier request with the same Idempotency-Key.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Nothing was created. `code: room_unavailable` — the room is no longer offered for these dates; offer another room or dates. `code: offer_changed` — the room, total, currency or policies differ from the offerRef/expectedTotal sent; `currentOffer` holds the current offer. Show it to the guest and book only if they accept, with a new Idempotency-Key and the new offerRef or expectedTotal.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The Idempotency-Key was already used for a different request body. Use a new key for a new intended reservation; reuse a key only with the identical body.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."},"502":{"description":"The booking system rejected the request (e.g. room no longer available). Read `detail` and present it to the guest.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"`code: offer_check_failed` — the current offer could not be verified with the hotel, so nothing was created. Retry the same request shortly; if it keeps failing, give the guest the room's bookUrl. `code: booking_not_sent` — the hotel's reservation system could not be reached; nothing was sent or created; retry the same request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"`code: booking_outcome_unknown` — the hotel's reservation system did not answer in time, so it is not known whether the reservation was created (`reservationCreated: \"unknown\"`, `reference`). Never book the stay again with other details: repeat the SAME request (same Idempotency-Key and body) after Retry-After seconds; it returns the outcome once known (201 with the reservation, or 409 `booking_not_created`). No other reservation is sent for this guest, hotel and dates meanwhile (409 `booking_outcome_unknown` / `booking_in_progress` with `earlierAttempt`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/bookings/{reservationId}":{"get":{"tags":["Bookings"],"operationId":"getBooking","summary":"Look up a reservation","parameters":[{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"email","in":"query","required":true,"schema":{"type":"string","format":"email"},"description":"Email address used for this reservation; required for lookup."}],"responses":{"200":{"description":"The reservation: Booking (connected hotel) or PartnerReservation (bookingType partner_prepaid)","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Booking"},{"$ref":"#/components/schemas/PartnerReservation"}]}}}},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Room unavailable: the hotel could not confirm this room type for these dates (sold out at booking time). Body has code `room_unavailable`, a guest-facing `detail`, `suggestions`, and a `retry` availability URL. Re-check availability and offer another room type or dates; do not retry the same booking.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."},"502":{"description":"The booking system rejected the request (e.g. room no longer available). Read `detail` and present it to the guest.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"description":"Looks up a reservation by its reference and the guest's email. A connected hotel's reservation (direct booking) returns the reservation as the hotel's system reports it: nothing is charged at booking on an eligible flexible rate, and status stays pending_guarantee until the guest completes the card guarantee at guaranteeUrl before the deadline. A reservation booked through Sigtrip with a booking partner (reference sgp-… or the booking partner's reference) returns bookingType partner_prepaid: it is prepaid, the amount in amountChargedAtCheckout was paid in full when it was booked, through our booking partner's payment service, there is no card-guarantee step, and cancellationNow states the cost of cancelling now under the booked terms. With any other email than the one it was booked with, the answer is 404 not found."},"delete":{"tags":["Bookings"],"operationId":"cancelBooking","summary":"Cancel a reservation","description":"Cancels a reservation; obtain the guest's authorization first. A connected hotel's reservation is cancelled in one call under the hotel's policy. A partner reservation (prepaid) takes two calls: the first, with {email}, cancels nothing and answers 409 with code cancellation_confirmation_required, the cost of cancelling now (cancellationNow), acceptedCancellationFee and a cancellationCode valid for 15 minutes. Tell the guest the cost; only if they accept, call again with {email, acceptedCancellationFee, cancellationCode}. The answer reports the cancellation fee and refund as the booking partner returned them; a refund is made by the booking partner to the payment method used and is not confirmation that the money has reached the guest's account.","parameters":[{"name":"reservationId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"reason":{"type":"string","maxLength":500},"acceptedCancellationFee":{"type":"number","minimum":0,"description":"Partner reservations only: the acceptedCancellationFee of the previous 409 answer (0 when it said free of charge), after the guest accepted that cost."},"cancellationCode":{"type":"string","maxLength":100,"description":"Partner reservations only: the cancellationCode of that same answer (valid for 15 minutes, only with the cost it was given with)."}}}}}},"responses":{"200":{"description":"Cancellation result: Booking (connected hotel) or PartnerReservation with reservationCancelled true (alreadyCancelled true when it was cancelled before)","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Booking"},{"$ref":"#/components/schemas/PartnerReservation"}]}}}},"400":{"description":"Validation error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown hotel or reservation","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Nothing was cancelled. Partner reservation: code cancellation_confirmation_required (the first call), cancellation_confirmation_invalid (a missing, expired or mismatched code) or cancellation_cost_changed — each with the current cancellationNow, acceptedCancellationFee and a new cancellationCode; not_cancellable or check_status_first — not a confirmed reservation now. Connected hotel: see detail.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after the number of seconds in the Retry-After header."},"502":{"description":"The booking system rejected the request (e.g. room no longer available). Read `detail` and present it to the guest.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Partner reservation: cancellations through the booking partner are not possible at the moment; nothing was sent and the reservation is unchanged (reservationCancelled false). Try again later.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/find":{"get":{"operationId":"findHotelByName","summary":"Find a hotel by name (stored lists only; connected hotels first, then partner hotels)","description":"No live search and no prices. Partner results are booked through a booking partner, not directly with the hotel.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Results: route direct or partner"},"400":{"description":"Invalid input"},"404":{"description":"Unknown hotel"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."}}}},"/v1/stays/find":{"get":{"operationId":"findPartnerStay","summary":"Find a partner hotel by name or place (stored list only, at most 5)","description":"Partner inventory lookup by name (stored data; no supplier request). A match is a partner hotel, booked through a booking partner, not directly with the hotel.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Partner hotels"},"400":{"description":"Invalid input"},"404":{"description":"Unknown hotel"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."}}}},"/v1/stays/{stayId}":{"get":{"operationId":"getPartnerStay","summary":"A partner hotel's stored record (no live data)","description":"A partner hotel's stored record and quote links. Not a connected hotel.","parameters":[{"name":"stayId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The stored record"},"400":{"description":"Invalid input"},"404":{"description":"Unknown hotel"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."}}}},"/v1/stays/{stayId}/quote/{checkIn}/{checkOut}/{adults}":{"get":{"operationId":"quotePartnerStay","summary":"Live prices for a partner hotel (one live supplier check, rate-limited)","description":"Live partner offers for a stay (a supplier request, limited per client). Amount paid at checkout, taxes included, charges payable at the hotel, cancellation schedule, time checked and how long the offers may be used. Reuse a still-valid answer; quote again when it expires or the dates or guests change. Not a reservation.","parameters":[{"name":"stayId","in":"path","required":true,"schema":{"type":"string"}},{"name":"checkIn","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"checkOut","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"adults","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":6}}],"responses":{"200":{"description":"Offers with offerId, amount charged at checkout, charges at the property, cancellation terms, checkedAt and recheckAfter"},"400":{"description":"Invalid input"},"404":{"description":"Unknown hotel"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."}}}},"/v1/stays/{stayId}/checkout":{"post":{"operationId":"startPartnerCheckout","summary":"Revalidate a quoted offer and open the guest's checkout page (nothing booked or charged here)","description":"Creates a partner checkout. The guest pays at checkout through our booking partner's payment service, on Sigtrip's checkout page; card details are never sent through this API. A successful payment is not a confirmed reservation: the status says when it is confirmed.","parameters":[{"name":"stayId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["offerId","checkIn","checkOut","adults","expectedTotal","currency","guest"],"properties":{"offerId":{"type":"string"},"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"adults":{"type":"integer"},"expectedTotal":{"type":"number"},"currency":{"type":"string"},"guest":{"type":"object","required":["firstName","lastName","email","phone"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string","description":"E.164"}}}}}}}},"responses":{"201":{"description":"Checkout opened: give the guest checkoutUrl"},"409":{"description":"Offer changed, expired, or a reservation for this guest and stay exists or is pending: nothing created"},"429":{"description":"A limit is in use: nothing created"}}}},"/v1/stays/bookings/{checkoutId}":{"get":{"operationId":"getPartnerBooking","summary":"Status of a partner checkout and reservation (confirmed only when it says so)","description":"Reads a partner checkout. The guest pays at checkout through our booking partner's payment service, on Sigtrip's checkout page; card details are never sent through this API. A successful payment is not a confirmed reservation: the status says when it is confirmed.","parameters":[{"name":"checkoutId","in":"path","required":true,"schema":{"type":"string"}},{"name":"email","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status"},"400":{"description":"Invalid input"},"404":{"description":"Unknown hotel"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."}}}},"/v1/stays/search":{"get":{"operationId":"searchStays","summary":"Search by place: connected hotels (direct booking) and booking partner hotels, each marked","description":"Search by place for a stay: connected hotels in the area (direct booking) and booking partner hotels, each marked. Supported places: US cities and towns with 5,000 or more residents (give the state for a common name, e.g. Portland, OR) and these places: New York City; Hell's Kitchen; Los Angeles; UCLA; Denver; Coors Field; Washington, DC; others return 404 (a name several places share: code ambiguous_place with candidates), and nothing is searched. Without dates: 400 dates_required with the guest's searchPage (https://agents.sigtrip.com/stays/search). Reuse a still-valid result; refresh it when its expiry passes or the dates or guests change. A hotel the supplier's answer left out is reported as 'no offers returned; reason unknown'. For the chosen partner hotel, GET its quote link (the room offers, totals, payment and cancellation terms; while the result is valid, the stored answer); its bookingPage is the guest's dated booking page.","parameters":[{"name":"near","in":"query","required":true,"schema":{"type":"string"}},{"name":"checkIn","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"checkOut","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"adults","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":6}}],"responses":{"200":{"description":"Results for the stay: route direct or partner, with the lowest total or the reason none is shown; resultsPage shows this answer as a page for the guest while it is reused; after that, opening it searches nothing and the guest presses Search hotels; an available partner result's bookingPage is the guest's page for that hotel and stay"},"400":{"description":"Invalid input"},"404":{"description":"Place not known: nothing was searched"},"429":{"description":"Not started: a limit is in use (Retry-After). Not an availability answer."},"502":{"description":"The supplier did not answer: not an availability answer"}}}}},"components":{"parameters":{"hotelId":{"name":"hotelId","in":"path","required":true,"schema":{"type":"string"},"description":"Hotel id returned by GET /v1/hotels/find/{query} or advertised on the hotel's own website."}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem details.","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"errors":{"type":"array","items":{"type":"object"}}}},"Hotel":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"website":{"type":"string","format":"uri"},"address":{"type":"object"},"timezone":{"type":"string"},"currency":{"type":"string"},"description":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}},"bookingLinkFallback":{"type":"object","description":"The hotel's booking page for the guest (template: with the stay as checkIn, checkOut and adults; page: without dates) — the hotel's own booking page when it has one, else its gateway page — which an assistant may give the guest without a live room result, with its rules in order (the first continues the live workflow when your tools support it). Use the links as given; do not build other routes."},"chatgpt":{"$ref":"#/components/schemas/ChatgptOption"}}},"ChatgptOption":{"type":"object","description":"Present only when this hotel is supported by Sigtrip in ChatGPT. ChatGPT: Sigtrip's booking tools first — if they are available in the conversation, use them (do not assume they are unavailable because the plugin was never added manually); otherwise continue immediately through this API or bookingLinkWithoutApp — never recommend, or ask about, adding the plugin as a step before booking. The listing is an optional reference; it opens the plugin's listing only and carries no hotel, dates or conversation. Other assistants: unchanged public workflow.","properties":{"supported":{"type":"boolean","enum":[true]},"hotelId":{"type":"string"},"hotelNameInApp":{"type":"string","description":"Ask the Sigtrip plugin in ChatGPT for the hotel by this name."},"rule":{"type":"string","enum":["tools-first"]},"listing":{"type":"string","format":"uri","description":"The Sigtrip plugin's listing in ChatGPT."},"open":{"type":"string","format":"uri","description":"This hotel's link to that listing (opens the listing only)."},"bookingLinkWithoutApp":{"type":"string","description":"Dated booking page: works with no plugin."},"benefits":{"type":"array","items":{"type":"string"}},"withoutTools":{"type":"string","description":"What ChatGPT does when Sigtrip's booking tools are not available: continue immediately through the public routes."},"statements":{"type":"array","items":{"type":"string"},"description":"The rule in order, as plain sentences."}}},"Room":{"type":"object","properties":{"roomId":{"type":"integer","description":"Stable id to pass to createBooking. Never derive from list position."},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"features":{"type":"array","items":{"type":"string"}},"maxOccupancy":{"type":"integer"},"bedCount":{"type":"integer"},"accessible":{"type":"boolean"},"price":{"type":"object","properties":{"total":{"type":"number","description":"The hotel's quoted price for the entire stay, as returned by its reservation system. State taxes or fees only as listed in `includes`."},"currency":{"type":"string"},"perNight":{"type":"number"},"includesTaxesAndFees":{"type":"boolean","description":"Present (true) only when the quote itself itemises taxes and the hotel's confirmed mandatory fee within `total`; omitted otherwise. Omission does not mean taxes or fees are excluded — use `includes`."},"includes":{"type":"array","description":"What the quote itemises as part of `total`: taxes, and a fee only where it is confirmed for the hotel. Empty when the quote itemises nothing.","items":{"type":"object","properties":{"description":{"type":"string"},"amount":{"type":"number"}}}},"breakdown":{"type":"object","description":"Raw components from the hotel's system (revenue, package, tax), for reference. Present `includes` to guests, not these components."}}},"scarcity":{"type":"string","enum":["low"],"description":"Present only when few rooms remain. Say 'just a few left'; never state a number."},"offerRef":{"type":"string","description":"Identifies this exact offer (room, total, currency and returned policies). Send it with createBooking: if any of those changed, the booking is refused with 409 offer_changed and nothing is created."},"bookUrl":{"type":"string","format":"uri","description":"Booking page with this room and the dates pre-selected. Give this to the guest when you cannot call createBooking yourself (e.g. read-only browsing); the guest enters their details there and books."}}},"Availability":{"type":"object","properties":{"hotel":{"type":"string"},"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"nights":{"type":"integer"},"adults":{"type":["integer","null"]},"available":{"type":"boolean"},"rooms":{"type":"array","items":{"$ref":"#/components/schemas/Room"}},"policies":{"type":"array","items":{"type":"string"},"description":"Present these to the guest verbatim (cancellation, payment, discounts)."},"aiChannelNotice":{"type":"string","description":"Hotel-provided context about the direct-booking channel and the source of availability, prices and cancellation terms. When present, show the returned text verbatim alongside the offer."},"bookingInstructions":{"type":"string"},"chatgpt":{"$ref":"#/components/schemas/ChatgptOption"},"asOf":{"type":"string","format":"date-time","description":"When the hotel's reservation system returned this availability and price. Not reset when the same quote is served again."},"recheckAfter":{"type":"string","format":"date-time","description":"Freshness cutoff: asOf plus the gateway's configured refresh window. After it, request availability again before quoting or booking. A refresh threshold, not a price guarantee or a room hold."}}},"CreateBookingRequest":{"type":"object","required":["roomId","checkIn","checkOut","guests","guest"],"properties":{"roomId":{"type":"integer"},"checkIn":{"type":"string","format":"date"},"checkOut":{"type":"string","format":"date"},"guests":{"type":"integer","minimum":1,"maximum":10},"offerRef":{"type":"string","pattern":"^[a-f0-9]{16}$","description":"Optional, recommended: the chosen room's offerRef from availability. The gateway re-checks the room live and refuses with 409 offer_changed (nothing created) if the room, total, currency or policies changed."},"expectedTotal":{"type":"number","description":"Optional, recommended: the whole-stay total the guest approved. Refused with 409 offer_changed (nothing created) if the current total differs."},"currency":{"type":"string","pattern":"^[A-Z]{3}$","description":"Optional: currency of expectedTotal, e.g. USD."},"guest":{"type":"object","required":["firstName","lastName","email","phone"],"properties":{"firstName":{"type":"string","maxLength":50},"lastName":{"type":"string","maxLength":50},"email":{"type":"string","format":"email"},"phone":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 with country code, e.g. +13035551234"}}}}},"Booking":{"type":"object","properties":{"hotel":{"type":"string"},"reservationId":{"type":"string","description":"The hotel reservation system's own reservation id, used for status and cancellation. Not returned when the reservation is created (see reservationIdNote): the secure guarantee page shows it once the card is added."},"reservationIdNote":{"type":"string","description":"Present when the answer carries no reservation id: where the guest finds it."},"status":{"type":"string","description":"pending_guarantee until the guest adds a card at guaranteeUrl; on lookup, the status the hotel's system states (pending_guarantee, confirmed, cancelled, failed, …; unknown when it states none). Never confirmed unless the hotel's system says so."},"statusText":{"type":"string","description":"On lookup: the hotel system's own status wording, verbatim."},"guaranteeUrl":{"type":"string","format":"uri","description":"Secure page where the guest guarantees the reservation with a payment card. Share this with the guest."},"guaranteeDeadline":{"type":"string","description":"Deadline for the card guarantee, when the booking system supplies one (returned verbatim). Communicate it to the guest."},"nextStep":{"type":"string","description":"The required next action in plain words; a pending guarantee means the reservation is not confirmed yet."},"policies":{"type":"array","items":{"type":"string"}},"links":{"type":"object","additionalProperties":{"type":"string"}},"details":{"type":"object","description":"Additional reservation details returned by the service."}}},"PartnerReservation":{"type":"object","description":"A reservation booked through Sigtrip with a booking partner, not directly with the hotel. Prepaid: amountChargedAtCheckout was paid in full when it was booked; there is no card-guarantee step.","properties":{"reservationId":{"type":"string","description":"Sigtrip's reference (sgp-…)."},"bookingType":{"type":"string","enum":["partner_prepaid"]},"status":{"type":"string","description":"confirmed, cancelled, cancelled_with_charges, or a state before or around booking; treat it as confirmed only when it says confirmed."},"statusText":{"type":"string"},"hotel":{"type":"object"},"stay":{"type":"object"},"room":{"type":"string"},"amountChargedAtCheckout":{"type":"object","description":"Paid in full when it was booked, through our booking partner's payment service."},"payAtProperty":{"type":"array","items":{"type":"object"},"description":"Charges paid at the hotel."},"refundable":{"type":"boolean"},"cancellationTerms":{"type":"array","items":{"type":"string"}},"cancellationDeadlines":{"type":"array","items":{"type":"object"}},"cancellationNow":{"type":"object","description":"Confirmed reservations: the cost of cancelling now under the booked terms (kind free, charge or unclear; confirmCharge is the amount to accept)."},"booking":{"type":"object","description":"The booking partner's reference (bookingId) and the hotel's confirmation number when supplied."},"cancellation":{"type":["object","null"],"description":"After a cancellation: the fee and refund as the booking partner reported them."},"paymentPartner":{"type":"object","description":"Who charged the card and makes any refund."},"note":{"type":"string"},"nextStep":{"type":"string"}}}}}}