Integration Guide
Everything you need to go from first API call to go-live with the Booking Engine.
The Booking Engine is ZentrumHub's full-stack hotel commerce backend. You bring your supplier contracts — we handle aggregation, deduplication, business logic, markup rules, and currency conversion. Your team integrates one API set; we take care of the rest.
Four stages from sandbox to live
Most teams go live in 4–8 weeks depending on the number of suppliers and internal review cycles.
Sandbox
Receive API credentials, demo channel, Postman collection, Kibana access, and back office access. Meet your Tech Onboarding Manager.
Build
Integrate the full API flow using demo supplier credentials. Raise questions via your dedicated Slack or Teams channel.
Certify
Run required booking scenarios on your live account with real refundable bookings. Submit screenshots and correlation IDs for review.
Go Live
ZentrumHub configures your live supplier credentials. Your production channel is ready. Support moves to [email protected].
What you receive on sign-up
Everything your tech team needs to start integrating from day one.
API Key & Account IDs
Auto-generated on account creation. Two account IDs: one sandbox, one production — both running on prod infrastructure.
Demo Channel & Postman Collection
Pre-configured demo suppliers so your tech team can explore the API immediately, before real supplier credentials are ready.
Kibana Log Access
Full visibility into every request made on your behalf — including what we sent to each supplier and what they returned. Logs retained for 5 days.
Back Office Access
Manage markups, discounts, relevance rules, content preferences, and disabled hotels — without touching the API.
Core concepts before you integrate
Understanding these will make the API flow click into place.
Account Structure Client → Account IDs → Providers → Channels
A client can have multiple account IDs (sandbox and live). Each account has providers — your individual supplier contracts configured by ZentrumHub — and channels, which are logical groupings of those providers with their own business rules.
A channel is your line of business. You pass a channelId in every API call to tell the engine which suppliers to use and which markup and discount rules to apply. One provider can belong to multiple channels; one channel can have one or many providers. Examples: a geography-based channel that only calls suppliers with strong European inventory, or a premium channel that applies higher markups for VIP customers.
Search Types How the engine knows where to look
Every search needs coordinates, not just a destination name. That is why Autosuggest exists — it maps text input to precise location data that drives the search.
Circular — a centre lat/long plus a radius in kilometres. Use for hotel or point-of-interest searches where you want results within a tight area.
Polygon — the full boundary of a city as a coordinate set. More precise than circular because it respects actual city limits.
Multi-polygon — like polygon, but for fragmented areas where parts of a city or region are geographically separated.
Hotel ID — bypass location entirely and fetch a specific hotel directly. Used for hotel detail pages and promotions.
Rule of thumb: if Autosuggest returns type city, use polygon. If it returns hotel or pointOfInterest, use circular with a 2–5 km radius.
Search Mode Asynchronous vs Blocking
Asynchronous (recommended) — fire the search, receive a token immediately, then poll every 500 ms. Results stream in as suppliers respond. The token stays valid for one hour. Status will be InProgress until all suppliers have responded, then Completed — stop polling at that point. The first response is capped at 50 hotels so something renders on screen quickly; subsequent polls return the next batch.
Blocking — the API waits for all configured suppliers to respond before returning anything. Simpler to implement but slower. Appropriate when wait time is not a concern.
Rooms & Rates Five objects, one response
The Rooms & Rates API is the most complex in the engine. Here is what each object means:
Rooms — raw room data from all configured suppliers. If 5 suppliers return the same king room, you will see it 5 times here.
Rates — raw rate data across all suppliers. In multi-room searches a single recommendation can have multiple rate IDs, because some suppliers bundle all rooms into one rate while others give a separate rate per room. Always check occupancies to confirm how many rooms a rate covers.
Recommendations — ZentrumHub's deduped unique rate plans. One recommendation equals the cheapest rate for a specific combination of room type, board basis, and refundability across all suppliers. This is the engine's core business logic.
Standardised Rooms — mapping-service-normalised unique rooms. From 50 raw rooms across 10 suppliers you get the actual 5 unique rooms. Mapping service integration is mandatory for multi-supplier setups.
Standardised Room Groups (recommended) — the developer-friendly object that combines standardised rooms with their available rate plan options and a pre-calculated total. Sorted cheapest to highest. Use this as your primary implementation path — it removes the need to manually cross-reference recommendations against rooms.
The full API sequence
Every hotel booking follows this path. Each step links to its dedicated API page.
Autosuggest
User types a destination. Trigger after 3 or more keystrokes. Returns results with a type field (city, hotel, pointOfInterest, airport) and coordinates. The type determines which search mode to use in step 3. This is not mandatory call. we can trigger search API using coordinates, you can choose to have google API or similar services
Get Location Details
Pass the location ID from Autosuggest to retrieve the full polygon boundary. Required only for city-level searches. Not needed for hotel or point-of-interest searches.
Search Init + Static Content (call in parallel)
Search Init
Fires the search against all configured suppliers. Returns a search token immediately. Use this token to poll for availability results.
Static Content
Returns hotel names, images, star ratings, and amenities. Calling this in parallel means the UI can show hotel cards while rates are still loading.
Poll Search Results
Use the search token to poll every 500 ms. Results arrive in batches — first response is capped at 50 hotels. Continue polling until status is Completed. If a later supplier returns the same hotel at a better rate, the isNewHotel flag will be true — replace the existing entry.
Rooms & Rates
User selects a hotel. Fetches all available rooms and rates from all configured suppliers, deduplicates, and returns the five objects described above. Use Standardised Room Groups as your primary data source for the room selection UI.
Pricing — mandatory pre-book check
User reaches checkout. Always call Pricing before initiating a booking. This validates the selected rate against the supplier in real time. If the rate has changed, the response will reflect the new price so you can show it to the user before they confirm. Skipping this step will cause bookings to fail when rates have moved.
BookInit — recommended
User clicks pay. Call BookInit first. For suppliers that support hold bookings, this reserves the rate for up to 10 minutes while the customer completes payment. For other suppliers it creates a database entry with no supplier action. Implement it regardless — when additional suppliers adopt hold booking functionality you will be ready with no code changes.
Book
Payment confirmed. Fire the Book call. Same request structure as BookInit. ZentrumHub submits the booking to the supplier and returns a bookingId and confirmation voucher.
Get Booking Details
Two use cases: powering your My Trips page, and ghost booking recovery. If Book returns a failure or timeout, do not show a hard error immediately — poll this endpoint every 10–15 seconds for up to 5 minutes. The supplier may have completed the booking in the background after the timeout.
Cancellation Policy + Cancel
Fetch the cancellation penalty before presenting cancel options to the user. Then call Cancel with the bookingId to complete the cancellation.
Integration best practices
The most common mistakes that generate support tickets — avoid them from the start.
⚠️ Always call Pricing before Book
Rates change between Rooms & Rates and checkout. If you skip Pricing and the rate has moved, the booking will fail. Always run the price check as the user lands on the checkout page.
🔁 Implement BookInit regardless of supplier
Even if your current suppliers do not support hold bookings, implement the BookInit call now. When additional suppliers adopt this, you will be ready with zero code changes.
👻 Handle ghost bookings
If a Book call times out or fails, do not show a hard error. Poll Get Booking Details every 10–15 seconds for up to 5 minutes — the supplier may have completed the booking after the timeout.
🔍 Use correlationId across the full flow
Pass a consistent correlationId header from search through to cancellation. This is how ZentrumHub support traces any issue in logs. Without it, debugging takes significantly longer.
📋 Certification — required before go-live
Before ZentrumHub enables your live supplier credentials, your integration must pass a certification review. This protects you from costly debit notes caused by display errors — incorrect cancellation policies, wrong pricing, missing refundability flags.
Complete the required scenarios on your production account using real refundable bookings: single room (2 adults, 1 night) and multi-room with a child (2A+1C and 1A+2C, 2 nights).
Submit screenshots of each page — Search, Hotel Details, Checkout, Booking Confirmation, My Trips, and Cancellation — along with the bookingId and correlationId for each scenario.
Submit within 5 days of your search — certification logs are only retained for 5 days.
Email to [email protected] and CC your Tech Onboarding Manager. The product team reviews and confirms readiness for go-live.
Updated 24 days ago