{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Scraper — Hotel Prices, Availability, Reviews",
    "description": "Booking.com hotels for any city and your dates, guests and currency: price per night and total with taxes, room, free cancellation, breakfast, stars, review score, address, map point, photos and guest reviews. Price-watch mode returns only changed prices.",
    "version": "0.1",
    "x-build-id": "4wzxpJc6AutDdxKzZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dottti~booking-hotels/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dottti-booking-hotels",
        "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/dottti~booking-hotels/runs": {
      "post": {
        "operationId": "runs-sync-dottti-booking-hotels",
        "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/dottti~booking-hotels/run-sync": {
      "post": {
        "operationId": "run-sync-dottti-booking-hotels",
        "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": "Cities or areas",
            "type": "array",
            "description": "Places to search, the same as typing into the Booking.com search box. Examples: Dubai, Riyadh, Makkah, Jeddah, Doha, Downtown Dubai, London, Paris. Each entry becomes its own search with its own free status row.",
            "default": [
              "Dubai"
            ],
            "items": {
              "type": "string"
            }
          },
          "hotelUrls": {
            "title": "Hotel URLs (optional)",
            "type": "array",
            "description": "Booking.com hotel pages, for example https://www.booking.com/hotel/ae/burj-al-arab.html . A numeric Booking.com hotel id also works. Use this to track a fixed list of hotels. Search filters do not apply to these.",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Format YYYY-MM-DD. Leave empty to use 'Check-in in N days' below, which is best for daily schedules."
          },
          "checkOut": {
            "title": "Check-out date",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Format YYYY-MM-DD. Leave empty to use the number of nights below."
          },
          "checkInDaysFromNow": {
            "title": "Check-in in N days",
            "minimum": 0,
            "maximum": 480,
            "type": "integer",
            "description": "Used when Check-in date is empty. 14 means two weeks from the day the run starts, so a daily schedule always looks the same distance ahead.",
            "default": 14
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of stay, used when Check-out date is empty.",
            "default": 1
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Adults in total, across all rooms.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "One age per child, 0 to 17. Example: [5, 9] for two children. Prices and room choice change with children.",
            "default": []
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of rooms. Each room needs at least one adult.",
            "default": 1
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "3-letter code. Examples: USD, SAR, AED, QAR, KWD, BHD, OMR, JOD, EGP, EUR, GBP.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Booking.com site language for hotel names, room names and labels. Examples: en-us, en-gb, ar, fr, de. Reviews keep the language each guest wrote in.",
            "default": "en-us"
          },
          "maxHotels": {
            "title": "Max hotels per destination",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Booking.com shows up to 1,000 properties per search. Each hotel row is one charge.",
            "default": 20
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "popularity",
              "price",
              "price_high_to_low",
              "review_score",
              "stars_and_price",
              "review_score_and_price",
              "distance"
            ],
            "type": "string",
            "description": "Order of results, the same as the Booking.com sort menu.",
            "default": "popularity"
          },
          "minStars": {
            "title": "Minimum stars",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "0 = any. 4 keeps 4- and 5-star properties.",
            "default": 0
          },
          "minReviewScore": {
            "title": "Minimum review score",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "0 = any. Booking.com scores run from 1 to 10. Example: 8 for 'Very good: 8+'.",
            "default": 0
          },
          "minPricePerNight": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "number",
            "description": "0 = no minimum. In the currency above, before taxes and fees that Booking.com shows separately.",
            "default": 0
          },
          "maxPricePerNight": {
            "title": "Maximum price per night",
            "minimum": 0,
            "type": "number",
            "description": "0 = no maximum. In the currency above, before taxes and fees that Booking.com shows separately.",
            "default": 0
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep only offers you can cancel for free.",
            "default": false
          },
          "breakfastIncludedOnly": {
            "title": "Breakfast included only",
            "type": "boolean",
            "description": "Keep only offers with breakfast in the price.",
            "default": false
          },
          "hotelsOnly": {
            "title": "Hotels only",
            "type": "boolean",
            "description": "Leave out apartments, holiday homes, hostels and other property types.",
            "default": false
          },
          "includeUnavailable": {
            "title": "Include sold-out hotels",
            "type": "boolean",
            "description": "Hotels with no rooms for your dates are skipped by default. On: they are output free of charge with available set to false.",
            "default": false
          },
          "includePhotos": {
            "title": "Include photo gallery",
            "type": "boolean",
            "description": "Adds a list of photo links per hotel. Costs one extra request per hotel, so runs take longer. The main photo is always included.",
            "default": false
          },
          "maxPhotos": {
            "title": "Max photos per hotel",
            "minimum": 1,
            "maximum": 45,
            "type": "integer",
            "description": "Used when the photo gallery is on.",
            "default": 10
          },
          "includeReviews": {
            "title": "Include guest reviews",
            "type": "boolean",
            "description": "Adds review rows for each hotel: score, title, liked and disliked text, date, traveller type, room, guest country and first name as shown on Booking.com. Each review row is one charge.",
            "default": false
          },
          "maxReviewsPerHotel": {
            "title": "Max reviews per hotel",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Used when guest reviews are on.",
            "default": 10
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "oldest",
              "most_relevant",
              "highest_score",
              "lowest_score"
            ],
            "type": "string",
            "description": "Which reviews come first.",
            "default": "newest"
          },
          "onlyChanged": {
            "title": "Price watch: only output changes",
            "type": "boolean",
            "description": "Compares each hotel and stay with the previous run of the same watch list. Only new hotels, changed prices or availability, and reviews not seen before are output and charged. Each hotel row carries priceWatch with the old and new values.",
            "default": false
          },
          "watchListName": {
            "title": "Watch list name",
            "type": "string",
            "description": "Name for the saved state, for example riyadh-weekend. Runs with the same name compare against each other. Empty: a name is made from your destinations, hotels, guests, currency and filters. Setting a name also adds priceWatch to every hotel row."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave empty for the automatic ladder: no proxy first, then Apify datacenter, then Apify residential only if Booking.com keeps refusing. Pick a residential country to see the prices shown in that country."
          },
          "autoProxyFallback": {
            "title": "Automatic proxy fallback",
            "type": "boolean",
            "description": "Move to the next proxy tier when Booking.com keeps refusing.",
            "default": true
          },
          "allowResidentialFallback": {
            "title": "Allow residential proxy as last step",
            "type": "boolean",
            "description": "Residential proxy is the most reliable tier.",
            "default": true
          },
          "concurrency": {
            "title": "Parallel lookups",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Photo and review lookups in flight at once. Requests still start at least the delay below apart.",
            "default": 3
          },
          "requestDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 150,
            "maximum": 30000,
            "type": "integer",
            "description": "Minimum gap between request starts.",
            "default": 500
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Attempts per request before a search or hotel is marked failed. Each retry waits longer and may switch session or proxy tier.",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}