{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Hotels Scraper - Prices, Rooms & Availability",
    "description": "Scrape Booking.com hotels, apartments and other stays by destination, dates and guests: total and nightly price, rating, review count, stars, coordinates, room and bed details, free-cancellation and breakfast flags. Optional rooms and rates and a nightly price calendar. Monitor mode. No login.",
    "version": "0.1",
    "x-build-id": "x9Sm2fcHH5t2J8wuJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/topapi~booking-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-topapi-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/topapi~booking-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-topapi-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/topapi~booking-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-topapi-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": {
          "search": {
            "title": "🔍 Destination",
            "type": "string",
            "description": "A city, region, district, landmark or airport as you would type it on Booking.com, e.g. \"Lisbon\", \"Tuscany\", \"Eiffel Tower\". Booking's own autocomplete picks the destination."
          },
          "searches": {
            "title": "More destinations",
            "type": "array",
            "description": "Several destinations in one run, one per line, e.g. \"Porto\", \"Bali\", \"Shinjuku\". Each is searched separately (see Max properties per search).",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Booking.com URLs",
            "type": "array",
            "description": "Search-result URLs (dates, guests, filters and sort are read from the URL) and hotel page URLs, e.g. https://www.booking.com/hotel/gb/royal-national.html (that property with its price for the dates).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "hotelIds": {
            "title": "Hotel ids",
            "type": "array",
            "description": "Booking.com numeric property ids (the hotelId field of a previous run), e.g. 4045490. Returns each property with its price for the dates below.",
            "items": {
              "type": "string"
            }
          },
          "destinationId": {
            "title": "Destination id",
            "type": "string",
            "description": "Booking.com dest_id when you already know it (skips the name lookup), e.g. -2167973 for Lisbon. Set the destination type too."
          },
          "destinationType": {
            "title": "Destination type",
            "enum": [
              "CITY",
              "REGION",
              "DISTRICT",
              "LANDMARK",
              "AIRPORT",
              "COUNTRY"
            ],
            "type": "string",
            "description": "The type of the destination id above (Booking's dest_type). With a destination name it picks which autocomplete match to use."
          },
          "latitude": {
            "title": "Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Search around a point instead of a named place, e.g. 40.758 (with longitude). Pair with Radius to keep only properties within a distance."
          },
          "longitude": {
            "title": "Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Longitude of the point, e.g. -73.9855."
          },
          "checkIn": {
            "title": "📅 Check-in",
            "type": "string",
            "description": "YYYY-MM-DD or relative: \"30 days\", \"2 weeks\", \"tomorrow\". Empty = 30 days from today. Prices exist only for concrete dates."
          },
          "checkOut": {
            "title": "📅 Check-out",
            "type": "string",
            "description": "YYYY-MM-DD or relative. Empty = two nights after check-in."
          },
          "flexWindow": {
            "title": "Flexible dates",
            "enum": [
              "0",
              "1",
              "2",
              "3",
              "7"
            ],
            "type": "string",
            "description": "Also search stays starting up to N days before and after check-in (same length); each property keeps its cheapest stay, with its own dates in checkinDate / checkoutDate.",
            "default": "0"
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Adult guests across all rooms.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Child guests. Booking prices children by age, so set their ages below.",
            "default": 0
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "One age (0-17) per child, e.g. 5 and 12. Missing ages default to 10.",
            "items": {
              "type": "string"
            }
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of rooms.",
            "default": 1
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO code for prices, e.g. USD, EUR, GBP. Rows also carry the price in the property's own currency.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Booking.com locale for names, labels and room titles, e.g. en-us, en-gb, de, fr.",
            "default": "en-us"
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only these kinds of places (Booking's property-type filter). Empty = every type.",
            "items": {
              "type": "string",
              "enum": [
                "204",
                "201",
                "220",
                "216",
                "208",
                "203",
                "213",
                "206",
                "205",
                "222",
                "219",
                "212",
                "221",
                "223",
                "210",
                "214",
                "224",
                "228",
                "215",
                "209",
                "225",
                "226"
              ],
              "enumTitles": [
                "Hotels",
                "Apartments",
                "Vacation Homes",
                "Guesthouses",
                "Bed and Breakfasts",
                "Hostels",
                "Villas",
                "Resorts",
                "Motels",
                "Homestays",
                "Condo Hotels",
                "Resort Villages",
                "Lodges",
                "Country Houses",
                "Farm Stays",
                "Campgrounds",
                "Luxury tents",
                "Chalets",
                "Boats",
                "Ryokans",
                "Capsule Hotels",
                "Love Hotels"
              ]
            }
          },
          "starRatings": {
            "title": "Star ratings",
            "type": "array",
            "description": "Keep only these star classes (Booking's filter). Empty = any.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "unrated"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars",
                "Unrated only"
              ]
            }
          },
          "minScore": {
            "title": "Minimum review score",
            "type": "string",
            "description": "Guest score on Booking's 10-point scale: 6 Pleasant, 7 Good, 8 Very Good, 9 Wonderful (Booking's own filter). Any other value, e.g. 8.4, is applied on top of the nearest one."
          },
          "minPrice": {
            "title": "Min price per night",
            "minimum": 0,
            "type": "integer",
            "description": "In the selected currency, per night (Booking's price filter compares the total price divided by the nights)."
          },
          "maxPrice": {
            "title": "Max price per night",
            "minimum": 0,
            "type": "integer",
            "description": "In the selected currency, per night. Empty = no upper bound."
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Only properties with a free-cancellation rate.",
            "default": false
          },
          "breakfastIncluded": {
            "title": "Breakfast included only",
            "type": "boolean",
            "description": "Only properties whose rate includes breakfast.",
            "default": false
          },
          "mealPlans": {
            "title": "Meal plans",
            "type": "array",
            "description": "Booking's meal filter, e.g. All-inclusive. Empty = any.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "9",
                "8",
                "3",
                "4",
                "999"
              ],
              "enumTitles": [
                "Breakfast included",
                "Breakfast & dinner included",
                "Breakfast & lunch included",
                "All meals included",
                "All-inclusive",
                "Kitchen facilities"
              ]
            }
          },
          "facilities": {
            "title": "Facilities",
            "type": "array",
            "description": "Only properties with all of these facilities (Booking's filter).",
            "items": {
              "type": "string",
              "enum": [
                "107",
                "2",
                "433",
                "16",
                "109",
                "8",
                "3",
                "7",
                "5",
                "11",
                "54",
                "63",
                "10",
                "17",
                "146",
                "185",
                "182",
                "14",
                "15",
                "22",
                "141",
                "20",
                "56",
                "72",
                "55"
              ],
              "enumTitles": [
                "Free Wifi",
                "Parking",
                "Swimming pool",
                "Non-smoking rooms",
                "Air conditioning",
                "24-hour front desk",
                "Restaurant",
                "Bar",
                "Room service",
                "Fitness center",
                "Spa and wellness center",
                "Hot tub",
                "Sauna",
                "Airport shuttle",
                "Beachfront",
                "Wheelchair accessible",
                "Electric vehicle charging station",
                "Garden",
                "Terrace",
                "Laundry",
                "Shared kitchen",
                "Business center",
                "Playground",
                "BBQ facilities",
                "Massage"
              ]
            }
          },
          "distanceFromCentre": {
            "title": "Distance from centre",
            "enum": [
              "any",
              "1000",
              "3000",
              "5000"
            ],
            "type": "string",
            "description": "Booking's distance-from-centre filter for city searches.",
            "default": "any"
          },
          "onlyAvailable": {
            "title": "Only available properties",
            "type": "boolean",
            "description": "Booking's \"only show available properties\" filter.",
            "default": false
          },
          "rawFilters": {
            "title": "Other Booking filters",
            "type": "string",
            "description": "Any filter string from a Booking.com URL's nflt parameter, e.g. roomfacility=11;popular_activities=11 (air conditioning, fitness). Added to the filters above."
          },
          "sortBy": {
            "title": "Sort by",
            "type": "string",
            "description": "Booking's own orderings: popularity (Our top picks), price, price_from_high_to_low, review_score_and_price, bayesian_review_score (Top reviewed), class, class_asc, distance_from_search, upsort_bh (homes first).",
            "default": "popularity"
          },
          "travelPurpose": {
            "title": "Trip type",
            "enum": [
              "leisure",
              "business"
            ],
            "type": "string",
            "description": "Booking's leisure / business switch.",
            "default": "leisure"
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only properties with at least this many guest reviews, e.g. 50."
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 0,
            "type": "number",
            "description": "With latitude / longitude: keep only properties within this distance of the point, e.g. 2."
          },
          "swLat": {
            "title": "Box: south-west latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "With the three fields below: keep only properties inside this box (the search runs around its centre)."
          },
          "swLon": {
            "title": "Box: south-west longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "South-west corner longitude."
          },
          "neLat": {
            "title": "Box: north-east latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "North-east corner latitude."
          },
          "neLon": {
            "title": "Box: north-east longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "North-east corner longitude."
          },
          "extractAdditionalHotelData": {
            "title": "➕ Hotel details",
            "type": "boolean",
            "description": "Adds description, full address, check-in/out times, facilities, every room with all rates and cancellation policies, review sub-scores, house rules, photos, surroundings, FAQ and operator details. Charged as hotel-details.",
            "default": false
          },
          "maxHotelsToEnrich": {
            "title": "Add-ons for the first N properties",
            "minimum": 0,
            "type": "integer",
            "description": "Fetch the add-ons for only the first N properties of the run; the rest come without them. 0 = all."
          },
          "includeReviews": {
            "title": "➕ Guest reviews",
            "type": "boolean",
            "description": "Attach guest reviews to each property (liked / disliked text, score, date, country, traveler type, room, hotel reply). Charged as review, per review attached.",
            "default": false
          },
          "maxReviewsPerHotel": {
            "title": "Reviews per property",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Up to 100 per property (Booking serves 25 per request).",
            "default": 10
          },
          "reviewsSortBy": {
            "title": "Review order",
            "enum": [
              "most_relevant",
              "newest",
              "oldest",
              "highest_score",
              "lowest_score"
            ],
            "type": "string",
            "description": "Which reviews come first.",
            "default": "most_relevant"
          },
          "reviewsGuestType": {
            "title": "Reviews from",
            "enum": [
              "all",
              "families",
              "couples",
              "group_of_friends",
              "solo_travellers",
              "business_travellers"
            ],
            "type": "string",
            "description": "Keep only reviews from this kind of guest (Booking's filter).",
            "default": "all"
          },
          "reviewsLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "Two-letter code, e.g. en, de. Empty = all languages."
          },
          "stripPersonalData": {
            "title": "Strip reviewer names (GDPR-friendly)",
            "type": "boolean",
            "description": "ON (default): guestName is empty on every review; the country, traveler type and stay details are kept. Turn OFF only if you have a lawful basis to process reviewers' first names.",
            "default": true
          },
          "includeCalendar": {
            "title": "➕ Nightly price calendar",
            "type": "boolean",
            "description": "Attach a day-by-day calendar from the check-in date: available or not, the nightly price and the minimum stay. Charged as calendar-day, per day attached.",
            "default": false
          },
          "calendarDays": {
            "title": "Calendar days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How many days from check-in, up to 365 (Booking serves 61 per request).",
            "default": 30
          },
          "monitorMode": {
            "title": "🔁 Monitor mode",
            "type": "boolean",
            "description": "Return only properties not delivered by earlier runs of the same search (plus price drops, below). Pairs with a daily schedule.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor memory name",
            "type": "string",
            "description": "Name of the key-value store that remembers delivered properties. Use one name per watch list.",
            "default": "booking-hotels-monitor"
          },
          "monitorPriceDrops": {
            "title": "Also return price drops",
            "type": "boolean",
            "description": "In monitor mode, also return a property seen before when its price is now lower (monitorChange = priceDrop, with previousPrice).",
            "default": true
          },
          "maxItems": {
            "title": "📦 Max properties",
            "minimum": 0,
            "type": "integer",
            "description": "Per run, across all destinations and URLs. Booking serves about 1,000 per search; above 1,000 the search is split by price to go further. 0 = everything.",
            "default": 100
          },
          "maxItemsPerSearch": {
            "title": "Max properties per search",
            "minimum": 0,
            "type": "integer",
            "description": "Cap per destination or search URL, so one big city does not use up the whole run. 0 = no per-search cap."
          },
          "compact": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Core fields only (name, url, price, rating, stars, location, flags), sized for AI agents and MCP.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Keep the default Apify Proxy (datacenter). Booking.com answers Apify's own IP addresses with a bot-check page, so a proxy is required.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel requests (searches and add-on lookups).",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}