Use these steps to obtain a credential, request an access token, and call a live endpoint.
Base URL
The Distribution Partner API uses this base URL:
https://ari.console.adrasis.com/api/v1
Use HTTPS and application/json for JSON request bodies. Field names use
snake_case, dates use ISO 8601, and currencies use ISO 4217 codes. Resources
use opaque identifiers except hotels, places and countries. The Adrasis hotel
id is a decimal string such as "72259", including in a hotel's public_id or
property_public_id field. Store it as a string; see
Hotel id. A place is addressed by its Adrasis
place id, a decimal string such as "87066", and a country by its ISO code
such as "TR"; see Place id.
The access token identifies the partner account,
so requests do not need a tenant path segment or header.
Send Accept-Encoding: gzip (or br) with every request. Answers are then
compressed, and a large search answer travels at about a tenth of its size.
Without the header the answer is plain JSON.
Examples use illustrative IDs, tokens and dates. Use IDs from your own
catalogue, a fresh token and future travel dates when making a real request.
Response timestamps illustrate the example; let the server choose
request_time unless you need to preserve one evaluation instant.
Building and certifying
You build and certify in the certification environment. Its base URL and your certification credential come with your onboarding pack. It runs the same API version as live. Its catalogue holds the hotels named in your onboarding pack, with the same hotel ids as live and test rates and availability. Bookings there reach no property, hold no real allotment and generate no charges.
When running tests:
- Cancel every booking. A booking holds test allotment until it is cancelled.
Repeated tests that do not cancel can return
SOLD_OUT. - Use dates several months ahead to reduce collisions between test runs.
When certification passes, you receive a live credential for
https://ari.console.adrasis.com/api/v1. The integration flow stays the same;
the base URL, the credential and the catalogue change.
Partner certification lists the test cases to run, the information to show the traveller, and the evidence to send before going live.
Step 1: Obtain a credential
The seller you connect to issues your credentials from Connectivity > Sales channels > API partners in its Console and sends them to you. One account can own multiple independently named credentials; a credential never selects a profile. Each credential can have either or both scopes:
distribution:read: content, availability, and search endpoints.distribution:booking: prebook, book, and cancel endpoints.
Three authentication mechanisms are available:
| Mechanism | Use case |
|---|---|
| OAuth 2.0 client credentials (recommended) | Default for new integrations. Provides a client_id and client_secret. |
| HTTP Basic | For partners that cannot exchange credentials for a token. |
| API key | For simple machine-to-machine clients. |
The plaintext secret (client_secret, Basic password, or API key) is displayed
only once when the credential is created. Store it securely. If it is lost,
rotate the credential.
The examples below use OAuth 2.0. See Authentication for the Basic and API key options.
Step 2: Request an access token
Exchange the OAuth credential for an access token with the client_credentials
grant:
curl -s -X POST \
https://ari.console.adrasis.com/api/v1/oauth/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials' \
-d 'client_id=YOUR_CLIENT_ID' \
-d 'client_secret=YOUR_CLIENT_SECRET'
The response is a short-lived bearer token:
{
"access_token": "<ACCESS_TOKEN>",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "distribution:read distribution:booking",
"issued_at": 1748851200
}
The token is valid for expires_in seconds, which is 3600 in this example.
This grant does not issue a refresh token. Request a new access token after it
expires.
Step 3: Make an authenticated request
Send the token in the Authorization header.
List your properties
curl -s \
https://ari.console.adrasis.com/api/v1/properties?limit=2 \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
{
"properties": [
{
"public_id": "72259",
"name": "Grand Bosphorus Hotel",
"slug": "grand-bosphorus-hotel",
"star_rating": 5,
"property_type": {
"public_id": "propertyTypePublicId",
"code": "property_type.hotel",
"name": "Hotel"
},
"location": {
"country_code": "TR",
"latitude": "40.9906",
"longitude": "29.0274",
"address": "Caferağa, Kadıköy, İstanbul",
"administrative_areas": [
{
"place_id": "32937",
"place_type": "province_state",
"name": "Istanbul"
},
{
"place_id": "33481",
"place_type": "district",
"name": "Kadıköy"
},
{
"place_id": "33484",
"place_type": "neighborhood",
"name": "Caferağa"
}
],
"destinations": [
{
"place_id": "33481",
"place_type": "district",
"name": "Kadıköy"
},
{
"place_id": "87093",
"place_type": "city",
"name": "Istanbul"
},
{
"place_id": "32937",
"place_type": "province_state",
"name": "Istanbul"
}
]
},
"currency_code": "TRY",
"timezone_iana": "Europe/Istanbul",
"content_updated_at": "2026-06-01T08:30:00Z"
}
],
"pagination": {
"limit": 2,
"has_more": true,
"next_cursor": "<OPAQUE_CURSOR>"
}
}
When has_more is true, send the returned next_cursor unchanged as
cursor and repeat the first request's filters. Continue until has_more is
false; never parse or construct a cursor:
curl -s \
'https://ari.console.adrasis.com/api/v1/properties?limit=2&cursor=<OPAQUE_CURSOR>' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Or run an availability search
curl -s -X POST \
https://ari.console.adrasis.com/api/v1/properties/availability \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"property_ids": ["72259"],
"checkin": "2026-06-10",
"checkout": "2026-06-13",
"occupancy": [{ "adults": 2 }],
"allocation_strategy": "flexible",
"currency_code": "TRY",
"country_code": "TR"
}'
{
"currency_code": "TRY",
"request_time": "2026-06-02T12:00:00Z",
"selection_token_expires_at": "2026-06-02T12:15:00Z",
"results": [
{
"property_id": "72259",
"allocations": [
{
"allocation_id": "alc_5f3a9c1d8e7b4a2f6c0d9e8b7a6f5c4d",
"selection_token": "sel1.active.<opaque>",
"rooms": 1,
"strategy": "single-room",
"grand_total": "9000.00",
"grand_total_before_promotion": "9000.00",
"currency_code": "TRY",
"slots": [
{
"room_public_id": "r3Tz9Lm0",
"rate_plan_public_id": "rp_bar",
"currency_code": "TRY",
"stay_total": "9000.00",
"status": "AVAILABLE"
}
]
}
]
}
]
}
Bulk search accepts 1..200 unique property_ids and returns exactly the best
zero-or-one allocation per property. Add max_offers_per_property to also get
each property's cheapest offers, one room type and one rate plan each: 1 for
the cheapest, 10 for the ten cheapest, or "all" for every offer. Add
include: ["cancellation_quote", "selectable_quantity"] to get each slot's
cancellation terms and each allocation's rooms left; without them the answer is
exactly the one described here. It never accepts
max_offers, limit, or alternative breadth fields. allocations[0] has the lowest exact accommodation
amount. Its grand_total includes exclusive tax collected with the booking;
tax is added after ranking, so this is not a guarantee of the lowest total
after tax. To inspect choices for one property, use
POST /properties/{property_public_id}/offers/search, which returns
best_allocation and complete room_offers. Each room product carries a
selection_token and selectable_quantity. Prebook accepts either the
whole-party token or one to nine room tokens in selection_tokens.
In each slot, room_public_id and rate_plan_public_id together identify what
is offered. rate_plan_public_id is a sale condition (board, cancellation terms,
restrictions) shared by the rooms it is sold in, so it repeats across the rooms
that sell it; see
Currencies, occupancy & allocations.
Pass the chosen selection_token, not allocation_id or reconstructed search
fields, to accommodation prebook. Then pass the returned prebook_token to
book. See The booking flow for the complete request.
Next steps
- Authentication: token lifecycle, scopes, Basic authentication, and API keys.
- Property content: catalogue creation and delta refreshes.
- The booking flow: search, prebook, book, and cancel.
- Idempotency: safe retries for
POST /book. - Errors: error format and status codes.