{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Hotel Search Scraper",
    "description": "Scrape every hotel Booking.com is selling for a destination and your dates. Just add city names and get name, stars, guest review score, price for the stay, address, coordinates, free-cancellation flag and a photo. Export to CSV, JSON or Excel, or schedule it.",
    "version": "1.0",
    "x-build-id": "Hjf6fSVdFdLBLxbb0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~booking-hotel-search/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-booking-hotel-search",
        "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/boncross~booking-hotel-search/runs": {
      "post": {
        "operationId": "runs-sync-boncross-booking-hotel-search",
        "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/boncross~booking-hotel-search/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-booking-hotel-search",
        "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": {
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "Cities, regions or districts to search, e.g. \"Paris\" or \"Lisbon\".",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in",
            "type": "string",
            "description": "Arrival date, YYYY-MM-DD. Leave both dates empty to price one night 30 days from today. Not needed when you search flexible months."
          },
          "checkOut": {
            "title": "Check-out",
            "type": "string",
            "description": "Departure date, YYYY-MM-DD. Must be after check-in. Not needed when you search flexible months."
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Adults per room.",
            "default": 2
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many rooms the prices should cover.",
            "default": 1
          },
          "childrenAges": {
            "title": "Children's ages",
            "type": "array",
            "description": "One entry per child, their age at check-in (0-17). Leave empty for adults only.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxHotelsPerDestination": {
            "title": "Max hotels per destination",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many properties per destination. 0 means every one the site returns.",
            "default": 100
          },
          "maxItems": {
            "title": "Max rows in total",
            "minimum": 0,
            "type": "integer",
            "description": "A ceiling for the whole run, across every destination. 0 means no ceiling.",
            "default": 0
          },
          "landmark": {
            "title": "Landmark or airport",
            "type": "string",
            "description": "Search around a landmark or airport instead of across the whole destination, e.g. \"Eiffel Tower\", \"Big Ben\" or \"Heathrow Airport\". It is looked up inside each destination the way Booking.com's own landmark search does (on its own when no destination is given). Rows then come nearest first, unless you choose another sort order, and each carries its distance from the landmark.",
            "default": ""
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Keep properties within this distance: from the landmark, from the map centre, or otherwise from the destination's centre. 0 means no limit. Needed with a map centre.",
            "default": 0
          },
          "mapBoundingBox": {
            "title": "Map area: box",
            "type": "string",
            "description": "Search a rectangle on the map instead of a destination: the south-west and north-east corners as \"south latitude, west longitude, north latitude, east longitude\", e.g. \"48.853, 2.349, 48.865, 2.368\". Replaces the destination list.",
            "default": ""
          },
          "mapCentre": {
            "title": "Map area: centre point",
            "type": "string",
            "description": "Search around a point on the map instead of a destination, as \"latitude, longitude\" in decimal degrees, e.g. \"48.859, 2.3585\", together with a radius. Each row carries its distance from the point. Replaces the destination list.",
            "default": ""
          },
          "flexibleMonths": {
            "title": "Flexible months",
            "type": "array",
            "description": "Search any dates in these months instead of fixed dates, as YYYY-MM (a full date counts as its month), e.g. \"2026-11\". Each property comes back priced for its own cheapest stay that fits the length and start day below, and its row carries those dates. Check-in and check-out are then not needed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "flexibleNights": {
            "title": "Flexible: nights",
            "minimum": 0,
            "maximum": 28,
            "type": "integer",
            "description": "Length of stay for flexible months, 1 to 28 nights.",
            "default": 0
          },
          "flexibleStartDay": {
            "title": "Flexible: start day",
            "enum": [
              "",
              "monday",
              "tuesday",
              "wednesday",
              "thursday",
              "friday",
              "saturday",
              "sunday"
            ],
            "type": "string",
            "description": "The weekday the stay starts on, for flexible months.",
            "default": ""
          },
          "flexibleDays": {
            "title": "Flexible: days either side",
            "minimum": 0,
            "maximum": 7,
            "type": "integer",
            "description": "Let each property's stay move up to this many days either side of check-in, keeping the length of stay: 1, 2, 3 or 7, as Booking.com offers. Each row carries the dates its price is for. 0 means the exact dates.",
            "default": 0
          },
          "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": "Booking's own orderings, as on its Sort menu.",
            "default": "popularity"
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only these kinds of property, by the names on Booking's Property type filter: Hotels, Apartments, Ryokans, Hostels, Guest houses, Villas, Capsule hotels, Entire homes & apartments and so on. What is on offer varies by destination.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minStars": {
            "title": "Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep 3-star properties and up with 3, and so on. Applied by Booking's star filter. 0 keeps everything.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum guest review score",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "Drop properties scoring below this out of 10. Booking's review-score filter does the 6+/7+/8+/9+ part and the rest is checked on each row. 0 keeps everything.",
            "default": 0
          },
          "minPricePerNight": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Booking's budget filter, in the run's currency (US dollars when Currency is empty). 0 means no minimum.",
            "default": 0
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "Booking's budget filter, in the run's currency (US dollars when Currency is empty). 0 means no maximum.",
            "default": 0
          },
          "mealPlans": {
            "title": "Meals",
            "type": "array",
            "description": "Keep properties offering any of these, as on Booking's Meals filter.",
            "items": {
              "type": "string",
              "enum": [
                "breakfast",
                "breakfast_and_dinner",
                "breakfast_and_lunch",
                "all_meals",
                "all_inclusive",
                "self_catering"
              ],
              "enumTitles": [
                "Breakfast included",
                "Breakfast & dinner included",
                "Breakfast & lunch included",
                "All meals included",
                "All-inclusive",
                "Self catering"
              ]
            },
            "default": []
          },
          "onlyFreeCancellation": {
            "title": "Only free cancellation",
            "type": "boolean",
            "description": "Keep only properties offering free cancellation for these dates. Applied by Booking's own filter.",
            "default": false
          },
          "noPrepaymentOnly": {
            "title": "Only no prepayment",
            "type": "boolean",
            "description": "Keep only properties you can book without paying in advance.",
            "default": false
          },
          "excludePartnerSupplied": {
            "title": "Leave out partner-supplied properties",
            "type": "boolean",
            "description": "Some properties are sold on Booking.com from a partner's inventory rather than the property's own. They are real and bookable, and Booking shows them in some answers and not others, so they come and go between identical searches (each row says so in isPartnerSupplied). Turn this on to keep only properties selling their own rooms.",
            "default": false
          },
          "filters": {
            "title": "More Booking filters",
            "type": "array",
            "description": "Any other filter on Booking's sidebar, by its label as shown there (\"Swimming pool\", \"Free WiFi\", \"Pets allowed\", \"Twin beds\", \"Toilet with grab rails\", or a neighbourhood, a hotel brand or a nearby landmark as that sidebar names it: \"Le Marais\", \"Mercure\" and \"Louvre Museum\" in Paris) or its code (\"hotelfacility=433\"). Labels are matched on each destination's own sidebar, and every run saves that sidebar, with each filter's code and count, in its SEARCH_OPTIONS record.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "destinationType": {
            "title": "Destination type",
            "enum": [
              "auto",
              "CITY",
              "REGION",
              "COUNTRY",
              "DISTRICT",
              "LANDMARK",
              "AIRPORT"
            ],
            "type": "string",
            "description": "Force what a name resolves to. \"auto\" prefers a city over a landmark inside it.",
            "default": "auto"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Three-letter code, e.g. USD or EUR. Default USD. Left empty, Booking picks a currency from the visitor's location, which can change between runs.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Booking language code, e.g. en-gb, en-us, de, fr, ja.",
            "default": "en-gb"
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 32,
            "type": "integer",
            "description": "How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.",
            "default": 32
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}