- query
- The Booking search URL you submitted, echoed back. Populated on all 90 rows. Both destination forms we tried worked, so this is how you tell which search a block of rows came from.
- name
- The property name as the results page states it. Populated on all 90 rows - the most reliable field in the export, and the one to key a human-readable report on.
- stars
- Populated on 39 of 90 rows, and never on the two runs in the first currency. It does not hold a number of stars: across every row it took only the values 4, 8, 12, 16 or 20. That is consistent with four times a one-to-five rating, and the properties at the top and bottom of the range fit that reading, but we could not confirm it against the live site. Divide with caution, and validate before you display.
- rating
- The guest score on a ten-point scale. Populated on 89 of 90 rows, ranging from 1.3 to 9.4 in what we hold. The single exception is a property that also had no review count and no label - a listing with nothing scored yet.
- review_label
- The word the site puts beside the score. Populated on 65 of 90 rows, with values such as the ones you would expect - plus one that is not a word at all but the site's own column heading, on five rows that had only a handful of reviews each. Filter that value out before you group on this.
- reviews
- How many reviews the score is built on. Populated on 89 of 90 rows, from a single review up to several thousand. Worth reading beside
rating: the lowest score in our data sits on three reviews. - location
- The neighbourhood and city as the results page labels it. Populated on all 90 rows. A district name rather than an address - there is no street, postcode or coordinate anywhere in this export.
- distance
- How far the property is from the centre, as free text. Populated on all 90 rows - but the unit follows the run, not the property: miles on two of our runs and kilometres on the third. Parse the unit, never assume it.
- room_type
- The specific room the quoted price is for. Populated on all 90 rows. Note that some values end in a stray label where the bed configuration has run into the room name - a capture artifact worth trimming.
- occupancy
- The stay the price covers. Populated on all 90 rows - with the identical value on every one. It reflects the search's default rather than anything about the listing, so it carries no information across rows. Treat it as a constant to check, not a field to group on.
- price
- The headline nightly rate, with a currency symbol. Populated on all 90 rows - and the currency is the run's, not the hotel's. Two of our runs quoted one currency and the third quoted another for the same city, so strip and convert before comparing anything across exports.
- original_price
- The struck-through was-price where the listing shows one. Populated on 13 of 90 rows, all of them in the first currency - the run in the second currency carried none at all. Eleven of the thirteen also carry a deal label and two do not, so a discount can exist without being named.
- taxes
- The tax and fee line shown under the rate. Populated on 42 of 90 rows - which is every row of one run and no row of the other two. This is the clearest case of a column depending on the presentation rather than the property. Absent values arrive as a JSON null, not an empty string.
- deal
- The promotion label where one is shown. Populated on 29 of 90 rows, with a small set of named campaign values. Like
taxes, an absent value is a JSON null rather than an empty string. - url
- The link to the property page. Populated on all 90 rows - and heavily decorated: an affiliate identifier, a tracking label, a session identifier, a timestamp and the block identifiers behind the quoted rate, all in the querystring. The check-in and check-out dates the price applies to are in here too, and nowhere else in the export. Strip to the path for a stable key; read the dates out before you do.
- image
- A thumbnail on the site's image host. Populated on all 90 rows, at a small fixed size. Fine for a listing view, too small to be a product image.
Two structural facts sit above every column note here. The first is that this export has no status column. Every other service we run writes a per-row flag recording whether the fetch succeeded, was refused or was given the wrong kind of input - and that is how two of our five runs would have explained themselves. They returned zero rows and nothing else, so the file cannot tell you whether the search was empty, the page did not load, or something in between. Check the row count in your own pipeline and treat a zero as a retry. The second is that three columns depend on the presentation rather than the property. The run served in the second currency carried a tax line on every row and a star value on nearly every row, and carried no was-price at all; the two runs served in the first currency were the exact mirror. The distance unit switched with them. That means a naive diff of two exports will report that hotels gained and lost attributes when nothing about them changed - so record which currency a run came back in and compare like with like. Everything else is ordinary: nine columns arrived on all ninety rows, the score and its review count on all but one, and the remaining fields are genuinely optional in the way you would expect.