Adrasis™

Release notes

Changes to the Distribution Partner API contract.

2026-11-03: Every offer of a property in a bulk search with "all"

max_offers_per_property in POST /properties/availability now also takes the string "all", which lists every offer of each property, cheapest first, with no count. Send 1 for the cheapest offer, 10 for the ten cheapest, or "all" for every offer; a number lists the same offers as "all" wherever the property has no more than that many, so both forms stay consistent. A number from 1 to 250 works as before. A string other than "all" now answers 400 INVALID_REQUEST with field set to max_offers_per_property, where a number written as text such as "5" was refused without a field before. See Offers per property

2026-11-03: Every code a projection issue carries, and a lifted stay limit reads as null

A projection_issues entry now lists every code the service sends in it. Besides INTERNAL_ERROR, a tax issue carries UNSUPPORTED_FX_PAIR when a fixed tax amount is kept in a currency with no current rate to your currency_code, with retryable false, and SUBSTRATE_DATA_INVARIANT when the property's stored tax data is inconsistent. Both were already sent and are now part of the contract, so a client that checks code against the published list accepts them. In POST /availability/check, a stay bound in nights_resolved (min_stay_through, max_stay_through, min_stay_arrival, max_stay_arrival) that a rule lifts is now null instead of 0, so every bound is a number of nights from 1 up or null for no limit, as the contract always stated. The verdict does not change. See Errors and Currencies, occupancy and allocations

2026-11-03: The currencies a search can be priced in

GET /reference/currencies lists, by ISO 4217 code, every currency the service holds a current exchange rate for, so you can choose currency_code before you search. A hotel that keeps its prices in another currency cannot price a code outside the list: the single-property search answers 422 UNSUPPORTED_FX_PAIR and the bulk search gives that hotel's row the same error_code, as before. The list carries an ETag and answers 304 to a matching If-None-Match. AI agents reach it as the list_currencies tool. No existing field changes. See Currency

2026-11-01: Every booking you make is invoiced to your account

You collect from your guests and settle with the seller on account, so every stay, tour, transfer, flight and package you book is now invoiced to your account under your payment terms and confirmed, a rate the seller's own guests pay at the property included. Before, such a rate was booked as paid by the guest at the hotel. An account that does not settle on account with the seller can no longer book any rate: prebook and /book answer 422 PAYMENT_INTENT_NOT_SUPPORTED. payment_intent_kind on the book requests now accepts only INVOICE; PAY_AT_PROPERTY returns 422 PAYMENT_INTENT_NOT_SUPPORTED with field set to payment_intent_kind. Omitting the field, the normal case, needs no change. policy_card.payment_intent_kind in search keeps saying how the seller's own guests pay. See How the stay is settled

2026-10-20: The price before promotion carries its own tax

grand_total_before_promotion now adds the exclusive tax the rooms' prices before promotion owe, each room's rounded on its own, instead of the tax of the discounted price, so it is the price the guest would pay with no promotion. A room of 4776.64 TRY that lists at 5970.80 TRY before a promotion, under a 1 percent accommodation tax on the price less 10 percent VAT, now publishes 6025.08 TRY where it published 6014.22. Only promoted offers under a tax added at booking move; grand_total, stay_total, stay_total_before_promotion, the promotion lines and every booking amount do not change. See Taxes in the payable total

2026-10-19: A promotion lowers the price a markup is computed on

On a net rate property, a percentage markup on your rates is now computed on the night after its promotions, so a promotion takes its own share off the price you are quoted. A 40000 TRY night with a 30% promotion and a 3% markup is now quoted at 28840.00, with stay_total_before_promotion at 41200.00 and a promotion_lines[].amount of -12360.00. Before, the same night was quoted at 29200.00 with a line of -12000.00, 29% off. Offer search, POST /availability/check, prebook and book follow the same rule. Fixed markups and stays without a promotion do not change, and no field is added or removed. See Breakdowns add up

2026-10-18: Prices follow the party's adult count and the stay's length

Offer search, POST /availability/check, prebook and book now price a stay from the stored price of the party's adult count at the stay's own length. A property that stores a price for stays of seven nights or more shows that price on each night of a seven night stay, in nights[], per_night_avg and stay_total, and the nightly price on each night of a six night stay. A count without a stored price takes the next higher stored count, and adults above the highest stored count pay the property's extra adult fee, which extra_guest_amount shows. A party the property cannot price answers REJECT at gate 11 on the check, whose detail names the missing price, the next higher count, the extra adult fee or the stay length, and is left out of offer search. extra_guest_amount now holds the extra adult fee and child prices only; the price of the adult count is not part of it. No field is added or removed. See Prices by occupancy and stay length

2026-10-18: A child's age without a price names its reason

unavailable_reason gains GUEST_AGE_NOT_PRICED. A property answers it on bulk and place search results and on the detail response when the party fits a room but a requested child's age has no price there for its position, the adult count and the stay dates. No other room split or room count of the same party changes it, so searching again with more rooms does not help. Treat a value you do not know as unavailable. See Why a property returns no allocation

2026-10-18: Place search facet options lead with the busiest

Each facets group of a place search now lists its options with the most properties first, then by label in the request language, then by value. Before, they came in value order, so a group could open with options at 0 ahead of those with properties. stars still runs from 5 down to 0 and guest_scores from 9 down to 6. Counts and fields do not change. See Search a whole place

2026-10-18: Each room is rounded on its own

A multi-room allocation now rounds each room's price and each of its tax totals on its own, and its totals are the sums of its rooms. The same rooms therefore quote the same total as one allocation and as a selection_tokens basket of single-room selections, the way the major online travel agencies state a multi-room booking. Before, the allocation was rounded once and its rooms were settled against that figure, so two rooms with 3.6364 and 6.5454 EUR exclusive tax showed 3.64 and 6.54 under a grand_total of 570.18 while the same two rooms as a basket charged 570.19. The allocation now shows 3.64 and 6.55 and a grand_total of 570.19

A multi-room grand_total, grand_total_before_promotion and the prebook and booking tax totals can move by at most one minor unit for every two rooms. Single-room allocations and response fields do not change. See Breakdowns add up

2026-10-17: A booking states its tax

GET /bookings/{public_id}, the /book and cancellation responses and the booking webhooks now carry tax_total_exclusive, the part of stay_total that is tax collected with the booking, and tax_total_payable_at_property, the tax and fees the guest pays the property outside stay_total. Both are the amounts prebook stated, at the currency's minor unit, and 0.00 when none applies. Before, a booking stated only its total, so the split had to be kept from the prebook response. No existing field changes. See Taxes in the payable total.

2026-10-17: A multi-room allocation's tax adds up

The tax of an allocation is now rounded once for each inclusion mode and published as the breakdown of that figure: the slots' tax totals add up to the allocation's tax, and each slot's tax lines add up to that slot's totals. Before, each figure was rounded on its own, so two rooms with 3.6364 and 6.5454 EUR exclusive tax showed 3.64 and 6.55 while grand_total held 10.18; they now show 3.64 and 6.54. No payable total changes, and response fields are unchanged. See Taxes in the payable total.

2026-10-17: Places are addressed by the Adrasis place id

A place id you stored before this change no longer finds the place, and the old place field names are refused. Read GET /countries and GET /places again, replace the stored ids and send the new field names.

Every place is now addressed by its Adrasis place id, the place's entry in the Adrasis place dictionary as a decimal string such as "87066", the same in every environment, and every country by its ISO 3166-1 alpha-2 code such as "TR" (Property content). The fields that carry them are named for it. A request that still sends an old name answers 400 INVALID_REQUEST naming that field, and an error's field names the new field.

Operation Before Now
Countries public_id place_id, the ISO code
Places public_id, parent_public_id, the parent_public_id filter and the /places/{public_id} path place_id, parent_place_id, the parent_place_id filter and the /places/{place_id} path
Place search place_public_id, near.place_public_id, filters.place_public_ids, and public_id and parent_public_id in the response place place_id, near.place_id, filters.place_ids, and place_id and parent_place_id in the response place. The place facet keeps value, which carries the place id
Property content The place_public_id filter, and public_id in location.administrative_areas[] and location.destinations[] place_id in both
Service zones and tours public_id in region and airport place_id
MCP tools place_public_id, near.place_public_id and filters.place_public_ids in search_place_availability, place_public_id in list_properties, parent_public_id in list_places place_id, near.place_id, filters.place_ids, place_id and parent_place_id

2026-10-16: Basket tax totals follow the amounts collected

An accommodation basket's tax_total_exclusive now sums each selected unit's tax after rounding to the booking currency, matching the tax included in its payable total. Cancellation uses the same collected amount for each item. Two units with 258.4167 TRY tax each therefore report 516.84 TRY together. Response fields are unchanged. See Taxes in the payable total.

2026-10-15: Percentage taxes can include other charges

A property's percentage tax can apply to its room amount plus other charges, such as a service fee. Returned tax lines and payable totals account for this configuration, including when charges are already included in the price. Do not reconstruct every tax from the room amount alone. The response fields and inclusion modes are unchanged. See Taxes in the payable total.

2026-10-14: Tax names and charged-night limits

Accommodation tax lines use the property's configured name when present; otherwise label uses a general name in the requested language. Configured names are returned as written. Use the numeric tax fields for classification.

Tax amounts respect the configured limit on charged stay nights and child exemptions. Use the returned tax amount instead of extending a nightly amount over the entire stay. The tax line's fields and inclusion modes are unchanged. See Taxes in the payable total.

2026-10-14: Exclusive tax is included in the payable total

Accommodation grand_total now includes exclusive tax collected with the booking. Prebook exposes that tax as tax_total_exclusive, and the booking's stay_total carries the same payable total. Room and night amounts continue to describe the accommodation price. Tax payable at the property stays separate. Send the published grand_total in quoted; do not add tax again.

Allocation ranking still uses the accommodation amount before exclusive tax. A fixed tax per room can therefore make the winning allocation more expensive after tax than another choice. Cancellation refunds the cancelled stay's exclusive tax, including for a non-refundable rate; penalties remain based on the accommodation amount. See Taxes in the payable total.

2026-10-14: List and change-feed cursors are encrypted

Cursors were always opaque; the property list, booking list and change feed cursors are now encrypted as well, so they carry nothing readable. A cursor issued before this change is refused once: a property list or booking list cursor answers 400 INVALID_REQUEST (the booking list names cursor in field), so start the walk again from the first page; a change-feed cursor answers 409 CATALOG_VERSION_CHANGED, so rebuild the snapshot with a full GET /properties walk and continue from its changes_cursor. That walk also replaces any hotel id stored before the 2026-10-13 change.

2026-10-13: Hotels are addressed by the Adrasis hotel id

A hotel id you stored before this change no longer finds the hotel. Read the property list again and replace the stored ids.

Field names do not change; the hotel ids they carry do. Every hotel is now addressed by its Adrasis hotel id, the hotel's entry in the Adrasis catalog as a decimal string such as "72259", the same in every environment and for every seller on Adrasis (Property content).

Operation Change
Property list and detail, change feed A property's public_id, the /properties/{public_id} path and a property change's resource_public_id carry the hotel id
Offer search and availability check property_ids, the search path, every result's property_id and the availability check's property_public_id carry the hotel id
Prebook, booking list and webhooks property_public_id on the prebook offer, the booking list and the webhook event, and a subscription's property_id, carry the hotel id

2026-10-13: Place-search limits

Sorted and filtered place searches, including searches around a point, accept up to 10,000 visible properties and price up to 1,000 after ruling out unavailable properties. Exceeding either limit returns 400 PLACE_TOO_BROAD. Property-level filters can narrow the search; price, board and refundability filters apply after pricing and cannot reduce these counts. Catalogue-order paging remains unchanged. See Search a whole place.

2026-10-11: Tax amounts are backed out of tax-inclusive prices

Requests and responses keep their shape; some tax values change.

Operation Change
Offer search A tax already included in the price is now the part of the price it represents, price × rate / (1 + rate), not price × rate. A 1,000 TRY night with 10 percent VAT included shows 90.9091, not 100.00. A tax added on top or payable at the property is levied on the price without its included taxes: 1 percent accommodation tax on that night is 9.0909, not 10.00. Amounts in slots[].tax carry up to four decimals
Prebook tax_total_inclusive shows the corrected included tax of the stay

Prices, stay_total and grand_total do not change. Bookings made before this change keep the tax they were made with.

2026-10-11: Tours, transfers, flights and packages settle under your payment terms

A book request that was accepted before can now be refused: an account that does not settle on account with the seller can no longer book these products.

Operation Change
Tour, transfer, flight and package book The booking settles under your account's payment terms, as a property rate that requires a payment step does. When your account settles on account with the seller, the booking is invoiced to you and confirmed. Otherwise it answers 422 PAYMENT_INTENT_NOT_SUPPORTED and nothing is written
Tour, transfer, flight and package book New optional request field payment_intent_kind (PAY_AT_PROPERTY or INVOICE). It may confirm how the booking settles for your account, never change it: a different value answers 422 PAYMENT_INTENT_NOT_SUPPORTED with field payment_intent_kind. A request without the field is unchanged
Package book Each component keeps its own payment terms toward its supplier or hotel, so a prepaid stay in a package is never collected from the guest at the property

2026-10-11: The payment intent you send no longer overrides a rate's terms

A book request that was accepted before can now be refused. Omit payment_intent_kind to book on the rate's own terms.

Operation Change
Book payment_intent_kind may confirm how the rate settles for your account, never change it. The booking is settled as without the field: the rate's own terms, or INVOICE when the rate requires a payment step (policy_card.payment_intent_kind 1, 3 or 4) and your account settles on account with the seller. A different value answers 422 PAYMENT_INTENT_NOT_SUPPORTED with field payment_intent_kind. A request without the field is unchanged

2026-10-10: Prepaid rates for accounts that settle on account

Existing requests and responses keep their shape.

Operation Change
Book A rate whose terms require a payment step (policy_card.payment_intent_kind 1, 3 or 4) is booked when your account settles on account with the seller: it is invoiced to you and confirmed. Accounts without such terms keep 422 PAYMENT_INTENT_NOT_SUPPORTED
Prebook Answers 422 PAYMENT_INTENT_NOT_SUPPORTED for those rates when your account does not settle on account, the answer book would give, and issues no token

Pay-at-property and invoice rates are unchanged. See Booking flow.

2026-10-09: Full property room list and custom room selection

The single-property response changes in place on /api/v1. Read best_allocation and room_offers instead of allocations, has_more and best_allocation_only.

Operation Change
Property offer search Returns the best allocation for the whole party and every sellable room and rate plan product per requested occupancy, without a count cap
Prebook Accepts one selection_token for a whole-party allocation, or one to nine selection_tokens for individual rooms
Place filters Board and refundability filters inspect the full room list and retain a single matching allocation per property

Under strict, room lists follow the requested occupancy order. Under flexible, the single list prices the entire party in one room. If only a multi-room stay fits, that list is empty and best_allocation carries the recommendation. Each room product exposes selectable_quantity, the minimum remaining physical quantity across the stay. Products can share inventory.

Repeated unit tokens request additional physical rooms. All selections must share the property, stay and request context. Each room retains its own terms. Mixing pay-at-property and prepaid rooms returns 422 MIXED_SETTLEMENT.

Bulk property and place availability still return one allocation per property. Detail usage counts only the rooms in the best allocation, regardless of room-list length. Book, idempotent replay and whole-booking cancellation keep their existing endpoints.

2026-10-09: Search around a point, property notes and licence number

All three changes add optional request fields or new response fields; existing requests and responses keep their shape.

Operation Change
Place availability Takes near instead of place_public_id: a latitude and longitude, or any place with a point such as an airport or landmark, with radius_km from 0.1 to 50. Rows carry distance_km, distance_asc (nearest first) is the default order and the cursor is bound to the point. More properties than the cap inside the radius answer 400 PLACE_TOO_BROAD
Property content, list and detail Carry registry_number, the property's tourism licence number, when the property has one
Property content, detail Carries important_information: the property's notes still in force for the guest (check-in, guest requirements, deposits, fees, payment, pets, facilities), in the requested language, each with a stable category code

See Booking flow for near and Property content for the two content fields.

2026-10-07: Stable codes beside offer labels

Offer labels are worded in the requested language. Each now has a stable code beside it, and integrations branch on the code, never on the words:

Code Values Beside
confirmation_kind instant, on_request confirmation_label
position_kind free, partial, non_refundable position_label, the cancellation cost at the moment of the search
promotion_kind for example early_booker, last_minute, basic promotion_kind_label

Where to next