{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Hotels Scraper & Price Tracker",
    "description": "Booking.com hotels scraper and hotel price tracker (Booking scraper): hotel prices from Booking.com search results for any destination and dates — stay price, taxes, review score, reviews, stars, type, location, photo. Tracks price changes between runs. One flat row per property, no personal data.",
    "version": "0.1",
    "x-build-id": "0E5I0cClA9Hafm0wn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/myth84~booking-hotels-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-myth84-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/myth84~booking-hotels-scraper/runs": {
      "post": {
        "operationId": "runs-sync-myth84-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/myth84~booking-hotels-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-myth84-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": {
          "locations": {
            "title": "Destinations",
            "maxItems": 50,
            "type": "array",
            "description": "One or more destinations, one per line, as typed on Booking.com, e.g. <code>Lisbon, Portugal</code>, <code>Rome, Italy</code>. Each is its own search with the same dates, guests, filters and currency, and <b>maxResults applies to each destination</b> (and to each search URL). A property found twice is saved and charged once. Always searched, also with destId or startUrls: clear the list to search those only. Up to 50. Default empty; with no destination at all, the Actor searches Lisbon.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "startUrls": {
            "title": "Booking.com search URLs",
            "type": "array",
            "description": "Booking.com search results URLs copied from your browser (<code>https://www.booking.com/searchresults.html?ss=…</code>), one search each: their destination, dates, guests, rooms, sort, filters (<code>nflt</code>), currency and language are kept, and the form fills what a URL leaves out. A URL that is not a results page is refused with the reason. Default empty: search by destination.",
            "items": {
              "type": "string",
              "pattern": "^https?://([a-z0-9-]+\\.)*booking\\.com/searchresults"
            },
            "default": []
          },
          "location": {
            "title": "Single destination",
            "type": "string",
            "description": "Single destination (kept for compatibility; prefer <code>locations</code>), as typed in the Booking.com search box, e.g. <code>Lisbon, Portugal</code>; searched first, before the destinations of <code>locations</code> (up to 50 together). If Booking.com cannot resolve the text, give its <code>destId</code>. Leave empty when you use locations."
          },
          "destId": {
            "title": "Destination id",
            "minimum": -2147483648,
            "maximum": 2147483647,
            "type": "integer",
            "description": "Booking.com destination id, the reliable way to target a place: the <code>dest_id</code> of a search URL, a whole number, negative for cities, e.g. <code>-2167973</code> for Lisbon. Searched for <code>location</code>, or alone. Optional when the destination text is resolved. The destinations of <code>locations</code> are searched too: clear that list (prefilled with Lisbon) to search this id only."
          },
          "destType": {
            "title": "Destination type",
            "enum": [
              "CITY",
              "DISTRICT",
              "REGION",
              "COUNTRY",
              "LANDMARK",
              "AIRPORT",
              "HOTEL"
            ],
            "type": "string",
            "description": "Type of the destination id (<code>dest_type</code> of the search URL): CITY, DISTRICT, REGION, COUNTRY, LANDMARK, AIRPORT or HOTEL. Default CITY: the type of most destination ids, and the one validated.",
            "default": "CITY"
          },
          "checkIn": {
            "title": "Check-in",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-in date, YYYY-MM-DD, e.g. <code>2026-12-01</code>, given with checkOut. Leave both empty for a stay relative to today (checkInDaysFromNow and nights), better for schedules: fixed dates expire."
          },
          "checkOut": {
            "title": "Check-out",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Check-out date, YYYY-MM-DD, after checkIn, e.g. <code>2026-12-04</code>. Required when checkIn is set."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Without fixed dates: check-in this many days after today (UTC), e.g. <code>7</code> for next week. Default 30: a month ahead, a typical booking window, and the stay moves with each scheduled run so it never expires.",
            "default": 30
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Without fixed dates: length of the stay in nights, 1 to 30. Default 3: a typical city break.",
            "default": 3
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of adults, 1 to 30; prices depend on it. Default 2: the most searched occupancy.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Number of children (0 to 17 years old); give their ages in childrenAges, prices depend on them. Default 0: adults only.",
            "default": 0
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "Age of each child, one number per child, e.g. <code>[5, 9]</code>. Default empty: a child without a listed age counts as 8 years old.",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 17
            },
            "default": []
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of rooms (units) to book, 1 to 30. Default 1: one room for all the guests.",
            "default": 1
          },
          "maxResults": {
            "title": "Maximum properties",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of properties saved and charged, 1 to 1,000 (Booking.com serves about 1,000 per search; one request returns 100). With <code>locations</code> it applies to each destination; with price monitoring it is the number compared. Default 100: enough to compare a city, about $0.25 on the Free plan. The form is prefilled with 20 for a quick first run.",
            "default": 100
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "popularity",
              "price",
              "bayesian_review_score",
              "review_score_and_price",
              "class",
              "distance_from_search",
              "upsort_bh"
            ],
            "type": "string",
            "description": "Order of the results: <code>popularity</code> (Booking.com's top picks) and <code>price</code> (lowest first) are validated; the other orders of the Booking.com sort bar are passed as they are. Default popularity: the order visitors see first.",
            "default": "popularity"
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only these accommodation types, e.g. <code>[\"hotels\"]</code>; several types add up. Hotels is validated; the other types are Booking.com's own filter values, to confirm at the first run (the run log lists them). Default empty: every type.",
            "items": {
              "type": "string",
              "enum": [
                "hotels",
                "apartments",
                "hostels",
                "guest_houses",
                "bed_and_breakfasts",
                "villas",
                "holiday_homes",
                "aparthotels",
                "homestays"
              ],
              "enumTitles": [
                "Hotels",
                "Apartments — to confirm",
                "Hostels — to confirm",
                "Guest houses — to confirm",
                "Bed and breakfasts — to confirm",
                "Villas — to confirm",
                "Holiday homes — to confirm",
                "Aparthotels — to confirm",
                "Homestays — to confirm"
              ]
            },
            "default": []
          },
          "starRatings": {
            "title": "Star ratings",
            "type": "array",
            "description": "Keep only these official star ratings, numbers from 1 to 5, e.g. <code>[4, 5]</code> for 4 or 5 stars. To confirm at the first run. Default empty: any rating.",
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5
            },
            "default": []
          },
          "minReviewScore": {
            "title": "Minimum review score",
            "minimum": 6,
            "maximum": 9,
            "type": "integer",
            "description": "Minimum guest review score out of 10: 6, 7, 8 or 9, e.g. <code>8</code> for \"Very good: 8+\". To confirm at the first run. Leave empty for any score."
          },
          "priceMin": {
            "title": "Min price per night",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Lowest price per night, a whole amount in the currency of the search, e.g. <code>50</code> (Booking.com's budget filter), 0 to 1,000,000,000 so that currencies counted in millions (IDR, VND) fit. To confirm at the first run. Leave empty for no minimum."
          },
          "priceMax": {
            "title": "Max price per night",
            "minimum": 1,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Highest price per night, a whole amount in the currency of the search, greater than priceMin, e.g. <code>150</code>, 1 to 1,000,000,000. To confirm at the first run. Leave empty for no maximum."
          },
          "freeCancellation": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep only the properties that offer free cancellation. To confirm at the first run. Default off: every property.",
            "default": false
          },
          "breakfastIncluded": {
            "title": "Breakfast included only",
            "type": "boolean",
            "description": "Keep only the properties with breakfast included. To confirm at the first run. Default off: every property.",
            "default": false
          },
          "filters": {
            "title": "Other filters (Booking.com nflt)",
            "type": "string",
            "description": "For experts: any other Booking.com filter, as the <code>nflt</code> parameter of a search URL, filters separated by <code>;</code>, e.g. <code>ht_id=204</code> for hotels only. The filter fields above are added to it; the README lists the supported values. Leave empty for none."
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "ISO 4217 code of every price, e.g. <code>USD</code>, <code>EUR</code> or <code>GBP</code>; pick one or type any code Booking.com accepts (USD and EUR validated). Default EUR: the currency of our validation runs.",
            "default": "EUR"
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-z]{2}(-[a-z]{2})?$",
            "type": "string",
            "description": "Booking.com language of property types, neighbourhoods and badges, e.g. <code>en-us</code>, <code>en-gb</code>, <code>fr</code>, <code>de</code>, <code>es</code>; pick one or type any Booking.com code. Default en-us: English (US), the language validated.",
            "default": "en-us"
          },
          "monitorPrices": {
            "title": "Monitor prices",
            "type": "boolean",
            "description": "Compare the total price of each property with the one recorded by your previous run of the same search, and fill changeType, previousPrice and priceDelta. maxResults is then the number of properties compared. Default off: a plain search.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitoring store name",
            "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$",
            "type": "string",
            "description": "Key-value store of your account that keeps the previous prices, one record per search (each destination has its own), e.g. <code>booking-lisbon-daily</code>. Letters, digits and dashes, up to 63 characters. Default booking-price-monitor: one store for all your monitoring runs.",
            "default": "booking-price-monitor"
          },
          "onlyChanges": {
            "title": "Only changes",
            "type": "boolean",
            "description": "With monitorPrices: save and charge only the new properties and the price changes; a run without any change succeeds with an empty dataset. Default off: every compared property is saved with its changeType.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies of the requests. Default: Apify datacenter proxies, included in the price and enough in our tests. A proxy country you select is recorded in viewCountryCode; you can also give your own proxy URLs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxRequests": {
            "title": "Max requests",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Safety cap on API requests for the whole run: one per 100 properties, plus about one to resolve a destination given as text. Default 100: enough for 50 destinations of 100 properties.",
            "default": 100
          },
          "delayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Pause between two page requests of the same search, in milliseconds; 0 disables it. Default 800: steady pacing that worked for every request of our tests.",
            "default": 800
          },
          "debugStoreHtml": {
            "title": "Store raw API responses",
            "type": "boolean",
            "description": "Debugging only: save every API response (JSON) in the run's key-value store. Default off: it uses storage.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}