{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Scraper - Hotels, Reviews, Prices & Availability",
    "description": "Scrape Booking.com hotels for any destination or hotel: guest reviews (incl. rating-only), live prices, room rates, availability and occupancy, plus a forward availability calendar. Search a city or country, or paste hotel links. Structured JSON/CSV, no code, no login.",
    "version": "1.0",
    "x-build-id": "rrNxb94uoxXRHz8Bc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/factden~booking-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-factden-booking-com-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/factden~booking-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-factden-booking-com-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/factden~booking-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-factden-booking-com-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": {
          "searchLocation": {
            "title": "📍 Discover hotels in a place",
            "maxItems": 100,
            "type": "array",
            "description": "A city, region, or country per line - e.g. `Rome`, `Bali`, `Germany`. Each is expanded into **every** hotel in that destination (paginated + de-duplicated). Always does destination discovery - it never collapses to a single hotel. Tip: use a clean place name for precision. A theme phrase like `beach hotels in Bali` still works (it resolves to the nearest matching place) but the theme word is not a filter - Booking lists the whole destination. To narrow, use the Min rating / price filters below. To target a brand or exact property, use the fields below instead.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "🔍 …or a destination / exact hotel name",
            "maxItems": 100,
            "type": "array",
            "description": "One destination or exact hotel name per line - e.g. `Rome` (a city, expanded to its hotels) or `The Venetian Macao` (resolves to that one hotel). Hotel-name matching works best with a clean, distinctive name; a generic or padded phrase (e.g. `Hotel Le Meurice Paris`) can occasionally resolve to the wrong property, and the run log warns when the match looks off. For an exact hotel every time, paste its Booking.com URL into Start URLs below. For the 'all hotels in a location' workflow, prefer the Search location field above.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 …or add Booking.com links",
            "maxItems": 1000,
            "type": "array",
            "description": "Booking.com hotel or search URLs, one per line - e.g. `https://www.booking.com/hotel/fr/le-meurice.html` (a hotel) or a `searchresults.html?ss=Rome` (a city). Both a plain URL list and the `[{\"url\": \"...\"}]` object form are accepted. Resolved by the page slug, so a stale `dest_id` inside the URL is ignored. The most reliable way to target one exact hotel. You get exactly those hotels (or every hotel in that destination).",
            "items": {
              "type": "string"
            }
          },
          "includePrices": {
            "title": "💵 Include prices & occupancy",
            "type": "boolean",
            "description": "Fetch each hotel's live price breakdown (gross, net, per-night, taxes) plus availability - rooms left, sold-out rooms, and scarcity signals. Needs the check-in/out dates below (defaults to tomorrow, 1 night).",
            "default": true
          },
          "includeReviews": {
            "title": "⭐ Include reviews",
            "type": "boolean",
            "description": "Fetch guest reviews for each hotel into the separate `reviews` dataset - score, positive/negative text, reviewer name & country, traveller type, stay dates, room, and the hotel's reply. Includes rating-only reviews (score with no text) too.",
            "default": false
          },
          "includeAvailabilityCalendar": {
            "title": "📅 Include availability calendar",
            "type": "boolean",
            "description": "Fetch a forward availability calendar per hotel into the separate `calendar` dataset - per day: available/sold-out and the minimum price. Cost scales with the number of days.",
            "default": false
          },
          "minPrice": {
            "title": "💲 Min price / night",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep hotels whose price per night is at or above this (in the selected currency). Leave empty for no lower bound."
          },
          "maxPrice": {
            "title": "💲 Max price / night",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep hotels whose price per night is at or below this. Leave empty for no upper bound."
          },
          "minGuestRating": {
            "title": "📈 Minimum guest rating",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Only keep hotels with a guest review score at or above this (0-10 scale). 0 = no filter.",
            "default": 0
          },
          "propertyType": {
            "title": "🏩 Property type",
            "enum": [
              "any",
              "hotel",
              "apartment",
              "resort",
              "villa",
              "hostel",
              "guesthouse",
              "bedAndBreakfast",
              "homestay",
              "motel"
            ],
            "type": "string",
            "description": "Not currently applied. Booking's discovery API has no property-type filter, so results include every accommodation type regardless of this setting. Each result's actual type is in the `propertyType` output field; use Min rating and Min/Max price to narrow results reliably.",
            "default": "any"
          },
          "maxResults": {
            "title": "🔢 Max hotels per destination",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many unique hotels per destination search. 0 = no cap. A small number keeps a first run fast and cheap; raise it for a full-market sweep. (Ignored for direct hotel links - those always return.)",
            "default": 20
          },
          "checkInDate": {
            "title": "📅 Check-in",
            "type": "string",
            "description": "Check-in day (YYYY-MM-DD). Prices/availability are date-scoped. **Leave both dates empty and, with prices on, the actor prices a 1-night stay for tomorrow (run date + 1), computed at run time.**"
          },
          "checkOutDate": {
            "title": "📅 Check-out",
            "type": "string",
            "description": "Check-out day (YYYY-MM-DD). Must be after check-in. Leave both empty for a 1-night stay tomorrow."
          },
          "adults": {
            "title": "👤 Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of adult guests used for price quotes.",
            "default": 2
          },
          "children": {
            "title": "🧒 Children",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Number of children.",
            "default": 0
          },
          "childrenAges": {
            "title": "🧒 Children ages",
            "type": "array",
            "description": "Age of each child (0-17), one per line. Should match the number of children above.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "rooms": {
            "title": "🛏️ Rooms",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of rooms.",
            "default": 1
          },
          "maxReviews": {
            "title": "🔢 Max reviews per hotel",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Cap on reviews pulled per hotel (paginated, 100/page). Set 0 for all available reviews - a popular hotel can have several thousand (text reviews first, then rating-only). Pricing is per review, so this is your main review cost control.",
            "default": 100
          },
          "reviewsSort": {
            "title": "↕️ Sort reviews by",
            "enum": [
              "newest",
              "oldest",
              "highest",
              "lowest",
              "relevant"
            ],
            "type": "string",
            "description": "Order reviews are fetched in.",
            "default": "newest"
          },
          "reviewLanguages": {
            "title": "🗣️ Review languages",
            "type": "array",
            "description": "Only collect reviews written in these language codes (e.g. `en`, `de`, `fr`). Leave empty for all languages.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "calendarDays": {
            "title": "📆 Calendar days forward",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How many days of the forward availability calendar to pull per hotel (auto-chunked into 60-day windows). Availability is billed per calendar day, so cost scales with this.",
            "default": 60
          },
          "currency": {
            "title": "💱 Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "INR",
              "JPY",
              "AUD",
              "CAD",
              "CHF",
              "SGD",
              "AED",
              "BRL",
              "CNY",
              "HKD",
              "MXN",
              "ZAR",
              "THB",
              "IDR",
              "KRW",
              "SEK",
              "NZD",
              "PLN",
              "MYR",
              "VND",
              "PHP",
              "TRY"
            ],
            "type": "string",
            "description": "Currency for all prices.",
            "default": "USD"
          },
          "language": {
            "title": "🗣️ Language",
            "enum": [
              "en-us",
              "en-gb",
              "de",
              "fr",
              "es",
              "it",
              "pt",
              "nl",
              "pl",
              "ru",
              "ja",
              "zh",
              "ar",
              "id",
              "th",
              "ko",
              "ms",
              "vi",
              "tr",
              "hi"
            ],
            "type": "string",
            "description": "Language for hotel names, review text and labels.",
            "default": "en-us"
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Datacenter (default) is sufficient for Booking.com at typical volumes. Switch to Residential only if you scale very hard and see throttling.",
            "default": {
              "useApifyProxy": true
            }
          },
          "useResidentialFallback": {
            "title": "🛟 Residential fallback",
            "type": "boolean",
            "description": "If datacenter proxies get blocked mid-run, automatically retry the few run-critical requests on residential proxies so the run still returns results. Only used when datacenter fails, and only if your account has residential access.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}