# Booking Scraper (`omkar-cloud/booking-scraper`) Actor

Scrape hotels from Booking.com by destination, search URL, or hotel page URL — prices, ratings, location, rooms, amenities & photos. Optional full-detail mode adds live room offers, facilities, and surroundings. 45 languages, any currency. $2 per 1,000 hotels — half the usual price, no start fee.

- **URL**: https://apify.com/omkar-cloud/booking-scraper.md
- **Developed by:** [Chetan Jain](https://apify.com/omkar-cloud) (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 $2.00 / 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/actors/running/actors-in-store.md#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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Scraper — Extract Booking.com Hotel Prices, Ratings & Room Data

Scrape Booking.com hotels by destination — prices, guest ratings, stars, location, and availability. No coding required.

Type a destination (or paste any Booking.com URL), click Start, and get one clean JSON record per hotel: total price for your stay, review score and count, star rating, address with coordinates, distance from center, and the direct Booking.com link.

Need everything? Turn on **Scrape Full Hotel Details** and every hotel also comes with its room types and **live room offers** (price, cancellation terms, meal plan), all facilities, photos with captions, policies, rating subscores, featured guest reviews, Q\&A, and surroundings — restaurants, landmarks, transport, and airports with distances.

It scrapes **Booking.com search URLs** too — paste a search results URL straight from your browser and the destination, dates, party size, sort order, and filters (stars, score, price range) embedded in the URL are applied automatically. Hotel page URLs work as well and always return the fully-detailed record.

Covers every Booking.com market: **45 languages** and any display currency, up to **1,000 hotels per destination**, at **$2 per 1,000 hotels** — half the price of comparable scrapers, with **no start fee**.

**Rated Excellent — 4.6 based on 25 reviews** on [Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

### Output example: Booking.com hotel data in JSON

Each hotel becomes one dataset item. Here is a search result row:

```json
{
  "query": "New York",
  "checkin": "2026-09-24",
  "checkout": "2026-09-26",
  "id": 5218600,
  "name": "Hyatt Place New York City - Times Square",
  "link": "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html",
  "page_name": "hyatt-place-new-york-city-times-square",
  "accommodation_type": "hotel",
  "image": "https://cf.bstatic.com/xdata/images/hotel/square600/881864417.webp",
  "location": {
    "address": "350 West 39th St",
    "city": "New York (New York)",
    "country_code": "us",
    "latitude": 40.755967,
    "longitude": -73.993703,
    "distance_from_center": "1.7 km from downtown",
    "nearest_public_transport": "42nd Street-Port Authority Bus Terminal station is within 400 meters",
    "is_centrally_located": true
  },
  "rating": { "score": 7.8, "count": 17162, "word": "Good", "stars": 4 },
  "unit": { "name": null, "beds": 1, "bedrooms": 0 },
  "price": {
    "currency": "USD",
    "total": 872.1,
    "charges_info": "+US$136 taxes"
  },
  "is_preferred": true,
  "is_sponsored": false,
  "is_new": false,
  "is_sold_out": false,
  "is_sustainable": false
}
```

With **Scrape Full Hotel Details** on (and always for hotel page URLs), the same record grows into the full property profile:

```json
{
  "description": "Hyatt Place New York City/Times Square features air-conditioned rooms...",
  "policies": {
    "checkin": { "from": "3:00 PM", "until": null },
    "checkout": { "from": null, "until": "11:00 AM" },
    "pets": "YES",
    "accepted_payments": ["American Express", "Mastercard", "Visa"]
  },
  "rating": {
    "score": 7.8,
    "count": 17163,
    "stars": 4,
    "subscores": [
      { "name": "hotel_staff", "score": 8.5, "count": 16917 },
      { "name": "hotel_clean", "score": 8.1, "count": 16935 }
    ]
  },
  "facilities": [
    { "id": 7, "slug": "bar", "name": "Bar" },
    { "id": 6, "slug": "safe_deposit_box", "name": "Safety deposit box" }
  ],
  "photos": [
    { "id": 881864417, "link": "https://cf.bstatic.com/xdata/images/hotel/max1024x768/881864417.jpg", "caption": "the entrance to Hyatt Place New York City - Times Square" }
  ],
  "rooms": [
    {
      "name": "Standard King Room",
      "size_m2": 19.51,
      "max_occupancy": 2,
      "beds": [{ "type": "extra_large_double_bed", "count": 1 }],
      "is_available": true,
      "offers": [
        {
          "price": 872.1,
          "currency": "USD",
          "cancellation_type": "free_cancellation",
          "mealplan": "breakfast",
          "max_persons": 2
        }
      ]
    }
  ],
  "featured_reviews": [
    {
      "score": 10,
      "title": "Good price for the rooms but parking expensive",
      "positive": "Great location. Rooms were cleaned and comfortable beds.",
      "negative": "Parking was expensive",
      "guest": { "name": "Karen", "country_code": "us" }
    }
  ],
  "surroundings": {
    "landmarks": [{ "name": "Bryant Park", "distance": "900 m" }],
    "public_transport": [{ "name": "Penn Station", "distance": "550 m", "walk_time": "8 min" }],
    "airports": [{ "name": "LaGuardia Airport", "distance": "9 km", "drive_time": "14 min" }]
  }
}
```

*Trimmed for readability.* You can download the dataset as JSON, CSV, Excel, XML, or an HTML table.

### What data does the Booking Scraper extract?

| Data group | Fields |
|------------|--------|
| Hotel | Name, direct Booking.com link, accommodation type, image, preferred/sponsored/new/sold-out/sustainable flags |
| Location | Address, city, coordinates, distance from center, nearest public transport |
| Ratings | Guest score, review count, rating word, star class |
| Price | Total price for the stay in your currency, taxes/charges info, per-night and pre-discount prices when shown |
| Stay context | Check-in/check-out dates, adults, children ages, rooms — every price is tied to a concrete stay |
| Full details (detailed mode) | Description, fine print, brands, policies (check-in/out times, pets, children, accepted payments), all facilities, meal plans, photos with captions, languages spoken |
| Rooms & live offers (detailed mode) | Room types with size, occupancy, beds, and photos — each with live offers: price, cancellation type, meal plan, Genius flag |
| Reputation (detailed mode) | Rating subscores (staff, cleanliness, comfort, …), featured guest reviews, questions & answers |
| Surroundings (detailed mode) | Landmarks, restaurants, public transport, airports, beaches — with distances and walk/drive times |

### How to scrape Booking.com hotel data

1. Click **Try for free**.
2. Type one or more **destinations** — cities, districts, regions, landmarks, or airports. Or paste **Booking.com URLs**: search results URLs are scraped as listings, hotel page URLs return one detailed record each.
3. Optionally set **check-in / check-out dates** and party size — every price then reflects that exact stay. Add filters: stars, minimum guest score, price range, sort order.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab to preview your data, then download it as **JSON, CSV, Excel, XML, or an HTML table**.

No proxies, no browser setup, no CAPTCHA solving — you type a destination and get structured data back.

### Input

```json
{
  "searchQueries": ["New York", "Bali"],
  "startUrls": [
    "https://www.booking.com/searchresults.html?ss=Paris&nflt=class%3D5",
    "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html"
  ],
  "maxResultsPerSearch": 100,
  "scrapeHotelDetails": false,
  "checkIn": "2026-09-24",
  "checkOut": "2026-09-26",
  "adults": 2,
  "rooms": 1,
  "sortBy": "popularity",
  "stars": ["4", "5"],
  "minReviewScore": "8",
  "locale": "en-us",
  "currency": "USD"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `searchQueries` | array | Destinations to search — city, district, region, country, landmark, or airport. Each returns up to 1,000 hotels. |
| `startUrls` | array | Booking.com URLs — search results URLs (their embedded destination, dates, filters, and sort override the fields below) and/or hotel page URLs (always scraped with full details). |
| `maxResultsPerSearch` | integer | Max hotels per destination or search URL (default 100, up to 1,000). Controls your cost. |
| `scrapeHotelDetails` | boolean | Off by default. When enabled, every search result also gets the full property profile — rooms with live offers, facilities, photos, policies, reviews, surroundings. |
| `checkIn` / `checkOut` | string | Stay dates in `YYYY-MM-DD`. Empty = tomorrow, 1 night. |
| `adults`, `childrenAges`, `rooms` | — | Party: adults (default 2), comma-separated children ages like `5,12`, rooms (default 1). |
| `sortBy` | string | `popularity` (default), `price`, `price_high_to_low`, `review_score`, `review_score_and_price`, `class`, `class_asc`, `class_and_price`, `distance`, `homes_first`. |
| `priceMin` / `priceMax` | integer | Total stay price range in your currency. |
| `stars` | array | Star classes to include, e.g. `["4", "5"]`. |
| `minReviewScore` | string | `6` Pleasant, `7` Good, `8` Very good, `9` Superb. |
| `locale` | string | One of 45 Booking.com languages (default `en-us`). |
| `currency` | string | Display currency code — USD, EUR, GBP, INR, … |

### How much does it cost to scrape Booking.com?

Scraping Booking.com costs **$2 per 1,000 hotels** ($0.002 per hotel) — about half of what comparable scrapers charge, with **no Actor start fee**.

With **Scrape Full Hotel Details** on (and for hotel page URLs), each hotel — live room offers, facilities, photos, reviews, surroundings — is billed at **$5 per 1,000 detailed hotels** in total. Every row is billed at exactly one rate — standard or detailed — and the detailed rate applies only when the full details are actually returned.

Apify gives you **$5 in free credits** every month, so you can scrape your first **2,500 hotels** (or 1,000 fully-detailed hotels) free and test the Booking Scraper before paying anything.

### FAQs

#### Why scrape Booking.com?

- **Price monitoring & revenue management** — track competitor prices for exact stays, by room type in detailed mode, in any of 45 markets and currencies.
- **Travel products** — feed hotel search, comparison, or recommendation apps with structured hotel data including live prices, photos, and facilities.
- **Market research** — map supply, star distribution, ratings, and price levels across destinations (up to 1,000 hotels per search).
- **Data science** — clean JSON with coordinates, scores, and prices tied to concrete stay dates, ready for analysis.

#### Can I scrape hotels from a Booking.com search URL?

Yes. Paste any `booking.com/searchresults.html` URL from your browser and the Actor reads everything embedded in it — destination, dates, party size, sort order, star/score/price filters, currency, and language — and applies it automatically. URL parameters take priority over the form fields, so the results match what you saw in your browser.

#### What does "Scrape Full Hotel Details" add?

Room types with **live offers** (price, cancellation terms, meal plan, Genius rate flag), all facilities, photo gallery with captions, check-in/check-out policies, accepted payment methods, rating subscores (staff, cleanliness, location, …), featured guest reviews, questions & answers, and surroundings (landmarks, restaurants, transport, airports with distances). Hotel page URLs pasted into `startUrls` always include these details.

#### How do I get live room prices for specific dates?

Set both **check-in** and **check-out**. Every search price then reflects that exact stay, and in detailed mode each room offer carries the live price for those dates. Without dates, Booking's default stay (tomorrow, 1 night) is used.

#### Can I scrape multiple destinations in one run?

Yes — add as many destinations and URLs as you like. Every row carries a `query` field (or `input_url` for hotel pages) so you can tell them apart in one dataset.

#### Will I be charged twice if the same hotel appears in two searches?

No. Hotels are deduplicated per run — a hotel ranking under several destinations or pasted twice is scraped and billed only once. Every row is billed at exactly one rate: $2/1,000 standard or $5/1,000 detailed. And if a full-details fetch fails, you keep the search result row and pay only the standard rate for it.

#### How accurate is the scraped Booking.com data?

It comes straight from live Booking.com pages — real prices for your stay, real review scores, real availability, in the same structure you see on the site.

#### Is it legal to scrape Booking.com?

The Actor extracts publicly available data only — hotel listings, prices, and ratings visible to any visitor. It collects no personal data behind logins. You are responsible for how you use the data; consult a lawyer if unsure about your use case.

#### Need guest reviews too?

Use our **[Booking Reviews Scraper](https://apify.com/omkar-cloud/booking-reviews-scraper)** — feed it the `link` values from this Actor's output and get full guest reviews with scores, review text, traveler type, and country, at $1 per 1,000 reviews.

### Support

Built by developers, for developers — when you reach out, you talk to the engineers who built the Actor, not a support script. Message us anytime and we'll resolve your query within 1 working day.

[![Contact Us on WhatsApp about Booking Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20have%20a%20question%20about%20the%20Booking%20Scraper.)

Email: [happy.to.help@omkar.cloud](mailto:happy.to.help@omkar.cloud?subject=Booking%20Scraper%20Question)

[![Email Us about Booking Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Booking%20Scraper%20Question)

### Love It? Star It! ⭐

From one business owner to another: if this Actor saved you hours of copying hotel prices off Booking.com, please [rate the Booking Scraper on Apify](https://apify.com/omkar-cloud/booking-scraper/reviews).

Here's why it matters: most people judge an Actor by its reviews before trying it. Your rating helps the next person — someone deciding whether this Actor really delivers clean Booking.com data — hit "Try for free" with confidence, and it helps the Actor rank higher in the Apify Store.

It takes only 1 second, and means the world to me.

# Actor input Schema

## `searchQueries` (type: `array`):

Destinations to search — city, district, region, country, landmark, or airport. Each destination is searched separately and returns up to 1,000 hotels. Rows carry a `query` field so you can tell destinations apart.

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

Search results URLs and/or hotel page URLs — you can mix both. Hotel pages are always scraped with full details (billed at the detailed-hotel rate).

## `maxResultsPerSearch` (type: `integer`):

Maximum number of hotels to scrape per destination or search URL (up to 1,000 — Booking.com's own ceiling). Each page returns up to 25 hotels. Use this to control your cost (1,000 hotels ≈ $2). Ignored for hotel page URLs.

## `scrapeHotelDetails` (type: `boolean`):

When enabled, every search result is also scraped in full — room types with live prices and cancellation terms, all facilities, photos, meal plans, policies, featured reviews, Q\&A, and surroundings. Still one dataset row per hotel, billed once at the detailed-hotel rate instead of the standard rate (1,000 detailed hotels ≈ $5 vs $2 standard). Runs take longer because each hotel page is fetched individually.

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

Check-in date in `YYYY-MM-DD` format (today or later). Leave empty for tomorrow.

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

Check-out date in `YYYY-MM-DD` format (after check-in). Leave empty for check-in + 1 night.

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

Number of adults (1–30).

## `childrenAges` (type: `string`):

Comma-separated ages (0–17) of children in the party, e.g. `5,12`. Leave empty for no children.

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

Number of rooms (1–30).

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

Result order. Defaults to Booking's "Top picks".

## `priceMin` (type: `integer`):

Minimum total price for the stay, in the selected currency.

## `priceMax` (type: `integer`):

Maximum total price for the stay, in the selected currency.

## `stars` (type: `array`):

Only include properties with these star ratings.

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

Only include properties with at least this guest review score.

## `locale` (type: `string`):

Booking.com language — hotel names, descriptions, and labels are returned in this language.

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

3-letter display currency code (USD, EUR, GBP, INR, …). All prices are returned in this currency.

## Actor input object example

```json
{
  "searchQueries": [
    "New York",
    "Bali"
  ],
  "startUrls": [
    "https://www.booking.com/searchresults.html?ss=Paris",
    "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html"
  ],
  "maxResultsPerSearch": 100,
  "scrapeHotelDetails": false,
  "adults": 2,
  "rooms": 1,
  "sortBy": "popularity",
  "locale": "en-us",
  "currency": "USD"
}
```

# Actor output Schema

## `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 = {
    "searchQueries": [
        "New York",
        "Bali"
    ],
    "maxResultsPerSearch": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("omkar-cloud/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 = {
    "searchQueries": [
        "New York",
        "Bali",
    ],
    "maxResultsPerSearch": 100,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "New York",
    "Bali"
  ],
  "maxResultsPerSearch": 100
}' |
apify call omkar-cloud/booking-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,omkar-cloud/booking-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6BjQFvyh3pWxanhv7/builds/POn02mLblIdyo6haa/openapi.json
