Booking.com All-in-One API avatar

Booking.com All-in-One API

Pricing

from $39.00 / 1,000 hotels

Go to Apify Store
Booking.com All-in-One API

Booking.com All-in-One API

Unofficial always-on REST API for live Booking.com data: hotel search (real price/amenity filters + sort), hotel detail, paginated reviews, flights, car rentals, airport taxi, and attractions — search and full detail. Real multi-region pricing, no account needed.

Pricing

from $39.00 / 1,000 hotels

Rating

0.0

(0)

Developer

Romy

Romy

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

10 days ago

Last modified

Categories

Share

What does Booking.com All-in-One API do?

Booking.com All-in-One API is a REST endpoint for live Booking.com data — destination search, hotel search with real price/amenity filters and sort, full hotel detail, paginated reviews with topic filters, plus flights, car rentals, airport taxi, and attractions search. All from a single always-on API powered by Apify Standby.

It talks directly to the same internal API the official Booking.com Android app uses, reverse-engineered by capturing live traffic from a real device. Auth uses a standard, publicly-documented token-exchange mechanism — not a proprietary signing scheme — generated fresh server-side. No Booking.com account, no API key of your own, and not limited to one region — call the endpoint, get JSON back.

Why use Booking.com All-in-One API?

  • Real filters and sort that genuinely work — price range and sort order confirmed live by comparing results before/after: a narrower price range returns fewer, correctly-bounded properties, not an ignored parameter
  • Real multi-region pricing — confirmed live: an identical search with different currency codes (USD/EUR/IDR tested) returns genuinely different prices for the same rooms, not a symbol swap
  • Real paginated reviews — confirmed live end-to-end: requesting the next page of reviews returns entirely new review ids with zero overlap with the previous page, using Booking.com's own real offset-based pagination
  • A dedicated review-topic filter endpoint — the same topic/category breakdown (with counts) the app's own review-filter screen shows
  • Four more verticals beyond hotels — flights, car rentals, airport taxi, and attractions are each a genuinely separate backend, confirmed live by opening every tab in the app and capturing real traffic — every one returns real, current prices matching the app's own screen
  • Always-on — Standby mode means no cold start, responds in milliseconds
  • No account needed — every endpoint works fully anonymously
  • Use cases: travel content aggregation, price monitoring across currencies, review analysis, destination research bots

Endpoints

MethodPathDescription
GET/searchDestination autocomplete
GET/homeHome tab feed
GET/hotelsHotel search for a destination, with real filters/sort
GET/hotels/{id}Full hotel detail
GET/hotels/{id}/reviewsPaginated hotel reviews
GET/hotels/{id}/reviews/filtersReview-topic filter schema for one hotel
GET/flights/search-locationsFlight-specific airport/city autocomplete
GET/flightsRound-trip or one-way flight search
GET/flights/detailFull flight detail — baggage policy, fare rules
GET/car-rentals/search-locationsCar rental pickup-location autocomplete
GET/car-rentalsCar rental search
GET/car-rentals/detailFull car detail — specs, inclusions, cancellation terms
GET/taxi/search-locationsAirport taxi location resolution (Google Place ID)
GET/taxi/ratesAirport taxi prices for a route
GET/attractionsThings-to-do search
GET/attractions/{slug}Full attraction detail
GET/attractions/{id}/reviewsPaginated attraction reviews
GET/attractions/{id}/reviews/filtersReview filter/sort schema for one attraction

How to use Booking.com All-in-One API

  1. Open this Actor's Standby API URL (shown on the Actor's page, under the API tab).
  2. Call any endpoint — for example:
    curl "https://romy--booking-all-in-one-api.apify.actor/search?query=Bangkok"
    curl "https://romy--booking-all-in-one-api.apify.actor/home"
    curl "https://romy--booking-all-in-one-api.apify.actor/hotels?dest_id=-3414440&dest_name=Bangkok"
    curl "https://romy--booking-all-in-one-api.apify.actor/hotels?dest_id=-3414440&dest_name=Bangkok&price_min=50&price_max=150&currency=USD"
    curl "https://romy--booking-all-in-one-api.apify.actor/hotels/27229"
    curl "https://romy--booking-all-in-one-api.apify.actor/hotels/27229/reviews?rows=25&offset=25"
    curl "https://romy--booking-all-in-one-api.apify.actor/hotels/27229/reviews/filters"
    curl "https://romy--booking-all-in-one-api.apify.actor/flights/search-locations?q=Bangkok"
    curl "https://romy--booking-all-in-one-api.apify.actor/flights?from=BKK.AIRPORT&to=SIN.CITY&depart=2026-09-19&return=2026-09-26&currency=USD"
    # /flights/detail needs a token field copied from a /flights result — e.g. flightOffers[0].token
    curl "https://romy--booking-all-in-one-api.apify.actor/flights/detail?token=<token from a /flights result>"
    curl "https://romy--booking-all-in-one-api.apify.actor/car-rentals/search-locations?term=Bangkok"
    curl "https://romy--booking-all-in-one-api.apify.actor/car-rentals?location=Bangkok&lat=13.7563&lng=100.5018&pickup=2026-09-24T10:00:00.000Z&dropoff=2026-09-27T10:00:00.000Z&currency=USD"
    # /car-rentals/detail needs search_key + vehicle_id copied from a /car-rentals result
    curl "https://romy--booking-all-in-one-api.apify.actor/car-rentals/detail?search_key=<search_context.searchKey from a /car-rentals result>&vehicle_id=<content.metadata.vehicleId from the same result>"
    curl "https://romy--booking-all-in-one-api.apify.actor/taxi/search-locations?q=Sukhumvit&lat=13.6934&lng=100.751"
    curl "https://romy--booking-all-in-one-api.apify.actor/taxi/rates?pickup=Suvarnabhumi%20Airport&pickup_place_id=ChIJTydCFXdnHTERB3oVT1UZDRI&dropoff=Sukhumvit%20Soi%2011&dropoff_place_id=ChIJ5yhiwOae4jARWAUxwZD2wE4&pickup_datetime=2026-09-19T10:00:00"
    curl "https://romy--booking-all-in-one-api.apify.actor/attractions?ufi=-3414440"
    curl "https://romy--booking-all-in-one-api.apify.actor/attractions/prvajppfwe7k-the-newest-luxury-5-star-bangkok-chao-phraya-dinner-cruise"
    curl "https://romy--booking-all-in-one-api.apify.actor/attractions/PRvAjpPfwE7K/reviews?rating=5"
    curl "https://romy--booking-all-in-one-api.apify.actor/attractions/PRvAjpPfwE7K/reviews/filters"
    Every call needs your Apify API token, either as Authorization: Bearer <token> or ?token=<token> — the Actor's page API tab has a ready-to-copy version with your token filled in.
  3. Read the JSON response — no setup required.

Parameters

GET /searchquery required (free-text destination name).

GET /home — no required parameters.

GET /hotelsdest_id required (from /search).

ParamTypeExampleMeaning
dest_idstring-3414440From /search
dest_namestringBangkok
checkin / checkoutstring (date)2026-09-08YYYY-MM-DD, default tomorrow/day-after
adultsint, default 22
roomsint, default 11
price_min / price_maxint50 / 150Confirmed live to genuinely narrow results
sortstringbest_valueConfirmed live values: popularity, best_value, price
currencystringUSDConfirmed live to change returned prices — works for any region, not just one

GET /hotels/{id}id required (a hotel id from /hotels). currency optional.

GET /hotels/{id}/reviewsid required.

ParamTypeExampleMeaning
offsetint, default 025Confirmed live: real pagination, zero id overlap between offsets
rowsint, default 2525Reviews per page
ratingstringFilter to one review-score band

GET /hotels/{id}/reviews/filtersid required. Returns the review-topic breakdown (with counts) for that hotel.

GET /flights/search-locationsq required (free-text). type optional (from/to) — narrows suggestions by leg.

GET /flightsfrom, to, depart required.

ParamTypeExampleMeaning
from / tostringBKK.AIRPORT / SIN.CITYFrom /flights/search-locations
departstring (date)2026-09-19YYYY-MM-DD
returnstring (date)2026-09-26Omit for a one-way search
adultsint, default 11
cabin_classstring, default ECONOMYECONOMYECONOMY | PREMIUM_ECONOMY | BUSINESS | FIRST
sortstring, default BESTCHEAPESTBEST | CHEAPEST | FASTEST
pageint, default 11
currencystringUSDConfirmed live to change returned prices — a real ISO code, not just a display label

GET /flights/detailtoken required, the opaque token field from a /flights result (also duplicated as flightDeals[].offerToken). Returns full baggage policy and fare rules. Its currency is already baked into the token from whichever /flights search produced it — there's no separate currency param here.

GET /car-rentals/search-locationsterm required (free-text).

GET /car-rentalslocation, lat, lng, pickup, dropoff required.

ParamTypeExampleMeaning
locationstringBangkokFrom /car-rentals/search-locations
lat / lngnumber13.7563 / 100.5018Pickup coordinates
pickup / dropoffstring (ISO 8601)2026-09-24T10:00:00.000ZPickup/drop-off datetime
driver_ageint, default 3030
currencystring, default HOTELUSDConfirmed live to change returned prices

GET /car-rentals/detailsearch_key and vehicle_id both required, both copied as-is from a /car-rentals result (search_key is that response's own search_context.searchKey; vehicle_id is one result card's content.metadata.vehicleId). Returns full specs, what's included, and cancellation terms. Confirmed live: the same search_key works for every vehicle_id from that same search. currency optional, default HOTEL, confirmed live to change returned prices.

GET /taxi/search-locationsq required (free-text). lat/lng optional, bias suggestions toward a reference point.

GET /taxi/ratespickup, pickup_place_id, dropoff, dropoff_place_id, pickup_datetime required.

ParamTypeExampleMeaning
pickup / dropoffstringSuvarnabhumi AirportFree-text label
pickup_place_id / dropoff_place_idstringChIJTydCFXdnHTERB3oVT1UZDRIGoogle Place ID, from /taxi/search-locations
pickup_datetimestring2026-09-19T10:00:00A time too close to now can legitimately return "no suppliers available" — a real availability constraint, not a bug
passengersint, default 12
currencystring, default HOTELUSD

GET /attractionsufi required (from /search, same id space as hotels' dest_id).

GET /attractions/{slug}slug required, the FULL slug string from an /attractions search result (e.g. prvajppfwe7k-the-newest-...). Confirmed live: the short id field alone does not resolve here (404) — the full slug is genuinely required.

GET /attractions/{id}/reviewsid required, but here it's the SHORT id field from a search result (e.g. PRvAjpPfwE7K), not the slug used for detail above — the two endpoints genuinely need different identifiers from the same search result.

ParamTypeExampleMeaning
pageint, default 12Real pagination — confirmed live, zero id overlap between pages
limitint, default 2010Reviews per page
ratingstring5An option id from /attractions/{id}/reviews/filters's "score" filter group — confirmed live to genuinely narrow results, not just echo the parameter back

GET /attractions/{id}/reviews/filtersid required, same short id as above.

ParamTypeExampleMeaning
ufiint-3414440Destination id
pageint, default 11
limitint, default 2020

Output

{
"success": true,
"list": {
"total": 20,
"properties": [
{ "id": 27229, "name": "Ambassador Hotel Bangkok" }
],
"raw": { "...": "full server-driven-UI response, for anything not already pulled into properties[]" }
}
}

Data notes

  • Auth is a standard token-exchange flow, not a proprietary scheme. A one-time anonymous request (self-generated device id only, no account) returns a short-lived access token — confirmed live and standalone-reproducible with a brand-new device id, no prior registration. This Actor renews by requesting a fresh token shortly before the cached one expires, generated entirely server-side.
  • Real filters and sort, confirmed live. A price range narrows returned properties to that bound (compared results before/after); sort order genuinely reorders results.
  • Multi-region pricing confirmed live. The exact same search with different currency codes returns genuinely different prices for the same rooms — this Actor isn't limited to one region's pricing.
  • currency is also a real, caller-controlled parameter on /flights, /car-rentals, and /car-rentals/detail, confirmed live with the same before/after price comparison used for hotels — e.g. the exact same flight search returned 176 USD vs 3,359,469 IDR, and the same car rental returned US$78 vs Rp 1,386,012. /flights/detail's currency is inherited from whichever /flights search produced its token, not independently settable. Attractions has no equivalent — three different ways of passing a currency override (as a search-input field, as a context field, and as a query-string parameter matching the pattern used elsewhere on the same host) were each tried live and every one was rejected by the API's own input validation, so prices there reflect a fixed account-level currency this Actor cannot override. Documented here rather than silently omitted.
  • The search/list response is a nested component tree, not a flat array — this Actor walks it and returns a clean properties[] array of the structured fields (id, name, price, rating) callers actually want, alongside the full raw tree for anything not yet extracted.
  • Room photos are already included in the hotel-detail response — no separate photo-gallery call needed for the room-level photo set the app itself shows on the detail screen.
  • Review pagination is real offset-based paging, confirmed live end-to-end — requesting the next offset returns entirely new review ids, zero overlap with the previous page.
  • The review-topic filter schema is a genuinely separate endpoint, confirmed live — it isn't bundled into the reviews or search responses.
  • Flights, car rentals, airport taxi, and attractions are each a genuinely separate backend from hotels, confirmed live by opening every tab in the app and capturing real traffic — not a re-skin of the hotel search. All four were confirmed standalone-reproducible with no session cookies at all, using only the same access-token headers hotels already need (flights and car rentals do use their own separate app-level credential from hotels; airport taxi and attractions reuse the hotel one, since both ride on the same underlying host).
  • Flight search filter/sort options and the attractions search filter/sort schema both come embedded in their own search response (includeAllFilterValues/extractFilterOptions), same self-describing pattern as the hotel vertical's price-range filter — no separate schema endpoint needed for either. This is distinct from attraction review filters (below), which do need a separate call.
  • Airport taxi needs a two-step flow, same as the app itself: resolve pickup/drop-off to a Google Place ID via /taxi/search-locations first, then pass both ids to /taxi/rates. Confirmed live: prices matched the app's own screen exactly for a real Suvarnabhumi Airport → Sukhumvit search.
  • Attraction detail and reviews are genuinely separate operations from search, each needing a different identifier from the same search result. /attractions/{slug} needs the full slug string; /attractions/{id}/reviews and its filters need the short id field instead — confirmed live that the short id alone does not resolve as a slug (404), so both fields genuinely have to be passed through from a search result as-is, not derived from each other.
  • Attraction review pagination is real page/pageSize paging, confirmed live end-to-end — 20 reviews per page, zero id overlap between pages.
  • The attraction review filter schema is a genuinely separate endpoint from both the reviews and the search-result filters, confirmed live — and its rating filter genuinely narrows results (verified: a 5-star filter and a 1-star filter returned completely different review ids and ratings), not just an echoed-back parameter.
  • /flights/detail and /car-rentals/detail both need an opaque identifier copied as-is from their respective search result, not constructed client-side. /flights/detail's token comes straight from a /flights result's own token field; /car-rentals/detail needs both search_key (the search response's own search_context.searchKey) and vehicle_id (a result card's content.metadata.vehicleId). Confirmed live for car rentals: the same search_key works for every vehicle_id from that same search, so no per-vehicle re-derivation is needed.
  • Attraction review pagination is real page/pageSize paging, confirmed live end-to-end — 20 reviews per page, zero id overlap between pages.
  • The attraction review filter schema is a genuinely separate endpoint from both the reviews and the search-result filters, confirmed live — and its rating filter genuinely narrows results (verified: a 5-star filter and a 1-star filter returned completely different review ids and ratings), not just an echoed-back parameter.

Pricing

Pay-per-event, billed on each successful call. See the Actor's Pricing tab for current rates.

Known limitations

  • This Actor only wraps guest-accessible endpoints. No login flow is implemented or planned — features requiring a real Booking.com account (saved properties, writing reviews, booking) are out of scope by design.
  • Restaurants and attractions aren't covered. Booking.com's mobile app is hotel-focused — its car rental/flights/taxi tabs are separate integrations outside this Actor's scope, and no dedicated restaurant/attraction browsing surface was found in the app. Correction: found in a later pass. An earlier version of this README reported flights/car rentals/taxi/attractions as out of scope after the first build only covered hotels. All four turned out to be genuinely real, separate backends — see the Endpoints table above. Restaurant browsing specifically still wasn't found as a distinct surface in the app.
  • This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Booking.com B.V. Behavior may change if Booking.com changes its API.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.