Booking.com Hotels Scraper
Pricing
from $0.42 / 1,000 property saveds
Booking.com Hotels Scraper
Scrape Booking.com hotels by place and dates: prices, availability, property details, rooms and guest reviews. Export to JSON, CSV or Excel.
Booking.com Hotels Scraper
Pricing
from $0.42 / 1,000 property saveds
Scrape Booking.com hotels by place and dates: prices, availability, property details, rooms and guest reviews. Export to JSON, CSV or Excel.
You can access the Booking.com Hotels Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "0.0", "x-build-id": "h8afykLVl3PfAOpje" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/nice_dev~booking-hotels-scraper/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-nice_dev-booking-hotels-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } }, "/acts/nice_dev~booking-hotels-scraper/runs": { "post": { "operationId": "runs-sync-nice_dev-booking-hotels-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor and returns information about the initiated run in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/runsResponseSchema" } } } } } } }, "/acts/nice_dev~booking-hotels-scraper/run-sync": { "post": { "operationId": "run-sync-nice_dev-booking-hotels-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } } }, "components": { "schemas": { "inputSchema": { "type": "object", "properties": { "location": { "title": "Destination", "maxLength": 200, "type": "string", "description": "A city, region, district, airport or landmark, as typed in the Booking.com search box (e.g. `Paris`, `Tuscany`, `Orly Airport`, `Eiffel Tower`). Booking.com resolves it the way its own search bar does. Empty = no destination from this field." }, "locations": { "title": "More destinations", "maxItems": 100, "uniqueItems": true, "type": "array", "description": "Several destinations in one run: one search per destination. Added to **Destination**. Properties found by several searches are saved once.", "items": { "type": "string", "maxLength": 200 }, "default": [] }, "startUrls": { "title": "Start URLs", "maxItems": 1000, "type": "array", "description": "Booking.com search-result URLs copied from the address bar (`https://www.booking.com/searchresults.html?ss=Paris&checkin=...`): their dates, guests, rooms, currency and filters (`nflt`) are kept - or single property URLs (`https://www.booking.com/hotel/fr/<name>.html`, in any site language). Added to the destinations, hotel names and map point of this form: all of them run together. Max 1 000 URLs.", "default": [], "items": { "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "title": "URL of a web page", "format": "uri" } } } }, "hotelNames": { "title": "Property names", "maxItems": 100, "uniqueItems": true, "type": "array", "description": "Properties named as you would type them on Booking.com (e.g. `Hotel Lutetia Paris`): each name is looked up in Booking.com's own suggestions before the run and the property it proposes is read, with its price for your dates. Added to the other sources.", "items": { "type": "string", "maxLength": 200 }, "default": [] }, "hotelIds": { "title": "Property IDs", "maxItems": 1000, "uniqueItems": true, "type": "array", "description": "Booking.com numeric property ids (the `propertyId` of a result, e.g. `54642`): each one is looked up through Booking.com's own search and read with its price for your dates. Added to the other sources.", "default": [], "items": { "type": "string" } }, "latitude": { "title": "Latitude", "minimum": -90, "maximum": 90, "type": "number", "description": "Latitude of a map point (e.g. `48.8584`). Use it with **Longitude** and **Radius**: properties around that point, nearest first, until the first one beyond the radius. Added to the other sources." }, "longitude": { "title": "Longitude", "minimum": -180, "maximum": 180, "type": "number", "description": "Longitude of the map point (e.g. `2.2945`). Both **Latitude** and **Longitude** are needed, or neither." }, "radiusKm": { "title": "Radius", "minimum": 0.1, "maximum": 100, "type": "number", "description": "Search radius around the map point, in kilometres. Only used with **Latitude** and **Longitude**.", "default": 2 }, "mapBoundingBox": { "title": "Map rectangle", "type": "object", "description": "A rectangle of the map instead of a place: its south-west and north-east corners, as `{\"swLat\": 41.85, \"swLon\": 12.42, \"neLat\": 41.95, \"neLon\": 12.55}` (latitudes -90 to 90, longitudes -180 to 180; a rectangle across the 180th meridian is not supported). A large area is split into map tiles to go past the 1,000 results Booking.com shows per search. Added to the other sources." }, "checkIn": { "title": "Check-in date", "type": "string", "description": "First night: a date (`2026-12-20`), or a period from the run date such as `7 days`, `2 weeks` or `1 year` - a saved task then always looks the same distance ahead. Empty = 30 days from the run date. Booking.com takes bookings up to about 495 days ahead: a later date is refused." }, "checkOut": { "title": "Check-out date", "type": "string", "description": "Departure day, `YYYY-MM-DD`. Empty = check-in plus **Nights** (the way to keep the length of a stay whose check-in moves with the run date). Must be after the check-in date, at most 30 nights after check-in." }, "nights": { "title": "Nights", "minimum": 1, "maximum": 30, "type": "integer", "description": "Length of stay, used when **Check-out date** is empty.", "default": 1 }, "flexWindow": { "title": "Flexible dates (± days)", "minimum": 0, "maximum": 7, "type": "integer", "description": "Let Booking.com move the stay up to this many days before or after **Check-in date** for each property, as its \"flexible dates\" search does: each result is priced for its best dates (`stay`, `datesAdjusted`) and more properties are found. 0 = exact dates. The site offers 1, 2, 3 and 7.", "default": 0 }, "flexibleMonths": { "title": "Flexible months", "maxItems": 12, "uniqueItems": true, "type": "array", "description": "Booking.com's \"I'm flexible\" search: the months to look in, as `2026-12` (up to 12; the current month starts tomorrow, and a month later than about 495 days ahead is refused). Each property is priced for its best dates in those months (`stay`). When set, **Check-in date**, **Check-out date** and **Nights** are ignored; it cannot be used with **Flexible dates (± days)**.", "items": { "type": "string", "maxLength": 7 }, "default": [] }, "flexibleNights": { "title": "Flexible stay length", "minimum": 1, "maximum": 30, "type": "integer", "description": "Nights of the stay for **Flexible months**. Empty = 1 night. Needs **Flexible months**." }, "flexibleStartDays": { "title": "Flexible first days", "uniqueItems": true, "type": "array", "description": "Days of the week the stay may start, for **Flexible months**. Empty = any day. Needs **Flexible months**.", "items": { "type": "string", "enum": [ "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday" ], "enumTitles": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] }, "default": [] }, "adults": { "title": "Adults", "minimum": 1, "maximum": 30, "type": "integer", "description": "Adults for the whole stay (all rooms together, as on the Booking.com search box).", "default": 2 }, "children": { "title": "Children", "minimum": 0, "maximum": 10, "type": "integer", "description": "Children for the whole stay. When above 0, fill **Children ages** with one age per child.", "default": 0 }, "childrenAges": { "title": "Children ages", "maxItems": 10, "type": "array", "description": "One age (0-17) per child, in the same order as on the site. Must hold exactly **Children** values.", "default": [], "items": { "type": "string" } }, "rooms": { "title": "Rooms", "minimum": 1, "maximum": 30, "type": "integer", "description": "Number of rooms requested. Not above the number of adults: Booking.com needs at least one adult per room and ignores the rooms in excess.", "default": 1 }, "currency": { "title": "Currency", "enum": [ "EUR", "USD", "GBP", "AUD", "CAD", "CHF", "JPY", "CNY", "HKD", "SGD", "NZD", "INR", "AED", "SAR", "QAR", "ILS", "TRY", "EGP", "MAD", "ZAR", "BRL", "MXN", "ARS", "CLP", "COP", "PEN", "THB", "MYR", "IDR", "PHP", "KRW", "TWD", "VND", "SEK", "NOK", "DKK", "PLN", "CZK", "HUF", "RON", "BGN", "ISK", "UAH", "BHD", "JOD", "KWD", "OMR", "GEL", "KZT", "MDL", "NAD", "FJD", "XOF", "AZN", "RUB", "TND", "DZD", "KES", "NGN", "PKR", "BDT", "LKR", "CRC", "UYU", "DOP" ], "type": "string", "description": "Currency of every price (`EUR`, `USD`, `GBP`...). Booking.com converts server-side. Each result also gives the price in the property's own currency when it differs (`priceInHotelCurrency`). A search URL pasted in **Start URLs** keeps its own `selected_currency`.", "default": "EUR" }, "language": { "title": "Language", "enum": [ "en-gb", "en-us", "fr", "de", "es", "it", "nl", "pt-pt", "pt-br", "ja", "zh-cn", "zh-tw", "ko", "ru", "pl", "tr", "sv", "no", "da", "fi", "cs", "el", "hu", "ro", "ar", "uk", "bg", "ca", "hr", "et", "he", "hi", "id", "is", "lv", "lt", "ms", "sk", "sl", "sr", "th", "tl", "vi", "es-ar", "es-mx" ], "type": "string", "description": "Booking.com language of names, descriptions, texts and reviews' labels. `distanceFromCenterKm` is always in kilometres, whatever the language (the text `distanceFromCenter` follows the language: miles with `en-us`). A search or property URL pasted in **Start URLs** keeps its own language (the one in its address: a language code before html such as fr, or lang=fr); an address with none, or a language not in this list, uses this one.", "default": "en-gb" }, "sortBy": { "title": "Sort by", "enum": [ "popularity", "upsort_bh", "price", "price_from_high_to_low", "review_score_and_price", "class", "class_asc", "class_and_price", "distance_from_search", "bayesian_review_score" ], "type": "string", "description": "Order asked from Booking.com for a destination or a pasted search link. Ignored for a map point (always nearest first) and for hotel names, property ids and property links (one property each). `popularity` (Our top picks) is the site's default ranking; the other orders sort by the criterion they name (price, stars, score, distance from downtown). Whatever the order, Booking.com repeats a few properties from one page to the next: the Actor absorbs them by de-duplicating, so the first N results can vary slightly between two runs.", "default": "popularity" }, "maxItems": { "title": "Max properties", "minimum": 0, "maximum": 100000, "type": "integer", "description": "Maximum number of properties saved for the whole run (after de-duplication and filters). 0 = no limit - a big city holds thousands of properties (Rome: more than 5 000); the Actor splits the map into tiles to go past the 1 000 results the site serves per search.", "default": 100 }, "maxItemsPerQuery": { "title": "Max properties per search", "minimum": 0, "maximum": 100000, "type": "integer", "description": "Cap for EACH search (destination, hotel name, map point or search URL), so the first one cannot use up the whole **Max properties** budget. 0 = no per-search cap.", "default": 0 }, "extractDetails": { "title": "Extract full property profile", "type": "boolean", "description": "Description, every photo, grouped amenities, house rules (children, beds, pets, payment, deposit), check-in / check-out times, all the category scores, languages spoken, licence numbers, chain and brand, host profile, full address with postal code. One request per property, charged apart (see Pricing). Off = search-result fields only (name, stars, price, rating, address, GPS, one photo). The company / host contact details are a separate option below.", "default": false }, "includeRoomOffers": { "title": "Room offers (every room and rate)", "type": "boolean", "description": "Add every room offer of each property for your dates (`roomOffers`): room name, size, occupancy, beds, meal plan, price of one room for the whole stay, crossed-out price, taxes included, free cancellation and its date, prepayment, rooms left - the whole room list of the property page, not only the recommended offer (`price`, always there). One request more per property; charged per offer saved (see Pricing). A sold-out property has no offer and costs nothing for this option.", "default": false }, "maxRoomOffersPerHotel": { "title": "Max room offers per property", "minimum": 1, "maximum": 500, "type": "integer", "description": "Cap on the room offers saved for each property, in Booking.com's own order. 50 covers almost every property (2 to 87 offers measured for 2 adults and 2 nights); `roomOfferCount` always says how many Booking.com gave. Your maximum cost counts each property at this many offers.", "default": 50 }, "roomOffersFitGuestsOnly": { "title": "Room offers that fit the guests only", "type": "boolean", "description": "Needs **Include room offers**. Keep only the room offers that sleep all the guests of the stay (adults + children); an offer that does not say its capacity is kept. A property left with no offer is dropped.", "default": false }, "minRoomSizeM2": { "title": "Minimum room size (m²)", "minimum": 0, "maximum": 10000, "type": "number", "description": "Needs **Include room offers**. Keep only the room offers whose room is at least this big, in square metres. 0 = no filter. An offer that does not say its size is dropped when this is set; a property left with no offer is dropped.", "default": 0 }, "maxRoomSizeM2": { "title": "Maximum room size (m²)", "minimum": 0, "maximum": 10000, "type": "number", "description": "Needs **Include room offers**. Keep only the room offers whose room is at most this big, in square metres. 0 = no filter. An offer that does not say its size is dropped when this is set; a property left with no offer is dropped.", "default": 0 }, "includeCalendar": { "title": "Price calendar", "type": "boolean", "description": "Add, day by day from the check-in date, whether the property is bookable, an indicative price and the minimum stay (`calendar`), for your guests. The price of a day is for a ONE-night stay that starts that day, for one room, rounded to the unit; it may not take off some discounts, so the exact price of your stay is `price`. One request per 61 days; charged per day saved (see Pricing).", "default": false }, "calendarDays": { "title": "Calendar days", "minimum": 1, "maximum": 365, "type": "integer", "description": "Number of days of the price calendar, counted from the check-in date. The site serves 61 days per request: 365 days = 6 requests per property. Booking.com serves no day beyond about 495 days ahead: the calendar stops there.", "default": 61 }, "includeNearbyPlaces": { "title": "Nearby places", "type": "boolean", "description": "Add the places around each property (`nearbyPlaces`): airports, landmarks, restaurants and cafes, public transport, beaches, natural beauty - name, category and distance. One request per property; charged per property enriched (see Pricing).", "default": false }, "includeHostContact": { "title": "Company / host contact details", "type": "boolean", "description": "Add the company or host that runs each property (`hostContact`), as Booking.com publishes it for trader traceability: company name, registration number, address, e-mail, phone and, for a private host, the name. These are business contact details published by the site; you stay responsible for how you use them (marketing, GDPR). One request per property, shared with **Extract full property profile** when both are on; charged per contact found (see Pricing).", "default": false }, "includeHostWebsite": { "title": "Company website and contacts", "type": "boolean", "description": "Needs **Company / host contact details**. Looks the company that runs each property up on publicly available sources and adds its own website (`hostWebsite`) and what that site shows: e-mail addresses (`hostWebsiteEmails`), phone numbers (`hostWebsitePhones`), a Telegram link (`hostTelegram`), the page they come from (`hostWebsiteSourceUrl`) and a confidence (`hostWebsiteConfidence`, `high` or `medium`). Companies only: a private person is never looked up. A site is kept only when its home page names the company and places it (its town, postal code, country or one of its phones). Only the company's own addresses are kept: those on the domain of its website, or an address (a webmail one included) that carries its name or that of its website; the address of a web agency, a web hosting company or a general page is left aside. Charged per property whose company website is found as **Company website and contacts** (see Pricing); nothing found = nothing charged. Unticked (default) = the six columns are null or empty and nothing is charged.", "default": false }, "includeValueScore": { "title": "Value score", "type": "boolean", "description": "Add a value-for-money note to each property (`valueScore`, 0 to 100, higher = better), computed from the property's own fields (price per night, guest rating and number of reviews, distance from the centre, cancellation and payment terms, discount) and the other properties of the same results page. `valueScoreReasons` lists what counted in its favour, the strongest first, and `valueScoreChecksSkipped` what could not be judged for lack of data (never held against the property). No extra request. Charged per property that gets a score as **Value score** (see Pricing); a property with no price, or without enough comparable properties in the results, gets no score and costs nothing. Unticked (default) = the three columns are null and nothing is charged.", "default": false }, "includeComparables": { "title": "Nearby properties (comparables)", "type": "boolean", "description": "Add the neighbours of each property (`comparables`, `comparablesCount`, `comparablesMedianPricePerNight`): other properties priced for the same stay and currency, of the same kind (a hotel with hotels, an apartment with apartments) and, when the property has stars, the same stars give or take one, within 2 km, the nearest first, with their distance, stars, rating, reviews and price per night, plus the median price per night of the lot. Booking.com is searched once around each 1 km area of the map and the result is shared by all the properties of the area, so a few extra requests serve many properties. Charged per property that gets at least one neighbour as **Nearby properties** (see Pricing); a property with no neighbour, or without position or type, costs nothing. Unticked (default) = the three columns are null and nothing is charged.", "default": false }, "maxComparablesPerProperty": { "title": "Max neighbours per property", "minimum": 1, "maximum": 20, "type": "integer", "description": "Neighbours kept for each property when **Nearby properties** is ticked, the nearest first. One charge per property whatever the number kept.", "default": 5 }, "includeReviews": { "title": "Include reviews", "type": "boolean", "description": "Add the guest reviews to each property (`reviews`), charged per review saved (see Pricing). One request per 25 reviews, read only as far as **Max reviews per property** or a review filter needs. Off = only the score and the review count. The same request also gives the number of reviews per language, traveler type and season and the topics guests mention (`reviewsByLanguage`, `reviewsByTravelerType`, `reviewsBySeason`, `reviewTopics`), at no extra charge.", "default": false }, "includeReviewSummary": { "title": "Include review summary", "type": "boolean", "description": "Add Booking.com's own summary of the guest reviews (`reviewSummary`: pros and cons with how many reviews mention them) and the scores by topic and traveler type (`reviewTopicScores`), charged per property that has them (see Pricing). The number of reviews per language, traveler type and season and the topics guests mention (`reviewsByLanguage`, `reviewsByTravelerType`, `reviewsBySeason`, `reviewTopics`) come with it, at no extra charge. Works without **Include reviews**: read in a request the Actor already makes when possible, else one small request per property.", "default": false }, "maxReviewsPerHotel": { "title": "Max reviews per property", "minimum": 0, "maximum": 100000, "type": "integer", "description": "Cap on the reviews saved for each property. 0 = every review the site serves (the full history: a big hotel holds 9 000 and more). A property whose reviews could not all be read is saved with the ones read so far and `reviewsIncomplete: true`. Each review saved is charged on its own (see Pricing).", "default": 25 }, "reviewsSort": { "title": "Reviews order", "enum": [ "MOST_RELEVANT", "NEWEST_FIRST", "OLDEST_FIRST", "SCORE_DESC", "SCORE_ASC" ], "type": "string", "description": "Order of the saved reviews: with the cap on reviews per property, it picks which ones are kept. `NEWEST_FIRST` is the order to use with **Reviews after**.", "default": "NEWEST_FIRST" }, "reviewsLanguages": { "title": "Reviews languages", "maxItems": 30, "uniqueItems": true, "type": "array", "description": "Keep only the reviews written in these languages, as two-letter codes (`en`, `fr`, `de`, `es`, `it`, `nl`...). Asked from Booking.com. Empty = every language.", "items": { "type": "string", "maxLength": 10 }, "default": [] }, "reviewsTravelerType": { "title": "Traveler type", "enum": [ "ALL", "FAMILIES", "COUPLES", "GROUP_OF_FRIENDS", "SOLO_TRAVELLERS", "BUSINESS_TRAVELLERS" ], "type": "string", "description": "Keep only the reviews of this type of traveler. Asked from Booking.com.", "default": "ALL" }, "reviewsScore": { "title": "Review score band", "enum": [ "ALL", "REVIEW_ADJ_SUPERB", "REVIEW_ADJ_GOOD", "REVIEW_ADJ_AVERAGE_PASSABLE", "REVIEW_ADJ_POOR", "REVIEW_ADJ_VERY_POOR" ], "type": "string", "description": "Keep only the reviews in this score band of Booking.com (out of 10). Asked from Booking.com; for an exact range use **Minimum review rating** and **Maximum review rating**.", "default": "ALL" }, "reviewsTimeOfYear": { "title": "Reviews season", "enum": [ "ALL", "_03_05", "_06_08", "_09_11", "_12_02" ], "type": "string", "description": "Keep only the reviews of stays in this season. Asked from Booking.com.", "default": "ALL" }, "reviewsSearchText": { "title": "Reviews containing", "maxLength": 200, "type": "string", "description": "Keep only the reviews that mention this word or phrase (e.g. `breakfast`). Asked from Booking.com." }, "reviewsAfter": { "title": "Reviews after", "type": "string", "description": "Keep only the reviews written on or after this date: `2026-01-01`, or a period before now such as `7 days`, `3 months`, `1 year`. `7 days` with a schedule = the new reviews only." }, "reviewsBefore": { "title": "Reviews before", "type": "string", "description": "Keep only the reviews written on or before this date (the whole day is included)." }, "reviewsMinRating": { "title": "Minimum review rating", "minimum": 0, "maximum": 10, "type": "number", "description": "Keep only the reviews scored at least this (out of 10). 0 = every review.", "default": 0 }, "reviewsMaxRating": { "title": "Maximum review rating", "minimum": 0, "maximum": 10, "type": "number", "description": "Keep only the reviews scored at most this (out of 10). 0 = every review. Set it low to collect complaints only.", "default": 0 }, "reviewsTopics": { "title": "Reviews topics", "maxItems": 50, "uniqueItems": true, "type": "array", "description": "Keep only the reviews that mention these topics. Give topic ids from `reviewTopics[].id` of a run in the same `language` (the ids change with the language; English: 249 Location, 270 Room, 245 Breakfast). Asked from Booking.com. Empty = every review.", "items": { "type": "string", "maxLength": 12 }, "default": [] }, "reviewsWithPhotosOnly": { "title": "Reviews with photos only", "type": "boolean", "description": "Keep only the reviews that come with at least one photo. Checked on the reviews read, so a rare photo can make the run read many pages (each review kept is charged, the others are not).", "default": false }, "reviewsWithReplyOnly": { "title": "Reviews with a host reply only", "type": "boolean", "description": "Keep only the reviews the property answered (`hotelReply`).", "default": false }, "reviewsMinTextLength": { "title": "Minimum review text length", "minimum": 0, "maximum": 10000, "type": "integer", "description": "Keep only the reviews whose positive and negative texts together have at least this many characters. 0 = no filter. Skips the reviews that are only a score.", "default": 0 }, "reviewsRoomIds": { "title": "Reviews room IDs", "maxItems": 100, "uniqueItems": true, "type": "array", "description": "Keep only the reviews of guests who stayed in these rooms (`roomId` of a review, `roomId` of a room offer). Empty = every room.", "items": { "type": "string", "maxLength": 12 }, "default": [] }, "reviewsStayedAfter": { "title": "Reviews of stays after", "type": "string", "description": "Keep only the reviews of stays that began on or after this date: `2026-01-01`, or a period before now such as `3 months`. This is the check-in day of the guest, not the day the review was written." }, "reviewsStayedBefore": { "title": "Reviews of stays before", "type": "string", "description": "Keep only the reviews of stays that began on or before this date (the whole day is included). This is the check-in day of the guest, not the day the review was written." }, "minPrice": { "title": "Minimum price per night", "minimum": 0, "maximum": 1000000, "type": "number", "description": "Keep properties whose price per night is at least this, in **Currency**. 0 = no filter. Asked from Booking.com.", "default": 0 }, "maxPrice": { "title": "Maximum price per night", "minimum": 0, "maximum": 1000000, "type": "number", "description": "Keep properties whose price per night is at most this, in **Currency**. 0 = no filter. Asked from Booking.com.", "default": 0 }, "minStars": { "title": "Minimum star rating", "minimum": 0, "maximum": 5, "type": "integer", "description": "Keep properties with at least this many stars (1-5). 0 = no filter. Asked from Booking.com. Properties with no star rating are dropped when this is set.", "default": 0 }, "maxStars": { "title": "Maximum star rating", "minimum": 0, "maximum": 5, "type": "integer", "description": "Keep properties with at most this many stars. 0 = no filter. Asked from Booking.com. Properties with no star rating are dropped when this is set.", "default": 0 }, "minRating": { "title": "Minimum guest rating", "minimum": 0, "maximum": 10, "type": "number", "description": "Keep properties whose guest score is at least this (Booking.com scores out of 10). 0 = no filter. The site is asked for the step just below (6, 7, 8 or 9), then the exact score is checked. Properties without any review are dropped when this is set.", "default": 0 }, "minReviewCount": { "title": "Minimum number of reviews", "minimum": 0, "maximum": 1000000, "type": "integer", "description": "Keep properties with at least this many reviews. 0 = no filter.", "default": 0 }, "propertyTypes": { "title": "Property types", "uniqueItems": true, "type": "array", "description": "Keep only these types of property. Asked from Booking.com, so the other types are never read. Empty = every type.", "items": { "type": "string", "enum": [ "hotel", "apartment", "holiday_home", "villa", "guesthouse", "hostel", "bed_and_breakfast", "chalet", "country_house", "farm_stay", "homestay", "condo_hotel", "campsite", "love_hotel", "resort", "motel", "lodge", "holiday_park", "boat", "luxury_tent", "ryokan", "capsule_hotel", "riad" ], "enumTitles": [ "Hotels", "Apartments", "Vacation homes", "Villas", "Guesthouses", "Hostels", "Bed and breakfasts", "Chalets", "Country houses", "Farm stays", "Homestays", "Condo hotels", "Campgrounds", "Love hotels", "Resorts", "Motels", "Lodges", "Holiday parks", "Boats", "Luxury tents", "Ryokans", "Capsule hotels", "Riads" ] }, "default": [] }, "entirePlaceOnly": { "title": "Entire homes and apartments only", "type": "boolean", "description": "Keep only the whole homes and apartments (you get the whole place to yourself). Asked from Booking.com.", "default": false }, "beachfrontOnly": { "title": "Beachfront only", "type": "boolean", "description": "Keep only the beachfront properties. Asked from Booking.com.", "default": false }, "amenities": { "title": "Amenities (all required)", "uniqueItems": true, "type": "array", "description": "Keep only the properties that have ALL the ticked amenities (the site's own amenity filters). Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "enum": [ "107", "2", "433", "54", "63", "17", "11", "3", "16", "8", "182", "407", "185", "5" ], "enumTitles": [ "Free Wifi", "Parking", "Swimming pool", "Spa and wellness center", "Hot tub", "Airport shuttle", "Fitness center", "Restaurant", "Non-smoking rooms", "24-hour front desk", "Electric vehicle charging station", "Happy hour", "Wheelchair accessible", "Room service" ] }, "default": [] }, "roomAmenities": { "title": "Room facilities (all required)", "uniqueItems": true, "type": "array", "description": "Keep only the properties that have ALL the ticked facilities in the room (the site's own room filters). Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "enum": [ "private_bathroom", "air_conditioning", "private_pool", "sea_view", "balcony", "kitchen_or_kitchenette", "washing_machine", "private_hot_tub", "view", "executive_lounge_snacks_and_drinks", "yukata", "terrace", "sauna", "kitchen", "computer", "game_console", "flat_screen_tv", "salt_water_pool", "video_games", "kitchenette", "fax", "rooftop_pool", "lake_view", "bath", "refrigerator", "tatami", "plunge_pool", "reading_light", "infinity_pool", "upper_floors_by_elevator", "privacy_curtain", "shower", "accessible_room", "pool_cover" ], "enumTitles": [ "Private bathroom", "Air conditioning", "Private pool", "Sea view", "Balcony", "Kitchen/kitchenette", "Washing machine", "Private hot tub", "View", "Complimentary evening snacks and drinks in the executive lounge", "Yukata", "Terrace", "Sauna", "Kitchen", "Computer", "Game console", "Flat-screen TV", "Salt water pool", "Video games", "Kitchenette", "Fax", "Rooftop pool", "Lake view", "Bath", "Refrigerator", "Tatami (traditional Japanese flooring)", "Plunge pool", "Reading light", "Infinity pool", "Upper floors accessible by elevator", "Privacy curtain", "Shower", "Accessible room", "Pool cover" ] }, "default": [] }, "accessibilityFeatures": { "title": "Accessibility features of the property", "uniqueItems": true, "type": "array", "description": "Keep only the properties with these accessibility features of the building (the site's own filter). Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "enum": [ "toilet_with_grab_rails", "auditory_guidance", "visual_aids_tactile_signs", "visual_aids_braille", "raised_toilet", "emergency_cord_in_bathroom", "lower_bathroom_sink" ], "enumTitles": [ "Toilet with grab rails", "Auditory guidance", "Visual aids: Tactile signs", "Visual aids: Braille", "Raised toilet", "Emergency cord in bathroom", "Lower bathroom sink" ] }, "default": [] }, "roomAccessibilityFeatures": { "title": "Accessibility features of the room (all required)", "uniqueItems": true, "type": "array", "description": "Keep only the properties that have ALL the ticked accessibility features in the room (the site's own filter). Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "enum": [ "upper_floors_by_elevator", "entire_unit_wheelchair_accessible", "entire_unit_on_ground_floor", "walk_in_shower", "roll_in_shower", "shower_chair", "adapted_bath", "toilet_with_grab_rails", "emergency_cord_in_bathroom", "raised_toilet", "lowered_sink" ], "enumTitles": [ "Upper floors accessible by elevator", "Entire unit wheelchair accessible", "Entire unit located on ground floor", "Walk-in shower", "Roll-in shower", "Shower chair", "Adapted bath", "Toilet with grab rails", "Emergency cord in bathroom", "Raised toilet", "Lowered sink" ] }, "default": [] }, "activities": { "title": "Activities (all required)", "uniqueItems": true, "type": "array", "description": "Keep only the properties that offer ALL the ticked activities (the site's own filter). Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "enum": [ "full_body_massage", "cooking_class", "massage", "local_culture_tour_or_class", "bicycle_rental", "hot_tub", "public_bath", "walking_tours", "indoor_pool", "cycling", "fitness_centre", "fitness", "skiing", "hiking", "golf_course", "water_park" ], "enumTitles": [ "Full body massage", "Cooking class", "Massage", "Tour or class about local culture", "Bicycle rental", "Hot tub", "Public bath", "Walking tours", "Indoor pool", "Cycling", "Fitness centre", "Fitness", "Skiing", "Hiking", "Golf course (within 3 km)", "Water park" ] }, "default": [] }, "mealPlan": { "title": "Meals", "enum": [ "any", "breakfast", "breakfast_dinner", "kitchen", "all_inclusive", "full_board", "breakfast_lunch" ], "type": "string", "description": "Keep only the properties with this meal option. Asked from Booking.com.", "default": "any" }, "veryGoodBreakfastOnly": { "title": "Very good breakfast only", "type": "boolean", "description": "Keep only the properties whose guests rate the breakfast very good (the site's own filter). Asked from Booking.com.", "default": false }, "freeCancellationOnly": { "title": "Free cancellation only", "type": "boolean", "description": "Keep only the properties with free cancellation for your stay. Asked from Booking.com.", "default": false }, "noPrepaymentOnly": { "title": "No prepayment only", "type": "boolean", "description": "Keep only the properties where you pay nothing now. Asked from Booking.com, then checked on each property. With **Free cancellation only** or **Book without credit card only** also ticked, the site is asked for those and this checks the rest.", "default": false }, "noCreditCardOnly": { "title": "Book without credit card only", "type": "boolean", "description": "Keep only the properties you can book without a credit card (the site's \"Book without credit card\"). Asked from Booking.com; few properties offer it. With **Free cancellation only** also ticked, a property must have both.", "default": false }, "onlinePaymentOnly": { "title": "Accepts online payments only", "type": "boolean", "description": "Keep only the properties that accept online payments (the site's own filter). Asked from Booking.com.", "default": false }, "dealsOnly": { "title": "Deals only", "type": "boolean", "description": "Keep only the properties showing a deal for your stay: a discount line (`discounts`) or a price before discount (`priceBeforeDiscount`).", "default": false }, "excludePartnerSupplied": { "title": "Exclude partner-supplied properties", "type": "boolean", "description": "Drop the properties Booking.com lists on behalf of a partner site (`isTpiExclusive`). A property that does not say is kept.", "default": false }, "valueForMoneyOnly": { "title": "Value for money only", "type": "boolean", "description": "Keep only the properties whose guests rate the value for money high (the site's own filter). Asked from Booking.com.", "default": false }, "sustainabilityCertifiedOnly": { "title": "Sustainability certified only", "type": "boolean", "description": "Keep only the properties with a sustainability certification (the site's own filter). Asked from Booking.com.", "default": false }, "maxDistanceFromCenterKm": { "title": "Distance from the center", "enum": [ "any", "0.8", "1.6", "3.2" ], "type": "string", "description": "Keep only the properties within this distance of the center of the destination. Booking.com offers three steps (1/2 mile, 1 mile and 2 miles, shown here in kilometres). Asked from Booking.com.", "default": "any" }, "chains": { "title": "Chains and brands", "maxItems": 50, "uniqueItems": true, "type": "array", "description": "Keep only these brands, by name as listed on Booking.com (e.g. `ibis`, `Mercure`, `Best Western`) or by brand ID (e.g. `1053`). One brand or more: a property of any of them is kept. Asked from Booking.com. Empty = no filter.", "items": { "type": "string", "maxLength": 60 }, "default": [] }, "petFriendlyOnly": { "title": "Pets allowed only", "type": "boolean", "description": "Keep only the properties that allow pets. Asked from Booking.com.", "default": false }, "adultsOnly": { "title": "Adults only", "type": "boolean", "description": "Keep only the properties for adults only. Asked from Booking.com.", "default": false }, "lgbtqFriendlyOnly": { "title": "LGBTQ+ friendly only", "type": "boolean", "description": "Keep only the properties the site marks as LGBTQ+ friendly (its \"Travel Proud\" filter). Asked from Booking.com.", "default": false }, "rawFilters": { "title": "Raw Booking.com filters", "pattern": "^[A-Za-z0-9_=;,.%-]*$", "maxLength": 1000, "type": "string", "description": "Any filter of the site that has no field above, as Booking.com writes it in a search URL (`nflt`): e.g. `class=4;review_score=80` or `ht_id=204;hotelfacility=107`. Separate filters with `;`. Combined with the fields above. A filter the site does not know is ignored by Booking.com, without error." }, "availableOnly": { "title": "Available properties only", "type": "boolean", "description": "Leave out the properties with no bookable room for your dates (asked from Booking.com in a search by place, so they are never read; a property searched by link, name or id is dropped when its own card says sold out). Off =the site's own list, which may keep some sold-out properties (`isAvailable: false`, no price).", "default": true }, "excludeKeywords": { "title": "Exclude keywords", "maxItems": 50, "uniqueItems": true, "type": "array", "description": "Drop the properties whose name contains one of these WHOLE words (case and accents ignored): `art` drops \"Art deco\" but keeps \"Smart Hotel\". Several words in one entry (`hand made`) must appear together, in that order.", "items": { "type": "string", "maxLength": 100 }, "default": [] }, "nameContains": { "title": "Name contains", "maxItems": 50, "uniqueItems": true, "type": "array", "description": "Keep only the properties whose name contains at least one of these words (case and accents ignored).", "items": { "type": "string", "maxLength": 100 }, "default": [] }, "minBeds": { "title": "Minimum beds", "minimum": 0, "maximum": 100, "type": "integer", "description": "Keep only the properties whose recommended room has at least this many beds. 0 = no filter. A property that does not say is dropped when this is set.", "default": 0 }, "maxBedrooms": { "title": "Maximum bedrooms", "minimum": 0, "maximum": 50, "type": "integer", "description": "Keep only the properties whose recommended room has at most this many bedrooms. 0 = studios only. Empty = no filter. A property that does not say is dropped when this is set." }, "minBedrooms": { "title": "Minimum bedrooms (whole place)", "minimum": 0, "maximum": 5, "type": "integer", "description": "Keep only the places with at least this many bedrooms (the site's own bedrooms filter, 1-5). 0 = no filter. Asked from Booking.com. **Minimum beds** and **Maximum bedrooms** below check the room Booking.com suggests instead.", "default": 0 }, "minBathrooms": { "title": "Minimum bathrooms", "minimum": 0, "maximum": 8, "type": "integer", "description": "Keep only the places with at least this many bathrooms (the site's own filter, 1-8). 0 = no filter. Asked from Booking.com.", "default": 0 }, "bedPreference": { "title": "Bed type", "enum": [ "any", "twin", "double", "queen", "king" ], "type": "string", "description": "Keep only the properties that have this kind of bed (the site's own filter). Asked from Booking.com.", "default": "any" }, "smokingAllowedOnly": { "title": "Smoking allowed only", "type": "boolean", "description": "Needs **Extract full property profile**. Drop the properties whose page says smoking is not allowed; a page that does not say is kept.", "default": false }, "excludePropertyIds": { "title": "Exclude property IDs", "maxItems": 5000, "uniqueItems": true, "type": "array", "description": "Booking.com property ids to skip, even when they match the search (e.g. your own hotels).", "default": [], "items": { "type": "string" } }, "onlyNew": { "title": "Only new properties", "type": "boolean", "description": "Skip the properties that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their profile is not even fetched. First run = everything is new.", "default": false }, "trackPriceChanges": { "title": "Price changes", "type": "boolean", "description": "Needs **Only new properties**. A property already delivered under this **Memory key** comes back, whole, when its price per night has moved by at least the **Price change threshold (%)** since the run that delivered it, for the same stay (same dates, guests, rooms and currency): `previousPrice`, `priceChange`, `priceChangePct` and `priceChangedAt` are filled. Charged per property that comes back as **Price change**, on top of the property itself, see Pricing; a property whose price did not move enough is skipped and costs nothing, and a property with no price is never a change. Use fixed dates (for example `2026-12-20`): a relative check-in such as `14 days` moves the stay at every run, so its prices are learned again instead of compared. The first run after you tick it learns the prices and reports no change. Each search is read to its last page because any property of it can change its price: a run takes longer than with **Only new properties** alone. Unticked (default) = the four columns are always null and nothing is charged.", "default": false }, "priceChangeThreshold": { "title": "Price change threshold (%)", "minimum": 0.1, "maximum": 100, "type": "number", "description": "Used with **Price changes**. How far a price per night must move, up or down, from the price delivered for the property to come back: 3 means a price that goes from 100 to 103 or to 97. From 0.1 to 100.", "default": 3 }, "stateKey": { "title": "Memory key", "pattern": "^[a-zA-Z0-9_-]{1,64}$", "maxLength": 64, "type": "string", "description": "Name of the memory used by **Only new properties**. Give each schedule / task its own key (e.g. `paris-hotels`) so that they do not share their memory. Letters, digits, `-` and `_`.", "default": "default" }, "resetState": { "title": "Reset the memory", "type": "boolean", "description": "Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every property again. Untick it afterwards.", "default": false }, "proxyConfiguration": { "title": "Proxy configuration", "type": "object", "description": "Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.", "default": { "useApifyProxy": true } }, "maxConcurrency": { "title": "Max concurrency", "minimum": 1, "maximum": 50, "type": "integer", "description": "Maximum number of requests processed in parallel.", "default": 8 }, "maxRequestsPerMinute": { "title": "Max requests per minute", "minimum": 10, "maximum": 2000, "type": "integer", "description": "Most requests to the site in any 60 seconds, all of them counted: results pages, listing pages, the extra page read for a listing and, before the crawl, the lookups of hotel names and property links. A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.", "default": 120 }, "minRequestIntervalMs": { "title": "Min delay between requests", "minimum": 0, "maximum": 60000, "type": "integer", "description": "Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.", "default": 0 }, "maxRequestRetries": { "title": "Max request retries", "minimum": 0, "maximum": 20, "type": "integer", "description": "Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.", "default": 5 }, "debugLog": { "title": "Debug log", "type": "boolean", "description": "Include debug messages in the run log.", "default": false } } }, "runsResponseSchema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string" }, "actId": { "type": "string" }, "userId": { "type": "string" }, "startedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "finishedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "status": { "type": "string", "example": "READY" }, "meta": { "type": "object", "properties": { "origin": { "type": "string", "example": "API" }, "userAgent": { "type": "string" } } }, "stats": { "type": "object", "properties": { "inputBodyLen": { "type": "integer", "example": 2000 }, "rebootCount": { "type": "integer", "example": 0 }, "restartCount": { "type": "integer", "example": 0 }, "resurrectCount": { "type": "integer", "example": 0 }, "computeUnits": { "type": "integer", "example": 0 } } }, "options": { "type": "object", "properties": { "build": { "type": "string", "example": "latest" }, "timeoutSecs": { "type": "integer", "example": 300 }, "memoryMbytes": { "type": "integer", "example": 1024 }, "diskMbytes": { "type": "integer", "example": 2048 } } }, "buildId": { "type": "string" }, "defaultKeyValueStoreId": { "type": "string" }, "defaultDatasetId": { "type": "string" }, "defaultRequestQueueId": { "type": "string" }, "buildNumber": { "type": "string", "example": "1.0.0" }, "containerUrl": { "type": "string" }, "usage": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "integer", "example": 1 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 }, "PROXY_UNBLOCKER_UNITS": { "type": "integer", "example": 0 } } }, "usageTotalUsd": { "type": "number", "example": 0.00005 }, "usageUsd": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "number", "example": 0.00005 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 }, "PROXY_UNBLOCKER_UNITS": { "type": "integer", "example": 0 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for Booking.com Hotels Scraper from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: