{
  "openapi": "3.0.1",
  "info": {
    "title": "Booking Scraper — Rate Intelligence, Comp-Set & Price Drops",
    "description": "Booking.com rate-intelligence engine. Returns a ranked value queue — which hotels are underpriced vs comparable properties, whose rates dropped, where demand is softening — with Saved Rate Memory, comp-set position, and watchlist deltas. Drop-in replacement for voyager/booking-scraper.",
    "version": "1.0",
    "x-build-id": "Gzn472oFM0FjyCaoz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ryanclinton~booking-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ryanclinton-booking-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/ryanclinton~booking-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ryanclinton-booking-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/ryanclinton~booking-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ryanclinton-booking-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "rates",
              "properties",
              "market",
              "benchmark",
              "watchlist",
              "date_scan"
            ],
            "type": "string",
            "description": "Entry point. 'rates' (default) ranks a destination's hotels by value for your dates. 'properties' analyses specific hotel URLs. 'market' returns a destination's rate/demand trajectory + indices. 'benchmark' ranks YOUR hotel within its market. 'watchlist' tracks a comp-set and returns what changed since last run. 'date_scan' scans a date range for the cheapest/best-value dates + a rate calendar. Leave fields empty to use the London demo."
          },
          "destination": {
            "title": "Destination (city / area)",
            "type": "string",
            "description": "Rates / market / watchlist / date_scan: a city or area, e.g. 'London'. The actor ranks hotels by where they sit vs comparable properties and how the market is moving.",
            "default": "London"
          },
          "checkIn": {
            "title": "Check-in date (YYYY-MM-DD)",
            "type": "string",
            "description": "Stay start date. Booking only returns complete per-date rates with dates - leave empty and the actor uses a demo window, but real value needs your dates (confidence is penalised without them).",
            "default": ""
          },
          "checkOut": {
            "title": "Check-out date (YYYY-MM-DD)",
            "type": "string",
            "description": "Stay end date.",
            "default": ""
          },
          "propertyUrls": {
            "title": "Hotel URLs (properties / date_scan)",
            "type": "array",
            "description": "Properties mode: Booking /hotel/<country>/<slug>.html URLs to analyse. Each result carries its rate position vs comparable properties + rate history.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "myHotelUrl": {
            "title": "My hotel URL (benchmark mode)",
            "type": "string",
            "description": "Benchmark mode: your own property's Booking URL. The actor ranks it within its market on rate, value, occupancy pressure, pricing discipline, and comp-set drift.",
            "default": ""
          },
          "adults": {
            "title": "Guests (adults)",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Number of guests used to size the search and the rate.",
            "default": 2
          },
          "rooms": {
            "title": "Rooms",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Number of rooms used to size the search.",
            "default": 1
          },
          "rankBy": {
            "title": "Rank by",
            "enum": [
              "value",
              "rateValueScore",
              "rateDrop",
              "demand",
              "softMarket",
              "rating",
              "recency",
              "rate"
            ],
            "type": "string",
            "description": "How to order the value queue. 'value' (default) and 'rateValueScore' are the wedge no other Booking actor ships. 'rateDrop' surfaces the biggest cuts. 'demand' surfaces tightest-availability hotels. 'softMarket' sorts by buyer's-market trajectory. 'rate' is cheapest-first.",
            "default": "value"
          },
          "intent": {
            "title": "Intent (auto-presets)",
            "enum": [
              "find_value",
              "monitor_rates",
              "analyze_property",
              "comp_shop",
              "market_trends"
            ],
            "type": "string",
            "description": "Optional shortcut. Picks mode + rankBy + output pack for a common job, so you do not have to set them by hand. Overridden by any field you set explicitly.",
            "default": "find_value"
          },
          "intentEnabled": {
            "title": "Use the intent preset",
            "type": "boolean",
            "description": "Off by default so the mode/rankBy you pick above are used as-is. Turn on to let the intent preset fill mode + rankBy + output pack.",
            "default": false
          },
          "outputPack": {
            "title": "Output pack (persona)",
            "enum": [
              "traveller",
              "revenue-manager",
              "investor",
              "analyst",
              "raw"
            ],
            "type": "string",
            "description": "Reshapes which signals escalate and how the queue is curated. 'traveller' (default) weights value + drops; 'revenue-manager' weights comp-shop + rate moves; 'investor' weights soft markets; 'analyst' weights demand + discovery; 'raw' applies no persona lens.",
            "default": "traveller"
          },
          "outputProfile": {
            "title": "Output profile",
            "enum": [
              "signals",
              "compat",
              "minimal"
            ],
            "type": "string",
            "description": "'signals' (default) = full envelope: rate value score + comp position + signals + attention + rate history + delta. 'compat' = exact voyager field set with validated URLs/IDs, no signal fields (migration parity). 'minimal' = name + URL + rate + value score only.",
            "default": "signals"
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Composable on any mode. A stable name for this comp-set / market. Rate, availability, and rating history persist in a named store keyed on this name across runs, so you get a 'what changed' delta + a Competitor Movers feed. The retention moat for revenue managers.",
            "default": ""
          },
          "watchlistMemory": {
            "title": "Watchlist memory sharing",
            "enum": [
              "shared",
              "private"
            ],
            "type": "string",
            "description": "'shared' (default) lets your queries strengthen the cross-run rate-history graph (public aggregates only, no per-customer attribution). 'private' keeps this comp-set out of the shared graph.",
            "default": "shared"
          },
          "marketId": {
            "title": "Market subscription id (scheduled market mode)",
            "type": "string",
            "description": "Optional id for a scheduled market subscription, e.g. 'london_4star'. Accumulates days-tracked + observations across scheduled runs.",
            "default": ""
          },
          "deltaWindowDays": {
            "title": "Delta window (days)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "The comparison window for delta intelligence (what changed since the prior run) and the new-property window.",
            "default": 7
          },
          "alerts": {
            "title": "Alerts",
            "type": "object",
            "description": "Emit only actionable items + rate cards. { minValueScore (only surface records at/above this score), onlyNewSinceLastRun (watchlist: only changed records), rateDropMinPct (only drops at/above this depth), scarcityThreshold (rooms-left at/below this = scarcity), alertWhenValueImproves }.",
            "default": {}
          },
          "filters": {
            "title": "Filters (property-attribute only)",
            "type": "object",
            "description": "Property-attribute filters ONLY. { starBand ('1-2'|'3'|'4'|'5'), propertyType, maxRate, minRating (0-10 review score), breakfastIncluded }. No demographic or desirability filters.",
            "default": {}
          },
          "limits": {
            "title": "Limits",
            "type": "object",
            "description": "Result + fetch caps. { maxProperties (per destination, <=240), maxDetails, maxDateScanFetches (caps the date_scan fetch budget) }.",
            "default": {
              "maxProperties": 60,
              "maxDetails": 30,
              "maxDateScanFetches": 60
            }
          },
          "rateMemory": {
            "title": "Saved Rate Memory",
            "type": "object",
            "description": "The moat. { enabled (default true - accrues a public rate/availability/rating snapshot on every property+date this run touches), retentionDays (default 365), includeInCommunityBenchmarks (opt-in to public aggregate benchmarks) }.",
            "default": {
              "enabled": true,
              "retentionDays": 365,
              "includeInCommunityBenchmarks": true
            }
          },
          "dateScan": {
            "title": "Date scan range (date_scan mode)",
            "type": "object",
            "description": "Date-scan controls. { startDate (YYYY-MM-DD), nights (stay length per check-in), daysToScan (how many check-in dates), weekdaysOnly }. The worst-case fetch count is logged before the scan and capped by limits.maxDateScanFetches.",
            "default": {
              "nights": 2,
              "daysToScan": 14,
              "weekdaysOnly": false
            }
          },
          "maxRuntimeSeconds": {
            "title": "Max runtime (seconds)",
            "minimum": 60,
            "maximum": 7200,
            "type": "integer",
            "description": "Soft runtime budget. The actor auto-clamps against the Apify timeout and emits partial output before a hard kill.",
            "default": 3600
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify proxy. Defaults to RESIDENTIAL. Leave as default unless you have a reason to change it.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}