Guest reviews and the per-category subscores. In the enrichment modes the row carries only id, the stay and the review block.
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.
Modes: reviews, reviewScores, or search with the review toggles
Dataset view: reviews — ?view=reviews on the items API, or the matching tab in the Console.
Guest reviews and the per-category subscores. In the enrichment modes the row carries only id, the stay and the review block.
13 columns, in the order the view shows them.
| # | Column | Label | Type | Description | Example |
|---|---|---|---|---|---|
| 1 | scrapedAt | Scraped at | string, nullable | When the response that produced this row came back - the PRICED response where the row has a price, not when the row was pushed, which is batched and later by seconds to minutes. ISO-8601 UTC, to milliseconds. Note Booking’s own date strings in the same row are NOT ISO (freeCancellationUntil is “2026-10-28 23:59:59 +0000”), so do not point one parser at both. Prices are fetched live - nothing in this Actor is cached or reused - so this is the age of the price, and a dataset read a week later does not refresh it. | 2026-10-27T12:53:42.118Z |
| 2 | scrapedAtUnix | Scraped at (epoch) | integer, nullable | The same instant as scrapedAt, in epoch SECONDS, for consumers that diff timestamps arithmetically. Two keys rather than one selectable format, so a column’s type never moves with a run setting and two datasets always join. | 1793105622 |
| 3 | id | ID | integer | number, nullable | Booking’s own numeric property id, stable across runs and the key to join enrichment rows back onto a search row. | 9176203 |
| 4 | name | Name | string, nullable | Property name on a property row; the attraction name on an attraction row. | AIRINN Vilnius Airport Hotel RENOVATED 2025 |
| 5 | checkin | Check-in | string, nullable | Stay start, yyyy-mm-dd, echoed from the input. | 2026-10-31 |
| 6 | checkout | Check-out | string, nullable | Stay end, yyyy-mm-dd, echoed from the input. | 2026-11-01 |
| 7 | reviewScore | Review score | number, nullable | Booking’s guest score, 0-10. | 9.3 |
| 8 | reviewScoreWord | Score word | string, nullable | Booking’s own label for the score. | Fabulous |
| 9 | reviewsCount | Reviews | integer | number, nullable | How many guest reviews the score is based on. | 9657 |
| 10 | reviewSummary | Summary | object, nullable | Booking’s aggregated review summary, including its AI summary where one exists. | |
| 11 | reviewSubscores | Subscores | array, nullable | Per-category scores - staff, cleanliness, location, value, comfort, facilities, wifi. One request per property however many reviews you fetch. | |
| 12 | reviews | Reviews | array, nullable | Guest reviews: author, score, pros, cons, date. Needs Include reviews, and the count is capped by reviewsMax in mode reviews or maxReviews on search. | |
| 13 | provenance | Provenance | object, nullable | What produced this row’s price: the proxy exit it was fetched through, the generation of that exit, the currency you asked for and the endpoint that priced it. The point of sale follows the proxy exit country, not any input - bookerCountry was removed in this build because nothing read it. |
Some columns above carry an object, or a list of objects, with documented members of their own. Each table below lists the members documented at ONE level; a member that is itself an object names the table it continues in, and [] in a path means a list.
row
└─ provenance
provenance — Provenance
Parent chain: row → provenance
What produced this row’s price: the proxy exit it was fetched through, the generation of that exit, the currency you asked for and the endpoint that priced it. The point of sale follows the proxy exit country, not any input - bookerCountry was removed in this build because nothing read it.
| # | Field | Label | Type | Description | Example |
|---|---|---|---|---|---|
| 1 | exitCountry | Exit country | string, nullable | ISO country of the proxy exit this row was fetched through, sampled once per proxy generation from Apify’s own request echo. This is the market that priced the row: on the hotel_ids path taxes come back inside the display price from an EU exit and excluded through a US one. Null when the run’s pool rotates per request (a residential proxy with no session), when the probe failed, or past the per-run probe budget - null means not established, not “no market”. Pin country-XX or a session in the proxy configuration to make it exact for every row. | US, GB |
| 2 | proxyGeneration | Proxy generation | integer, nullable | Which exit fetched this row, counted from 0. The retry ladder draws a fresh exit when one fails - six generations in 30 seconds on one measured run - so two rows of one dataset can honestly carry different tax treatment. RUN_SUMMARY.request.exitCountries lists every generation and its country. | 0 |
| 3 | currencyRequested | Currency requested | string, nullable | The currency you asked for, beside the honoured currency. Not recoverable from the row otherwise: HOTEL resolves to the property’s own code, which the row then states as its own currency - so a row quoting MYR could have been asked for as HOTEL or as MYR. | EUR, HOTEL |
| 4 | surface | Surface | string, nullable | The endpoint that produced this row: search (the destination search), roomList (the per-property rate list) or hotelPage (the by-id path). The surfaces disagree in documented ways - roomList carries the structured meal price and hotelPage does not - so a buyer comparing two rows needs to know which answered. | roomList, hotelPage |
Captured from a live run. Lists are cut to two entries and deep nesting is elided — the shape is real, the bulk is not.
{
"id": 176226,
"checkin": "2026-10-31",
"checkout": "2026-11-01",
"reviews": [
{
"id": "0f3ad544d8826ea6",
"title": null,
"pros": "I love it, beds, not so soft and bit bigger than I was aspect. Was clean, not excellent, but was good. Also was a bit too warm. And that ventilator, looked ...",
"cons": "The only thing think I didn't like was restaurant staff. Sometimes people forget, there is not only one language in the world. Some comments, unhappy faces. ...",
"score": 10,
"date": "2026-10-22",
"author": "{... 3 keys}"
},
{
"id": "5f6c6832900977cc",
"title": "Room on the first floor",
"pros": "Price, location,and service",
"cons": "My room was on the first floor and I was unable to close the window curtain on one of the windows facing to the pedestrian walkway",
"score": 9,
"date": "2026-10-21",
"author": "{... 3 keys}"
},
"... 3 more"
],
"reviewSubscores": [
{
"category": "Cleanliness",
"name": "hotel_clean",
"score": 9.516507148742676,
"reviewsCount": null
},
{
"category": "Comfort",
"name": "hotel_comfort",
"score": 9.505088806152344,
"reviewsCount": null
},
"... 5 more"
],
"reviewSummary": {
"summary": null,
"numReviews": 1291,
"language": "en",
"favorableReviewCount": 9175,
"featuredReviewsTitle": "Guests who stayed here loved"
}
}