{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Hotels Scraper",
    "description": "Scrape Booking.com hotels by place and dates: prices, availability, property details, rooms and guest reviews. Export to JSON, CSV or Excel.",
    "version": "0.0",
    "x-build-id": "NnU7EXtTsx8TS21tx"
  },
  "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
          },
          "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
          },
          "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"
            ],
            "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"
            ],
            "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
          },
          "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
          },
          "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
          },
          "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"
              ],
              "enumTitles": [
                "Hotels",
                "Apartments",
                "Vacation homes",
                "Villas",
                "Guesthouses",
                "Hostels",
                "Bed and breakfasts",
                "Chalets",
                "Country houses",
                "Farm stays",
                "Homestays",
                "Condo hotels",
                "Campgrounds",
                "Love hotels"
              ]
            },
            "default": []
          },
          "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": []
          },
          "mealPlan": {
            "title": "Meals",
            "enum": [
              "any",
              "breakfast",
              "breakfast_dinner",
              "kitchen"
            ],
            "type": "string",
            "description": "Keep only the properties with this meal option. Asked from Booking.com.",
            "default": "any"
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep only the properties with free cancellation for your stay. 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": []
          },
          "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`; `stay_type=2` keeps adults-only properties (`stay_type=1` pets allowed, `stay_type=4` LGBTQ+ friendly: the site's \"Travel group\" filter). 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 words (case and accents ignored).",
            "items": {
              "type": "string",
              "maxLength": 100
            },
            "default": []
          },
          "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
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}