# Booking.com Scraper - 50+ fields per property (`webdata_labs/booking-scraper`) Actor

\[💵 $8.00 / 1K · no start fee] Scrape Booking.com hotels, apartments and homes for any destination and dates. 50+ fields per property: exact coordinates, street address, review subscores, discounts, local-currency rates, free-cancellation deadline. Filter by price, stars, score and type.

- **URL**: https://apify.com/webdata\_labs/booking-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** Travel, E-commerce, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.10 / 1,000 property scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Booking.com Scraper - prices, coordinates, review subscores and policies

**Scrape Booking.com hotels, apartments and homes into a clean spreadsheet. 60 fields per property, including the exact coordinates and the free-cancellation deadline that other Booking scrapers leave out.**

Give it a destination and your dates - or paste a Booking.com search URL - and get back every property with nightly rate, stay total, what the price includes, star rating, review score, review subscore, street address, latitude/longitude, distance to the centre, room composition and cancellation policy.

### ✅ What you get / ❌ what this isn't

| ✅ This Actor gives you | ❌ This Actor is not |
|---|---|
| **60 fields per property**, not the usual ~20 | Not a name-and-price list |
| **Exact latitude/longitude and street address** on every row | Not "2.1 km from centre" and nothing else |
| **Nightly rate and stay total**, plus the price in the property's own currency | Not one ambiguous price number |
| **Free-cancellation deadline** as a real timestamp, not a yes/no | Not a boolean you still have to check by hand |
| **Review subscores** (Location 9.3, Staff 9.1...) alongside the headline score | Not the overall score only |
| Beds, bedrooms, bathrooms, kitchens for apartments and homes | Not hotels-only |
| **No start fee, no warm-up surcharge** - you pay per property, full stop | Not a per-run charge on top of per-result |
| Many destinations in one run | Not one run per city |

### 🔎 Why this one

- **The fields that make the data usable.** Coordinates and street address mean you can map, geofence or join to your own data straight away. Most Booking scrapers hand you a distance string and a hotel name.
- **Prices you can actually compare.** Booking shows some searches as a nightly rate and others as a stay total, depending on which experiment your session lands in. This Actor always returns **both**, plus `priceBeforeDiscount` and the itemised discounts.
- **Taxes broken out as a number when Booking states them.** Where the rate is quoted exclusive ("+US$25 taxes and fees"), you get `taxesAndFeesIncluded: false` and `taxesAndFeesAmount: 25` instead of a string to re-parse. Booking only returns this on some sessions, so treat it as a bonus rather than a guarantee.
- **The cancellation deadline, not just a flag.** `freeCancellationUntil` is an ISO timestamp - the actual moment the free window closes.
- **Real pagination.** Booking.com ignores `offset` in the URL and pages results in through its own internal call. This Actor drives that call directly, so you get hundreds of properties per destination instead of the first 25.
- **Fast.** The first page costs one browser load; every further 25 properties takes well under a second. ~150 properties in about 13 seconds.
- **No start fee.** A run that finds nothing costs nothing.

### 👥 Who it's for

- **Revenue managers and hoteliers** tracking competitor rates by date, star class and district.
- **Travel and OTA analysts** building rate-parity or price-index datasets.
- **Short-let and property investors** comparing apartment and whole-home inventory by neighbourhood.
- **Market researchers** mapping accommodation supply, pricing and ratings by geography.
- **Developers** who need Booking.com inventory as clean JSON or CSV.

### ⚙️ How to scrape Booking.com

1. Open the Actor on Apify.
2. Type a **Location**, e.g. `Paris`.
3. Set **Check-in** and **Check-out**. Leave them empty for a rolling 2-night stay 30 days out - handy for scheduled runs.
4. Set **Adults**, **Children** and **Rooms** - Booking prices by occupancy, so these change the rates you get.
5. Set **Maximum properties** - the budget for the whole run, split evenly across your locations.
6. Optional: filter by price, star rating, review score, property type or free cancellation, and pick a sort order.
7. Click **Start**, then download the results as CSV, JSON or Excel.

Prefer a URL? Skip steps 2-6 and paste your Booking.com search URL into **Booking.com search URLs** - the filters already in it are honoured.

### 📥 Input

```json
{
  "locationQuery": "Barcelona",
  "locationQueries": ["Amsterdam"],
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-13",
  "adults": 2,
  "rooms": 1,
  "maxResults": 200,
  "currency": "EUR",
  "sortBy": "reviewScore",
  "minReviewScore": 8,
  "starRatings": ["4", "5"],
  "freeCancellationOnly": true
}
````

| Field | Meaning |
|---|---|
| `locationQuery` | City, region, country, district or property name, as you would type it on Booking.com. |
| `locationQueries` | Extra locations to search in the same run, up to 25. |
| `startUrls` | Paste Booking.com search URLs; their filters are used as-is. |
| `checkIn` / `checkOut` | `YYYY-MM-DD`. Leave empty for a rolling window 30 days out. |
| `adults`, `children`, `childrenAges`, `rooms` | Occupancy. Booking prices depend on it. |
| `maxResults` | Properties for the whole run, split across your locations. |
| `sortBy` | Top picks, price, review score, stars high/low, distance from centre. |
| `currency` / `language` | 3-letter currency code and a Booking language code such as `en-us`. |
| `minPricePerNight` / `maxPricePerNight` | Nightly rate range, in the currency above. |
| `starRatings` | Keep only these star ratings, e.g. `["4", "5"]`. |
| `minReviewScore` | 6+, 7+, 8+ or 9+ out of 10. |
| `propertyTypes` | Hotels, apartments, entire homes, hostels, guest houses, B\&Bs, resorts, villas. |
| `freeCancellationOnly` | Only rates that can be cancelled free. |
| `proxyConfiguration` | Apify Proxy residential by default. Recommended to leave as-is. |

### 📤 Output

One row per property:

| name | pricePerNight | price | currency | reviewScore | reviewCount | starRating | district | freeCancellation | url |
|---|---|---|---|---|---|---|---|---|---|
| Castex Hotel | 178.15 | 356.3 | USD | 7.4 | 823 | 3 | 4th arr., Paris | true | [link](https://www.booking.com/hotel/fr/castexhotel.html) |

**Identity:** `name`, `hotelId`, `url`, `slug`, `accommodationTypeId`

**Location:** `latitude`, `longitude`, `address`, `city`, `countryCode`, `district`, `popularDistrict`, `distanceFromCentre`, `distanceFromCentreMetres`, `isCentrallyLocated`, `publicTransport`, `beachDistance`

**Ratings:** `starRating`, `starRatingType`, `reviewScore`, `reviewCount`, `reviewLabel`, `topSubscore`, `topSubscoreName`

**Pricing:** `price`, `pricePerNight`, `currency`, `priceBeforeDiscount`, `discountAmount`, `discounts`, `priceInPropertyCurrency`, `propertyCurrency`, `chargesInfo`, `taxesAndFeesIncluded`, `taxesAndFeesAmount`

**Policies and badges:** `freeCancellation`, `freeCancellationUntil`, `noPrepayment`, `petsAllowedFree`, `isPreferredPartner`, `isSponsored`, `isSoldOut`, `isNewlyOpened`, `isSustainable`, `hostType`, `urgencyMessage`

**Rooms:** `roomId`, `bedCount`, `bedrooms`, `bathrooms`, `kitchens`, `livingRooms`

**Media and context:** `photoUrl`, `thumbnailUrl`, `checkIn`, `checkOut`, `nights`, `searchQuery`, `destination`, `totalResultsAvailable`, `scrapedAt`

<details>
<summary>Sample row</summary>

```json
{
  "name": "Castex Hotel",
  "hotelId": 51233,
  "url": "https://www.booking.com/hotel/fr/castexhotel.html",
  "address": "5, Rue Castex",
  "city": "Paris",
  "countryCode": "fr",
  "latitude": 48.852638648955526,
  "longitude": 2.366083860397339,
  "district": "4th arr., Paris",
  "popularDistrict": "Le Marais",
  "distanceFromCentreMetres": 1200,
  "publicTransport": "Bastille station is within 250 meters",
  "starRating": 3,
  "reviewScore": 7.4,
  "reviewCount": 823,
  "reviewLabel": "Good",
  "topSubscore": 9.3,
  "topSubscoreName": "Location",
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-12",
  "nights": 2,
  "price": 356.3,
  "pricePerNight": 178.15,
  "currency": "USD",
  "priceBeforeDiscount": 687.43,
  "discountAmount": 331.13,
  "priceInPropertyCurrency": 313.12,
  "propertyCurrency": "EUR",
  "taxesAndFeesIncluded": true,
  "freeCancellation": true,
  "freeCancellationUntil": "2026-09-10T12:00:00Z",
  "bedCount": 1,
  "hostType": "PROFESSIONAL"
}
```

</details>

#### Quick preview

| Input | Output |
|---|---|
| `Paris`, 2 adults, 2 nights | 25-1,000 properties with rates, coordinates and review scores |
| `Barcelona` + `Amsterdam`, score 8+, sorted by review score | The best-rated stays in both cities, tagged by city, in one dataset |
| `Lisbon`, `propertyTypes: ["apartments"]`, 4 adults | Apartments with bedrooms, bathrooms and kitchen counts on every row |

### 💵 How much does it cost?

**$8.00 per 1,000 properties. No start fee** - a run that returns nothing costs you nothing, and there is no surcharge for small runs.

| Properties | Cost |
|---|---|
| 25 (one page) | $0.20 |
| 100 | $0.80 |
| 1,000 | $8.00 |

### 🚀 Ready-made setups

Five ready-to-run tasks ship with this Actor - open one, hit Start, or copy it and swap in your own destination and dates:

| Task | What it does |
|---|---|
| [Scrape 5-star hotels in Paris on Booking.com](https://apify.com/webdata_labs/booking-scraper/examples/booking-5-star-hotels-paris) | Every 5-star property in Paris, best-rated first, with coordinates and nightly rates. |
| [Find cheap Booking.com hotels in Barcelona](https://apify.com/webdata_labs/booking-scraper/examples/booking-cheap-hotels-barcelona) | Barcelona stays under $90 a night, cheapest first, with review scores and free-cancellation flags. |
| [Scrape apartments and aparthotels in Lisbon](https://apify.com/webdata_labs/booking-scraper/examples/booking-family-apartments-lisbon) | Lisbon apartments for 4 guests, with bedroom, bathroom and kitchen counts on every row. |
| [Scrape top-rated Booking.com hotels in Tokyo](https://apify.com/webdata_labs/booking-scraper/examples/booking-top-rated-hotels-tokyo) | Tokyo properties scoring 9+ out of 10, with review counts and subscores. |
| [Find New York hotels with free cancellation](https://apify.com/webdata_labs/booking-scraper/examples/booking-free-cancellation-new-york) | New York stays that can be cancelled free, with the cancellation deadline where Booking gives one. |

### 🔁 Run it on the Apify platform

Schedule it to track your competitors' rates every morning, call it from the Apify API, export to CSV/JSON/Excel, or wire it into Make, Zapier, Google Sheets or a webhook so fresh pricing lands wherever you work.

### ⚠️ Limits and caveats

- Reads only **public** Booking.com search results. It does not log in and it does not book anything.
- **Prices are occupancy- and date-specific.** Change `adults`, `rooms` or the dates and the rates change. Always store `checkIn`, `checkOut` and `nights` with the price - they are on every row for this reason.
- **Booking.com personalises and A/B-tests its ranking.** Two runs minutes apart can return slightly different orders and totals. Filters and sorting are honoured; exact ordering is not guaranteed to be reproducible.
- `priceInPropertyCurrency` and `propertyCurrency` appear only when your chosen currency differs from the property's own - Booking omits the conversion otherwise.
- `chargesInfo`, `taxesAndFeesIncluded` and `taxesAndFeesAmount` depend on Booking returning a charges note for that session; they are populated on some runs and empty on others, for the same search.
- `beachDistance` is populated for coastal destinations only.
- Booking stops serving new properties after roughly **1,000 per search**. For bigger sweeps, split by district, price band or property type.
- **`propertyTypes` uses Booking.com's own grouped categories, so a few neighbouring types come along.** Asking for `apartments` mostly returns apartments but also some aparthotels; `entireHomes` also matches whole apartments and guest houses. Filter on `accommodationTypeId` in the output if you need one exact type.
- **Price filters apply to Booking.com's base rate, not to the `pricePerNight` we return.** Once fees and currency conversion are applied, a handful of rows can land slightly above your ceiling. Set the cap ~10% below your true limit, or filter `pricePerNight` yourself afterwards.
- Review subscores exist only where Booking has enough reviews to compute one; star ratings are absent for unrated properties such as many guesthouses.
- **Residential proxy is on by default and should stay on.** Booking.com answers datacenter IPs with a redirect to its homepage rather than search results, so a datacenter run returns nothing. Each retry moves to a different exit IP; the Actor fails the run loudly rather than reporting a green run with zero rows.

### 🧩 Related Actors

- **Google Maps Business Scraper** - local businesses and points of interest around the same coordinates.
- **Trustpilot Review Scraper** - reputation data for the brands behind the properties.

### ❓ FAQ

**Do I need a Booking.com account?** No. It reads public search results only.

**Can I scrape several destinations in one run?** Yes - add them to `locationQueries`. Every row is tagged with the `searchQuery` it came from.

**Can I get more than the first 25 results?** Yes. That is a large part of why this Actor exists - Booking ignores `offset` in the URL, and this Actor drives Booking's own pagination instead.

**Is the price per night or for the whole stay?** Both. `pricePerNight` and `price` (stay total) are on every row, along with `nights`.

**Why do some prices differ from what I see in my browser?** Booking personalises rates by currency, occupancy, device and Genius status. Set `currency`, `adults` and `rooms` to match what you want to compare.

**Can I reuse a search I built in my browser?** Yes - paste the URL into `startUrls`.

**Why are some fields empty?** Some fields only exist for some property kinds: bedroom and kitchen counts for apartments and homes, beach distance for coastal destinations, subscores for properties with enough reviews.

### 🛠️ Support

If a run fails or a field looks wrong, open an Actor issue with the run URL, the input you used, and what you expected. Booking.com changes its internals regularly - reports get fixed quickly.

### ⭐ Rate this Actor

If this Actor saved you time, please take 30 seconds to leave a review on the **Reviews** tab - reviews are the main trust signal other users see, and they decide which features get built next. If something is broken, please open an issue first: we typically respond within a day and would love the chance to fix it before you rate.

# Actor input Schema

## `locationQuery` (type: `string`):

City, region, country, district or property name to search, exactly as you would type it on Booking.com. Example: 'Paris', 'Costa Brava', 'Shibuya, Tokyo'.

## `locationQueries` (type: `array`):

Extra locations to search in the same run. Each one gets an equal share of the maximum results. Up to 25 locations.

## `startUrls` (type: `array`):

Paste Booking.com search result URLs to scrape them as-is, including any filters already applied in the URL. Use this instead of the fields above when you have already built the search on Booking.com.

## `checkIn` (type: `string`):

Check-in date as YYYY-MM-DD. Leave empty to search a rolling window starting 30 days from the run date, which keeps scheduled runs working without edits.

## `checkOut` (type: `string`):

Check-out date as YYYY-MM-DD. Leave empty for a 2-night stay after the check-in date.

## `adults` (type: `integer`):

Number of adults per room. Booking.com prices depend on occupancy, so this changes the rates you get back.

## `children` (type: `integer`):

Number of children. Booking.com requires an age per child; any child without an age in 'Children ages' is assumed to be 8.

## `childrenAges` (type: `array`):

Age of each child at check-out, for example \[4, 9]. Affects both pricing and which properties accept the booking.

## `rooms` (type: `integer`):

Number of rooms required for the stay.

## `maxResults` (type: `integer`):

Maximum number of properties to return across all searches. Booking.com stops serving new properties after roughly 1,000 per search.

## `sortBy` (type: `string`):

Result ordering. 'Top picks' is Booking.com's own default ranking.

## `currency` (type: `string`):

Currency for the returned prices, as a 3-letter code such as USD, EUR or GBP. The property's own currency is returned as well.

## `language` (type: `string`):

Booking.com language code for the returned text, such as en-us, en-gb, de, fr or es.

## `minPricePerNight` (type: `integer`):

Only return properties at or above this nightly rate, in the currency selected above.

## `maxPricePerNight` (type: `integer`):

Only return properties at or below this nightly rate, in the currency selected above. Booking.com applies this to its own base rate, so a few results can come back slightly above your ceiling once fees and currency conversion are added.

## `starRatings` (type: `array`):

Only return properties with these star ratings. Leave empty for all. Unrated properties are excluded whenever this filter is set.

## `minReviewScore` (type: `string`):

Only return properties scoring at least this much out of 10. Booking.com buckets this to 6, 7, 8 or 9 and up.

## `propertyTypes` (type: `array`):

Only return these kinds of accommodation. These are Booking.com's own grouped categories, so neighbouring types come along: 'Apartments' also returns some aparthotels, and 'Entire homes' also matches whole apartments and guest houses. Filter on accommodationTypeId in the output for one exact type.

## `freeCancellationOnly` (type: `boolean`):

Only return rates that can be cancelled free of charge.

## `proxyConfiguration` (type: `object`):

Proxy used to reach Booking.com. Residential is the default and is strongly recommended: Booking.com serves datacenter IPs a redirect to its homepage instead of search results, which yields an empty run.

## `maxRequestRetries` (type: `integer`):

How many times to retry a search page that comes back as a Booking.com challenge or homepage redirect instead of results. Each retry moves to a different proxy exit IP.

## Actor input object example

```json
{
  "locationQuery": "Paris",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "maxResults": 100,
  "sortBy": "popularity",
  "currency": "USD",
  "language": "en-us",
  "freeCancellationOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `properties` (type: `string`):

No description

## `pricing` (type: `string`):

No description

## `location` (type: `string`):

No description

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locationQuery": "Paris"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/booking-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locationQuery": "Paris" }

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/booking-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locationQuery": "Paris"
}' |
apify call webdata_labs/booking-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=webdata_labs/booking-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Scraper - 50+ fields per property",
        "description": "[💵 $8.00 / 1K · no start fee] Scrape Booking.com hotels, apartments and homes for any destination and dates. 50+ fields per property: exact coordinates, street address, review subscores, discounts, local-currency rates, free-cancellation deadline. Filter by price, stars, score and type.",
        "version": "0.1",
        "x-build-id": "eqtvWqzj38lcNw4Fh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/webdata_labs~booking-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-webdata_labs-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/webdata_labs~booking-scraper/runs": {
            "post": {
                "operationId": "runs-sync-webdata_labs-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/webdata_labs~booking-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-webdata_labs-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": {
                    "locationQuery": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, region, country, district or property name to search, exactly as you would type it on Booking.com. Example: 'Paris', 'Costa Brava', 'Shibuya, Tokyo'."
                    },
                    "locationQueries": {
                        "title": "More locations",
                        "type": "array",
                        "description": "Extra locations to search in the same run. Each one gets an equal share of the maximum results. Up to 25 locations.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Booking.com search URLs",
                        "type": "array",
                        "description": "Paste Booking.com search result URLs to scrape them as-is, including any filters already applied in the URL. Use this instead of the fields above when you have already built the search on Booking.com.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "checkIn": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Check-in date as YYYY-MM-DD. Leave empty to search a rolling window starting 30 days from the run date, which keeps scheduled runs working without edits."
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Check-out date as YYYY-MM-DD. Leave empty for a 2-night stay after the check-in date."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Number of adults per room. Booking.com prices depend on occupancy, so this changes the rates you get back.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of children. Booking.com requires an age per child; any child without an age in 'Children ages' is assumed to be 8.",
                        "default": 0
                    },
                    "childrenAges": {
                        "title": "Children ages",
                        "type": "array",
                        "description": "Age of each child at check-out, for example [4, 9]. Affects both pricing and which properties accept the booking."
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Number of rooms required for the stay.",
                        "default": 1
                    },
                    "maxResults": {
                        "title": "Maximum properties",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of properties to return across all searches. Booking.com stops serving new properties after roughly 1,000 per search.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "popularity",
                            "price",
                            "reviewScore",
                            "starsDescending",
                            "starsAscending",
                            "distanceFromCentre"
                        ],
                        "type": "string",
                        "description": "Result ordering. 'Top picks' is Booking.com's own default ranking.",
                        "default": "popularity"
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Currency for the returned prices, as a 3-letter code such as USD, EUR or GBP. The property's own currency is returned as well.",
                        "default": "USD"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Booking.com language code for the returned text, such as en-us, en-gb, de, fr or es.",
                        "default": "en-us"
                    },
                    "minPricePerNight": {
                        "title": "Minimum price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return properties at or above this nightly rate, in the currency selected above."
                    },
                    "maxPricePerNight": {
                        "title": "Maximum price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return properties at or below this nightly rate, in the currency selected above. Booking.com applies this to its own base rate, so a few results can come back slightly above your ceiling once fees and currency conversion are added."
                    },
                    "starRatings": {
                        "title": "Star ratings",
                        "type": "array",
                        "description": "Only return properties with these star ratings. Leave empty for all. Unrated properties are excluded whenever this filter is set.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ]
                        }
                    },
                    "minReviewScore": {
                        "title": "Minimum review score",
                        "enum": [
                            "6",
                            "7",
                            "8",
                            "9"
                        ],
                        "type": "string",
                        "description": "Only return properties scoring at least this much out of 10. Booking.com buckets this to 6, 7, 8 or 9 and up."
                    },
                    "propertyTypes": {
                        "title": "Property types",
                        "type": "array",
                        "description": "Only return these kinds of accommodation. These are Booking.com's own grouped categories, so neighbouring types come along: 'Apartments' also returns some aparthotels, and 'Entire homes' also matches whole apartments and guest houses. Filter on accommodationTypeId in the output for one exact type.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hotels",
                                "apartments",
                                "entireHomes",
                                "hostels",
                                "guestHouses",
                                "bedAndBreakfasts",
                                "resorts",
                                "villas"
                            ],
                            "enumTitles": [
                                "Hotels",
                                "Apartments",
                                "Entire homes",
                                "Hostels",
                                "Guest houses",
                                "Bed and breakfasts",
                                "Resorts",
                                "Villas"
                            ]
                        }
                    },
                    "freeCancellationOnly": {
                        "title": "Free cancellation only",
                        "type": "boolean",
                        "description": "Only return rates that can be cancelled free of charge.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy used to reach Booking.com. Residential is the default and is strongly recommended: Booking.com serves datacenter IPs a redirect to its homepage instead of search results, which yields an empty run.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "maxRequestRetries": {
                        "title": "Maximum retries",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a search page that comes back as a Booking.com challenge or homepage redirect instead of results. Each retry moves to a different proxy exit IP.",
                        "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
