{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking.com Price Scanner",
    "description": "Scans one or more Booking.com hotel pages across multiple dates and extracts every available room and rate, including room names, prices, occupancy, cancellation and deal details. Export clean results to CSV, JSON, or Excel.",
    "version": "0.0",
    "x-build-id": "hZnqrUxFRyBrJIyTR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/moving_beacon-owner1~booking-com-price-scanner/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-moving_beacon-owner1-booking-com-price-scanner",
        "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/moving_beacon-owner1~booking-com-price-scanner/runs": {
      "post": {
        "operationId": "runs-sync-moving_beacon-owner1-booking-com-price-scanner",
        "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/moving_beacon-owner1~booking-com-price-scanner/run-sync": {
      "post": {
        "operationId": "run-sync-moving_beacon-owner1-booking-com-price-scanner",
        "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",
        "required": [
          "startUrls",
          "checkIn",
          "checkOut"
        ],
        "properties": {
          "startUrls": {
            "title": "Hotel page URLs",
            "type": "array",
            "description": "Booking.com property page links. Any query params are fine — stale search params (all_sr_blocks, sid, ...) are stripped automatically and your dates/guests are injected.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "checkIn": {
            "title": "Check-in date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "First check-in date to scan, format YYYY-MM-DD."
          },
          "checkOut": {
            "title": "Check-out date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Check-out for the FIRST stay. The difference to check-in defines the stay length used for every scanned day."
          },
          "daysToScan": {
            "title": "Days of prices to scan",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Fetches this many consecutive stays, shifting check-in AND check-out forward one day at a time while keeping the same stay length (e.g. 18→19, 19→20, 20→21 ...).",
            "default": 7
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Number of adults. group_adults and req_adults are set from this, and room1 gets one 'A' per adult.",
            "default": 2
          },
          "childrenAges": {
            "title": "Children ages",
            "type": "array",
            "description": "One age per child, e.g. [5, 9]. Leave empty for no children. group_children, req_children, room1 and &age= params are derived from this automatically.",
            "default": []
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of rooms requested (the no_rooms parameter).",
            "default": 1
          },
          "currency": {
            "title": "Select Currency",
            "enum": [
              "PKR",
              "USD",
              "EUR",
              "SAR",
              "GBP",
              "AED",
              "THB",
              "SGD",
              "ARS",
              "AUD",
              "AZN",
              "BHD",
              "BRL",
              "BGN",
              "CAD",
              "CLP",
              "CNY",
              "COP",
              "CZK",
              "DKK",
              "EGP",
              "FJD",
              "GEL",
              "HKD",
              "HUF",
              "ISK",
              "INR",
              "IDR",
              "ILS",
              "JPY",
              "JOD",
              "KZT",
              "KWD",
              "MOP",
              "MYR",
              "MXN",
              "MDL",
              "NAD",
              "TWD",
              "NZD",
              "NOK",
              "OMR",
              "PLN",
              "QAR",
              "RON",
              "RUB",
              "ZAR",
              "KRW",
              "SEK",
              "CHF",
              "TRY",
              "UAH",
              "XOF"
            ],
            "type": "string",
            "description": "Choose the currency for displaying hotel prices — sent as selected_currency on every request so all prices come back in one currency.",
            "default": "USD"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy is strongly recommended; RESIDENTIAL group works best with Booking. One sticky session is shared by the cookie browser and all page fetches so the IP never changes mid-session.",
            "default": {
              "useApifyProxy": true
            }
          },
          "useBrowserCookies": {
            "title": "Warm up cookies with a real browser",
            "type": "boolean",
            "description": "Launch Playwright Chromium once to earn Booking's session cookies (incl. the AWS WAF token) before fetching with curl_cffi. Disable only if you want pure curl_cffi requests.",
            "default": true
          },
          "impersonate": {
            "title": "TLS fingerprint",
            "enum": [
              "chrome",
              "chrome131",
              "chrome124",
              "chrome99_android",
              "edge101",
              "safari17_0"
            ],
            "type": "string",
            "description": "curl_cffi impersonation target used for every page fetch.",
            "default": "chrome"
          },
          "maxBlockedRetries": {
            "title": "Rotations on block",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "How many times the run may rotate to a new proxy session + fresh cookies after being blocked, retrying the failed page once each time.",
            "default": 1
          },
          "minDelaySecs": {
            "title": "Min delay between requests (s)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Lower bound of the random polite pause between page fetches, in seconds.",
            "default": 2
          },
          "maxDelaySecs": {
            "title": "Max delay between requests (s)",
            "minimum": 0,
            "maximum": 120,
            "type": "integer",
            "description": "Upper bound of the random polite pause between page fetches, in seconds.",
            "default": 4
          },
          "saveHtml": {
            "title": "Save raw HTML pages",
            "type": "boolean",
            "description": "Store every fetched page in the run's key-value store (page-<hotel>-<date>.html) for debugging new layouts.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}