# Booking.com Reviews Scraper (`solidcode/booking-reviews-scraper`) Actor

\[💰 $1.3 / 1K] Extract guest reviews from any Booking.com property — full text, scores, languages, room types, stay dates, and partner replies. Pipe in URLs or pass the output of our Booking.com Scraper directly.

- **URL**: https://apify.com/solidcode/booking-reviews-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Reviews Scraper

Pull every guest review from any Booking.com property at scale — full review text, headlines, 0–10 scores, traveler segments, room types, stay dates, partner replies, and guest-uploaded photos — straight into a clean dataset, one review per row. Pipe in raw property URLs OR drop in the entire output of our [Booking.com Hotel Scraper](https://apify.com/SolidCode/booking-scraper) and start collecting reviews on the same run. Built for hospitality competitive-analysts, market-research firms, hotel-investment due-diligence teams, and SaaS reputation tools that need fresh, structured Booking.com review data without wrestling with rotating filters, multilingual pagination, and embedded reply threads.

### Why This Scraper?

- **$1.30 per 1,000 reviews — flat PPR.** No compute charges, no per-property surcharge, no enrichment upcharges. One row = one review = one charge.
- **Native pipe from the [Booking.com Hotel Scraper](https://apify.com/SolidCode/booking-scraper)** — paste the upstream actor's dataset rows directly into `startUrls`. Any object with a `url` key is auto-detected; every other field is ignored. No glue script, no manual URL extraction.
- **Five-axis filtering on Booking's native facets** — 5 sort orders (Most Relevant, Newest, Oldest, Score High-to-Low, Score Low-to-High), 6 score buckets (Wonderful 9–10, Good 7–9, Okay 5–7, Poor 3–5, Very Poor 1–3, plus All), 26 review languages, 6 traveler segments (Families, Couples, Solo, Groups of Friends, Business, plus All), and 5 seasonal stay windows (Mar–May, Jun–Aug, Sep–Nov, Dec–Feb, plus Any time of year).
- **30 fields per review row** — review headline, "Liked"/"Disliked" body, 0–10 score, helpful-vote count, language code, traveler segment, anonymous flag, guest display name, guest country (ISO-2 + display name), avatar URL, room-type ID + name, nights stayed, stay status, check-in / check-out month, hotel reply text, hotel reply date, photo array (`{ id, urls.thumbnail, urls.large, kind }`), Booking review ID, and a deep-link `reviewUrl` anchored to the review on the property page.
- **26 review languages, individually selectable** — English, German, French, Spanish, Italian, Dutch, Portuguese, Polish, Russian, Japanese, Korean, Chinese, Arabic, Turkish, Swedish, Norwegian, Danish, Finnish, Czech, Hungarian, Romanian, Greek, Hebrew, Thai, Vietnamese, Indonesian. Multi-select for cross-market sentiment work; leave empty to collect every language.
- **Partner reply capture, free** — toggle `Include Hotel Replies` on (default) and every row carries the property's official `partnerReplyText`. Critical for reputation-management SaaS measuring response rate, response speed, and tone across a portfolio.
- **Guest-uploaded photos in every row** — Booking exposes original-resolution `large` and `thumbnail` URLs; both come back as a `photos` array per review for hotel-amenity computer-vision pipelines.
- **Predictable cost ceiling per property** — `Max Reviews Per Property` defaults to 1,000 (worst case $1.30 per property), with `0` opting in to "all available". Booking mega-properties can carry 10,000+ reviews; the cap stops cost runaways before they happen.
- **Tolerant input parsing** — handles plain URL strings, bare `{ "url": "..." }` objects, and full upstream dataset rows with extra fields. Rows where `url` is missing or null are quietly skipped instead of crashing the run.

### Use Cases

**Hospitality Market Research**
- Benchmark guest sentiment across an entire city's 4-star inventory.
- Compare review-language mix to validate which markets a property is winning.
- Quantify month-over-month review velocity and average score for a competitor set.

**Reputation Management & Hotel SaaS**
- Power dashboards that surface fresh negative reviews to ops teams within hours.
- Audit a chain's partner-reply coverage — measure response rate, lag, and tone.
- Feed verbatim "Liked" and "Disliked" text into NLS / topic-modeling pipelines.

**Investment Due-Diligence**
- Pull 10 years of reviews on an acquisition target to validate brand health.
- Detect renovation impact: split scores by check-in date, before vs after a known refurbishment window.
- Surface the top recurring complaints driving sub-7 scores in a target portfolio.

**OTA & Meta-search Aggregation**
- Refresh reviews nightly across a curated catalog of 10,000+ hotels.
- Augment an in-house listings index with multilingual review snippets.
- Cross-check Booking review counts against TripAdvisor / Google for inventory parity.

**Trend & Sentiment Monitoring**
- Track sentiment by season — compare summer vs winter review tone in seasonal markets.
- Compare solo-traveler vs family vs business guest segments on the same property.
- Monitor a single hotel's score distribution week-over-week to flag service drift.

**Travel Editorial & Content**
- Generate "What guests really say about Le Meurice" articles from verified Booking text.
- Curate "Top 25 family-friendly hotels in Lisbon" lists from filtered review datasets.
- Pull guest photos to enrich hotel review write-ups with real-stay imagery.

### Getting Started

#### 1. Minimal — one property, all defaults

Returns up to 1,000 most-relevant reviews from a single property, every language, every traveler type, every score, every season. Hotel replies are included.

```json
{
    "startUrls": [
        { "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html" }
    ]
}
````

#### 2. Mid — newest negative reviews only

Triage the 100 most recent low-scoring reviews to find emerging service issues. Useful for ops dashboards and reputation alerts.

```json
{
    "startUrls": [
        { "url": "https://www.booking.com/hotel/gb/the-savoy.en-gb.html" }
    ],
    "sortBy": "newest",
    "scoreFilter": "poor",
    "maxReviewsPerProperty": 100
}
```

#### 3. Advanced — pipe the Hotel Scraper output, then narrow by language and traveler

Run the [Booking.com Hotel Scraper](https://apify.com/SolidCode/booking-scraper) over a destination first, then drop its dataset rows straight into this actor's `startUrls`. The `url` key on each row is read; every other field (rating, price, address, etc.) is ignored. Below, only English-speaking solo-traveler reviews are collected, capped at 200 per property.

```json
{
    "startUrls": [
        { "url": "https://www.booking.com/hotel/gb/the-savoy.en-gb.html", "name": "The Savoy", "rating": 9.2 },
        { "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html", "name": "Hotel Le Meurice", "rating": 9.0 },
        { "url": "https://www.booking.com/hotel/it/danieli.en-gb.html", "name": "Hotel Danieli", "rating": 8.9 }
    ],
    "languages": ["en"],
    "customerType": "solo",
    "maxReviewsPerProperty": 200,
    "includeReplies": true
}
```

### Input Reference

#### Property URLs

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[ "https://www.booking.com/hotel/fr/le-meurice.en-gb.html" ]` | Booking.com property URLs to scrape reviews from. Accepts plain URL strings, bare `{ "url": "..." }` objects, OR rows from another actor's dataset (any object with a `url` key — every other field is ignored). |

#### Pagination & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxReviewsPerProperty` | integer | `1000` | Cap on reviews collected per property. Set to `0` to pull every available review (popular hotels can carry several thousand). Pricing is per review row, so this is your main cost lever. |

#### Sorting & Filtering

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | string | `relevant` | How Booking.com orders reviews before collection. Options: **Most Relevant**, **Newest first**, **Oldest first**, **Highest score first**, **Lowest score first**. |
| `scoreFilter` | string | `all` | Limit to one Booking score bucket. Options: **All**, **Wonderful (9–10)**, **Good (7–9)**, **Okay (5–7)**, **Poor (3–5)**, **Very poor (1–3)**. |
| `languages` | array | `[]` (all) | Multi-select review languages. Choose any subset of: English, German, French, Spanish, Italian, Dutch, Portuguese, Polish, Russian, Japanese, Korean, Chinese, Arabic, Turkish, Swedish, Norwegian, Danish, Finnish, Czech, Hungarian, Romanian, Greek, Hebrew, Thai, Vietnamese, Indonesian. |
| `customerType` | string | `all` | Filter by traveler segment. Options: **All travelers**, **Families**, **Couples**, **Solo travelers**, **Groups of friends**, **Business travelers**. |
| `timeOfYear` | string | `all` | Filter by stay season. Options: **Any time of year**, **March – May (spring)**, **June – August (summer)**, **September – November (fall)**, **December – February (winter)**. |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeReplies` | boolean | `true` | Attach the property's official reply text to each review when available. Adds `partnerReplyText` and `partnerReplyDate` at no extra cost. |

### Output

One row per review, flat schema for clean dataset table display.

#### Example

```json
{
    "hotelUrl": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html",
    "hotelId": 55361,
    "hotelName": "Hotel Le Meurice",
    "hotelCountryCode": "fr",
    "reviewId": "6340bcc03d6b080b",
    "reviewUrl": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html#tab-reviews?review=6340bcc03d6b080b",
    "reviewDate": "2026-04-18T15:17:40Z",
    "title": "Excellent value for your money",
    "positiveText": "Location is great, the staff were extremely helpful and the room was spotless.",
    "negativeText": "There aren't any negatives for me staying here.",
    "score": 10.0,
    "language": "en",
    "helpfulVotesCount": 4,
    "isApproved": true,
    "customerType": "solo",
    "anonymous": false,
    "guestName": "Carollyn",
    "guestCountryCode": "us",
    "guestCountryName": "United States",
    "avatarUrl": "https://q-xx.bstatic.com/xdata/avatars/...",
    "roomTypeId": "5536114",
    "roomTypeName": "Standard Double Room",
    "numNights": 2,
    "stayStatus": "stayed",
    "checkInDate": "2026-04-12",
    "checkOutDate": "2026-04-14",
    "partnerReplyText": "Thank you for your wonderful review, Carollyn — we look forward to welcoming you back to Le Meurice.",
    "partnerReplyDate": null,
    "photos": [
        {
            "id": "12345678",
            "urls": {
                "thumbnail": "https://q-xx.bstatic.com/xdata/images/xphoto/square80/12345678.jpg",
                "large": "https://q-xx.bstatic.com/xdata/images/xphoto/max1280x900/12345678.jpg"
            },
            "kind": "guest"
        }
    ],
    "scrapedAt": "2026-05-01T19:16:14Z"
}
```

#### Hotel Context Fields

| Field | Type | Description |
|-------|------|-------------|
| `hotelUrl` | string | Canonical property URL the review belongs to. |
| `hotelId` | integer | Booking.com internal property ID. |
| `hotelName` | string | Hotel display name. |
| `hotelCountryCode` | string | ISO-2 country code (e.g. `fr`, `gb`, `it`). |

#### Core Review Fields

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | string | Booking-side review identifier. Stable across runs. |
| `reviewUrl` | string | Deep-link to the review anchored on the property page. |
| `reviewDate` | string (ISO 8601) | When the review was submitted to Booking. |
| `title` | string | Review headline written by the guest. |
| `positiveText` | string | "Liked" body. |
| `negativeText` | string | "Disliked" body. |
| `score` | number (0–10) | Reviewer's overall score for the stay. |
| `language` | string | ISO-2 language code of the review text (`en`, `de`, `fr`, ...). `xu` indicates a short / unclassified review (Booking's own taxonomy). |
| `helpfulVotesCount` | integer | Number of "Helpful" upvotes. |
| `isApproved` | boolean | Booking-side moderation flag. |

#### Guest Fields

| Field | Type | Description |
|-------|------|-------------|
| `customerType` | string | `families`, `couples`, `solo`, `groups`, or `business`. |
| `anonymous` | boolean | Whether the guest chose to remain anonymous. |
| `guestName` | string | Display name (or `Anonymous` when `anonymous=true`). |
| `guestCountryCode` | string | Reviewer's home-country ISO-2 code. |
| `guestCountryName` | string | Reviewer's home-country display name. |
| `avatarUrl` | string | null | Reviewer avatar URL when public. |

#### Stay Fields

| Field | Type | Description |
|-------|------|-------------|
| `roomTypeId` | string | Booking room-type ID for the booked stay. |
| `roomTypeName` | string | Human-readable room type (e.g. "Deluxe Double Room"). |
| `numNights` | integer | Length of stay in nights. |
| `stayStatus` | string | `stayed`, `cancelled`, etc. (Booking taxonomy). |
| `checkInDate` | string (YYYY-MM-DD) | Date the guest checked in. |
| `checkOutDate` | string (YYYY-MM-DD) | Date the guest checked out. |

#### Hotel Reply, Photos & Metadata

| Field | Type | Description |
|-------|------|-------------|
| `partnerReplyText` | string | null | Hotel's official response to the review when present. `null` if no reply or `includeReplies=false`. |
| `partnerReplyDate` | string | null | Reply timestamp when surfaced by Booking. |
| `photos` | array of `{ id, urls: { thumbnail, large }, kind }` | Guest-uploaded photos. Empty array when none. |
| `scrapedAt` | string (ISO 8601) | UTC timestamp of extraction. |

### Tips for Best Results

- **Pipe the [Booking.com Hotel Scraper](https://apify.com/SolidCode/booking-scraper) output here directly.** Run a destination + filter search in the Hotel Scraper, then drop the output dataset URL straight into `startUrls` in this actor — every row's `url` is read automatically; everything else is ignored. No glue script needed for end-to-end "destination → reviews" pipelines.
- **Use `sortBy=newest` for monitoring fresh reviews** and `sortBy=score_asc` to triage worst-rated reviews first when running a reputation-management dashboard.
- **For multi-language sentiment work, run separate jobs per language and join on `reviewId`.** This keeps each dataset narrowly scoped and avoids paying for languages you won't analyze.
- **Cap `maxReviewsPerProperty` at 1,000 unless you genuinely need every review.** Mega-properties on Booking can carry 10,000+ reviews — at $1.30 per 1,000 that's $13 per property if uncapped. The default 1,000 keeps spend predictable.
- **Combine `scoreFilter=very_poor` with `customerType=business`** to surface the highest-impact complaints from corporate guests — these reviews often drive the biggest churn risk for hotel sales teams.
- **The `language=xu` value is real, not a bug.** Booking marks short reviews and reviews with no detectable language as `xu`. Keep them or filter them downstream — the actor returns the value verbatim.
- **`partnerReplyDate` is permanently `null`.** Booking does not surface the reply timestamp through its review feed; only the reply text is exposed. The field is kept on every row for schema stability.

### Pricing

**$1.30 per 1,000 reviews** — flat per-result price.

No compute charges — you only pay per review returned.

| Reviews | Cost |
|---------|------|
| 100 | $0.13 |
| 1,000 | $1.30 |
| 10,000 | $13.00 |
| 100,000 | $130.00 |

One dataset row = one review = one charge. Use `maxReviewsPerProperty` and the `scoreFilter` / `languages` / `customerType` / `timeOfYear` filters to control row volume before the run starts.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications when new reviews land
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access from any language

### Legal & Ethical Use

This actor is designed for legitimate market research, hospitality intelligence, reputation management, investment analysis, and travel content creation. It collects only publicly visible review content from Booking.com property pages. Users are responsible for complying with applicable laws — including data-protection regimes that govern personal information in guest names and avatars — and with Booking.com's Terms of Service. Do not use the data to harass individuals, build replica review platforms, generate spam, or for any unlawful purpose.

# Actor input Schema

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

Booking.com hotel page URLs to scrape reviews from. Paste raw URLs (e.g. 'https://www.booking.com/hotel/fr/le-meurice.en-gb.html') OR feed in the output dataset of our Booking.com Scraper directly — rows that contain a 'url' field will be picked up automatically. One review per dataset row.

## `maxReviewsPerProperty` (type: `integer`):

Cap on reviews collected per property. Set to 0 for all available reviews — popular hotels can have several thousand. Pricing is per review row, so this is your main cost control.

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

How Booking.com should order reviews before we collect them. Affects which reviews you get first when 'Max Reviews Per Property' is set.

## `scoreFilter` (type: `string`):

Only collect reviews in this Booking.com score bucket. Booking exposes five buckets — leave on 'All' to collect every review.

## `languages` (type: `array`):

Only collect reviews written in these languages. Multi-select. Empty = all languages.

## `customerType` (type: `string`):

Only collect reviews from this traveler segment. 'All' returns every traveler type.

## `timeOfYear` (type: `string`):

Only collect reviews where the stay falls in this season. Useful when comparing summer vs. winter experiences.

## `includeReplies` (type: `boolean`):

Include the property's official reply to each review when available. Adds 'partnerReplyText' and 'partnerReplyDate' to each row at no extra cost.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html"
    }
  ],
  "maxReviewsPerProperty": 1000,
  "sortBy": "relevant",
  "scoreFilter": "all",
  "languages": [],
  "customerType": "all",
  "timeOfYear": "all",
  "includeReplies": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Quick-scan table of reviews with hotel, score, date, and headline.

## `details` (type: `string`):

Full per-review rows including positive/negative text, traveler info, room, stay dates, photos, and partner reply.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html"
        }
    ],
    "maxReviewsPerProperty": 1000,
    "sortBy": "relevant",
    "scoreFilter": "all",
    "languages": [],
    "customerType": "all",
    "timeOfYear": "all",
    "includeReplies": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/booking-reviews-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 = {
    "startUrls": [{ "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html" }],
    "maxReviewsPerProperty": 1000,
    "sortBy": "relevant",
    "scoreFilter": "all",
    "languages": [],
    "customerType": "all",
    "timeOfYear": "all",
    "includeReplies": True,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/booking-reviews-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 '{
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/fr/le-meurice.en-gb.html"
    }
  ],
  "maxReviewsPerProperty": 1000,
  "sortBy": "relevant",
  "scoreFilter": "all",
  "languages": [],
  "customerType": "all",
  "timeOfYear": "all",
  "includeReplies": true
}' |
apify call solidcode/booking-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Reviews Scraper",
        "description": "[💰 $1.3 / 1K] Extract guest reviews from any Booking.com property — full text, scores, languages, room types, stay dates, and partner replies. Pipe in URLs or pass the output of our Booking.com Scraper directly.",
        "version": "1.1",
        "x-build-id": "IJivCccpmiaAZzI0R"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~booking-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-booking-reviews-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/solidcode~booking-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-booking-reviews-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/solidcode~booking-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-booking-reviews-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": {
                    "startUrls": {
                        "title": "Booking.com Property URLs",
                        "type": "array",
                        "description": "Booking.com hotel page URLs to scrape reviews from. Paste raw URLs (e.g. 'https://www.booking.com/hotel/fr/le-meurice.en-gb.html') OR feed in the output dataset of our Booking.com Scraper directly — rows that contain a 'url' field will be picked up automatically. One review per dataset row.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxReviewsPerProperty": {
                        "title": "Max Reviews Per Property",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on reviews collected per property. Set to 0 for all available reviews — popular hotels can have several thousand. Pricing is per review row, so this is your main cost control.",
                        "default": 1000
                    },
                    "sortBy": {
                        "title": "Sort Order",
                        "enum": [
                            "relevant",
                            "newest",
                            "oldest",
                            "score_desc",
                            "score_asc"
                        ],
                        "type": "string",
                        "description": "How Booking.com should order reviews before we collect them. Affects which reviews you get first when 'Max Reviews Per Property' is set.",
                        "default": "relevant"
                    },
                    "scoreFilter": {
                        "title": "Review Score",
                        "enum": [
                            "all",
                            "wonderful",
                            "good",
                            "okay",
                            "poor",
                            "very_poor"
                        ],
                        "type": "string",
                        "description": "Only collect reviews in this Booking.com score bucket. Booking exposes five buckets — leave on 'All' to collect every review.",
                        "default": "all"
                    },
                    "languages": {
                        "title": "Review Languages",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only collect reviews written in these languages. Multi-select. Empty = all languages.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "en",
                                "de",
                                "fr",
                                "es",
                                "it",
                                "nl",
                                "pt",
                                "pl",
                                "ru",
                                "ja",
                                "ko",
                                "zh",
                                "ar",
                                "tr",
                                "sv",
                                "no",
                                "da",
                                "fi",
                                "cs",
                                "hu",
                                "ro",
                                "el",
                                "he",
                                "th",
                                "vi",
                                "id"
                            ],
                            "enumTitles": [
                                "English",
                                "German",
                                "French",
                                "Spanish",
                                "Italian",
                                "Dutch",
                                "Portuguese",
                                "Polish",
                                "Russian",
                                "Japanese",
                                "Korean",
                                "Chinese",
                                "Arabic",
                                "Turkish",
                                "Swedish",
                                "Norwegian",
                                "Danish",
                                "Finnish",
                                "Czech",
                                "Hungarian",
                                "Romanian",
                                "Greek",
                                "Hebrew",
                                "Thai",
                                "Vietnamese",
                                "Indonesian"
                            ]
                        },
                        "default": []
                    },
                    "customerType": {
                        "title": "Traveler Type",
                        "enum": [
                            "all",
                            "families",
                            "couples",
                            "solo",
                            "groups",
                            "business"
                        ],
                        "type": "string",
                        "description": "Only collect reviews from this traveler segment. 'All' returns every traveler type.",
                        "default": "all"
                    },
                    "timeOfYear": {
                        "title": "Stay Season",
                        "enum": [
                            "all",
                            "mar_may",
                            "jun_aug",
                            "sep_nov",
                            "dec_feb"
                        ],
                        "type": "string",
                        "description": "Only collect reviews where the stay falls in this season. Useful when comparing summer vs. winter experiences.",
                        "default": "all"
                    },
                    "includeReplies": {
                        "title": "Include Hotel Replies",
                        "type": "boolean",
                        "description": "Include the property's official reply to each review when available. Adds 'partnerReplyText' and 'partnerReplyDate' to each row at no extra cost.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
