Certification shows that your integration can search, prebook, book, read and cancel a hotel stay, and can retry without creating a duplicate booking. You run it in the certification environment and send us the result. When it passes, you receive a live credential.
Before you start
Your onboarding pack gives you the certification base URL, a credential and the hotels to book for each case. See Building and certifying.
- Bookings there reach no real property and nothing is charged.
- Search with
allocation_strategy: "strict"and send oneoccupancyentry per room. - Send your own
agency_referenceon every book. C7 and the result sheet use it. - Cancel every booking you make, and use fictitious traveller names.
- Send an
X-Request-Idheader on every call, for examplecert-c1-book. We use it to find your calls in our records.
The cases
Each booking case runs search, prebook, book, booking read, cancellation quote
and cancel, and ends CANCELLED.
| Case | Rooms and party | occupancy |
Check |
|---|---|---|---|
| C1 | 1 room: 2 adults, refundable rate | [{"adults": 2}] |
Inside the free window, the cancellation quote fee is "0.00" |
| C2 | 1 room: 2 adults, children aged 5 and 7 | [{"adults": 2, "child_ages": [5, 7]}] |
The child ages come back unchanged on prebook and on the booking |
| C3 | 2 rooms: 2 adults; 2 adults, children aged 5 and 7 | [{"adults": 2}, {"adults": 2, "child_ages": [5, 7]}] |
One booking with both rooms in request order; the booking stay_total equals the prebook offer.grand_total |
| C4 | 3 rooms: 3 adults; 2 adults, child aged 5; 2 adults | [{"adults": 3}, {"adults": 2, "child_ages": [5]}, {"adults": 2}] |
Three rooms in request order. Record the total prebook returned: a combination is rounded once over its rooms, so it can differ by a cent from the same rooms chosen one by one |
| C5 | 1 room: 2 adults, non-refundable rate | [{"adults": 2}] |
The offer's slots[].policy_card.refundability is non_refundable; cancelling charges the accommodation amount and refunds any exclusive tax collected with the stay. refund_due is "0.00" only when no such tax was collected |
| C6 | Retry of C1's book | The same body with the same Idempotency-Key returns 200 and the same booking. The same key with a changed body returns 409 IDEMPOTENCY_KEY_CONFLICT |
|
| C7 | Lookup by your reference | GET /bookings?agency_reference=<C1 reference> returns the C1 booking |
If a case finds no availability on your dates, ask your onboarding contact for other dates.
What your integration must handle
410 SOLD_OUTor410 SELECTION_TOKEN_EXPIREDat prebook: search again.match_statusPRICE_CHANGEDat prebook: show the new price and book only after the traveller accepts it.- A timeout on book: resend the same body with the same
Idempotency-Key, or look the booking up byagency_referencebefore booking again. See Idempotency. 429: wait forRetry-Afterbefore retrying. See Rate limits & usage.
Show the traveller, before booking and on the voucher: the hotel, room, board,
party, dates, the payable offer.grand_total prebook returned, any tax payable
at the property (slots[].tax.total_payable_at_property on the search offer),
and the cancellation terms. Exclusive tax is already inside grand_total;
do not add it again. Mark a non-refundable rate as
non-refundable, and show cancellation deadlines on the property's clock. See
The booking flow.
What to send
- Result sheet: one row per booking with the case, booking
public_idandbooking_number, youragency_reference, dates, party, total and currency, the cancellation terms you showed, and the final status. - Logs: the request and response of every call, with tokens, secrets and
real personal data replaced by
***.
We compare them with our own booking records and reply with the review. When it
passes, you receive a live credential for
https://ari.console.adrasis.com/api/v1 with the same authentication
mechanism, and we watch your first live booking with you.