API reference
Quotes
Every bookable rate is a quote. Price-check it to confirm the live price and terms, and read its details for everything you should show before checkout.
Price-check a quote
/api/v1/quotes/:quoteId/price-check:quoteId is a result row's rateQuoteId. Confirms availability, price and cancellation terms with the inventory source. Returns 200 even when the price or terms changed; book within 10 minutes. The body is optional — send {}.
Body
| Field | Description |
|---|---|
occupancyarray | Reprice for a different party (activities). Entries: adults, childrenAges, optional children and infants counts. |
rateMode"net" | "commissionable" | Rate model, when your agency lets advisors choose. |
supplierRateRefstring | Activities: the option to price and book — a bookableOptions[].supplierRateRef token from activity options for this same quote. Omit to re-check the rate as searched. |
Response
| Field | Description |
|---|---|
quoteIdstring | The quote you checked — book with this ID. |
priceChangedboolean | The price differs from the search. |
policyChangedboolean | The cancellation terms differ from the search. |
changesobject | Present only when something changed. price (only if the price changed): from / to money objects — the published price on commissionable rates. cancellation (only if the terms changed): from / to policies; from can be null, and supplierFlaggedOnly: true marks a change the inventory source reported although the terms read the same. |
breakdownobject | Money objects: sell (the price — what you pay on net rates), taxesAndFees (an estimate included in sell, for display), paymentFeeEstimate and serviceFee (both informational; serviceFee can be 0 and isn't charged). On commissionable rates you're charged agencyCommission.grossMinor. |
quoteobject | The updated quote: _id, productType, canonicalProductId, status, expiresAt (now 20 minutes after this check), cancellationPolicy, details (product details such as rateComments, excludedTaxes, bookingQuestions, pickup information) and more. |
agentMarkupobject | Markup limits used by the portal: cardFeePercent and maxPercent. |
agencyCommissionobject | null | Commissionable hotel rates: tier, percent, grossMinor (the published price — the amount you're charged), commissionMinor. Plain integers in minor units. |
agencyCommissionUnavailableReasonstring | null | Why commission doesn't apply, when it doesn't: no_organization, no_tier, tier_not_configured, net_only_policy, net_rate_selected or non_hotel_product. |
| Error | When |
|---|---|
404 not_found | No such quote. |
403 forbidden | The quote belongs to another agency's search. |
409 rate_unavailable | Sold out or withdrawn. |
410 quote_expired | Past its expiresAt. |
409 quote_not_repriceable | Already claimed by a booking. |
409 price_check_conflict | A concurrent price-check won. Retry once. |
409 pax_mix_unavailable | Activity can't take the requested party. |
400 rate_option_not_offered | The supplierRateRef token isn't one of this quote's options. |
400 validation_error | The supplierRateRef token was altered or isn't valid. |
409 price_check_currency_unavailable | Priced in a currency we can't settle. |
409 quote_invalid | The quote has no usable price. Fetch fresh rates. |
409 unknown_supplier | The quote's inventory source can't be reached for a price-check right now. Choose another rate. |
403 agreement_unsigned | Can be returned while your agency hasn't signed the distribution agreement. |
503 supplier_unavailable | Inventory source didn't answer. |
List an activity's options
/api/v1/quotes/:quoteId/activity-recheckFor activities that come back as one “from” row, lists every bookable option — time slot, language, ticket type — after a live check. Body optional: send occupancy to list options for a different party. Returns data.quoteId and data.bookableOptions[]; some activities also return pickupLocations and allowCustomTravellerPickup. Price-check the chosen option by sending its token as supplierRateRef. See Choose an option.
| Field | Description |
|---|---|
supplierRateRefstring | Opaque token for this option. Send it back unchanged as supplierRateRef on the price-check. |
referencestring | The option's reference. |
titlestring | Option name, when the operator provides one. |
timeSlotstring | Start time, when the option has one. |
languagestring | Guide or audio language, when relevant. |
durationstring | Duration as display text, when provided. |
priceMoney | What you pay for this option, priced the same way as the price-check. Absent when the option can't be priced yet. |
cancellationPolicyobject | The option's cancellation terms, priced at what you pay. |
panRequiredboolean | When true, send panNumber when you book. |
bookingQuestionsarray | Questions to answer in bookingAnswers when you book. |
| Error | When |
|---|---|
400 activity_recheck_unsupported | This activity has no separate options — price-check the row directly. |
404 not_found / 403 forbidden | No such quote, or it belongs to another agency's search. |
410 quote_expired | Past its expiresAt. |
Get a quote's details
/api/v1/quotes/:quoteId/detailsThe full details for any quote, without contacting the inventory source: descriptions, fare rules, pickup instructions, remarks. Use it to fill your product and checkout pages.
{
"data": {
"quoteId": "66f1c0b8e4b0c1d2e3f4a7a2",
"productType": "hotel",
"supplier": "src-3fa1c2",
"status": "price_checked",
"expiresAt": "2026-09-10T12:26:00Z",
"breakdown": { "sell": { "amountMinor": 51120, "currency": "USD" } },
"cancellationPolicy": { "refundable": true, "freeCancelBefore": "2026-11-08T12:00:00Z", "deadlines": [] },
"details": { "rateComments": "Check-in from 15:00. Photo ID required." }
},
"meta": {},
"error": null
}Quote status
| status | Meaning |
|---|---|
active | From a search; not yet price-checked. |
price_checked | Checked; bookable within 10 minutes of the check. |
consumed | Used by a booking. If that booking fails, the quote returns to price_checked. |
A quote past its expiresAt keeps its last status; price-checking it returns 410 quote_expired. Compare expiresAt with the current time rather than waiting for the status to change.