Apify Toolkits

Booking.com

Every column this Actor can return, by mode, as the deployed build emits it.

Describes build 1.0.173 of rl1987/booking-api-scraper, deployed 2026-10-29. The column set last changed 2026-10-29. Earlier builds can return a different one.

Every column this Actor can return, by mode, as the deployed build emits it.

120 columns documented across 6 row kinds.

Row kindModesColumns
Accommodationssearch, rooms, details, surroundings38
Reviews & scoresreviews, reviewScores, or search with the review toggles13
Watched ratesrates27
Attractionsattractions31
Attraction detailsattractionDetails57
Attraction availabilityattractionAvailability20

The pages that are not column tables

None of these is a property of a single column, so none of them is generated — and they are where most questions actually get answered.

pageanswers
Input referenceevery input, what it does, and which ones add a charge event
Recipeseight worked runs with the input that produces each
The price stackwhat is inside the amount the guest pays, what sits on top, and what is outside it entirely
What each mode billsmode to charge event, and what one unit is
Known limitationswhat this surface cannot give, with the measurement that says so

Numeric ids — accommodation type, room type, bed type, charge type, payment card — are tabled separately in the integer ID reference .

Annotated screenshots of the app, with each number on screen joined to the field that produced it, are on the screenshots page - the place to look when you want to know which column matches a price a buyer can see.

How to read these

One dataset can hold several kinds of row. A run produces one kind, but if you combine datasets, read recordType first: it is absent on property rows and rate, attraction, attractionDetail or attractionAvailability otherwise.

A column absent from a row is normal. Most columns belong to one mode. Nothing in the schema is required, and no row is ever rejected for shape.

The objects inside a row are documented too. A column carrying an object or a list of objects — rooms[], products[], price — has a table per level under Inside the nested columns on its page, with a tree of the nesting, a parent chain on each table, and a pointer from a parent row to the table it continues in. That is where rooms[].areas[].beds[] and products[].policies.meal_plan.offers[] are described field by field.

A few column names mean different things by row kind, and the descriptions say which:

The ones worth reading before you use the data

What these were checked against

A field description is a claim about a surface a buyer can look at, so it is worth saying which surface. The Actor calls Booking’s mobile app endpoints, and the app and the website are different points of sale that legitimately disagree about the same rate - measured on one property on one night, the app struck through MYR 173 and badged “MYR 46 off” where the web page struck through EUR 31 and badged “9% off”. The app is the reference here; a disagreement with the website is not a defect in these columns.

Accommodation claims rest on three arms that could have disagreed: the app driven in an instrumented emulator, which is where the MYR figures above were read off the screen; an independent third-party dataset, which matched on 27 of 27 prices and 15 of 15 bed configurations; and Booking’s own connector, which matched one property to the cent. A screen-by-screen table pairing every on-screen value to the response field behind it does not exist yet - the price claim above is the one that has been checked that way.

Attraction claims have no app surface to check against. The Attractions tab is reachable in the app and its destination search is native, but selecting a destination hands off to a WebView on the booking.com web surface - there is no native product page or availability calendar to screenshot. For attractions the web page is therefore the only rendered surface, and the right one. Where a column is empty on every product measured, the page says so rather than implying it will fill.

Accommodations

One row per property. The search modes produce the whole row; the enrichment modes produce the id, the stay and the block you asked for, so join those back on id.

Read it →

Attraction availability

Day-level bookability over a window, optionally with timeslots. Each timeslot date is a separate upstream request, capped at 14.

Read it →

Attraction details

The full attraction record. Several columns are empty on every product measured because the upstream does not fill them — each says so.

Read it →

Attractions

One row per attraction in the catalogue search.

Read it →

Input reference

Every input the Booking.com scraper takes, what it does, and which ones add a charge event - the part a generated field description cannot carry.

Read it →

Integer ID reference

Every numeric vocabulary this Actor maps to a name, how complete each map is, and how we know.

Read it →

Known limitations

What this surface cannot give you, with the measurement that says so - starting with roomList returning bookable room types rather than the property catalogue.

Read it →

Recipes

Eight worked Booking.com runs, each with the exact input that produces it: family stays, price monitoring, cheapest well-rated hotels, apartments only, reviews, radius search, full enrichment, and sold-out detection.

Read it →

Reviews & scores

Guest reviews and the per-category subscores. In the enrichment modes the row carries only id, the stay and the review block.

Read it →

The price stack

What is inside the amount a guest pays, what Booking adds on top, and what sits outside it entirely - with the field holding each, and the one column to reconcile against.

Read it →

Watched rates

One row per watched product id: whether that exact rate is still on sale for your stay, and at what price. A rate that has gone still occupies a full row, with status and reason saying why.

Read it →

What each mode bills

Mode to charge event for all ten Booking.com scraper modes, what one unit is, and which events are not priced yet. No figures - the Pricing tab is generated.

Read it →

What the buyer sees, and which field produced it

Captured from the Booking Android app on 2026-10-23, driven in an instrumented emulator with the traffic recorded alongside, so each number on screen is joined to the response it came from rather than matched by eye.

Read it →