# Booking.com Phone Number Scraper (`maximedupre/booking-com-phone-number-scraper`) Actor

Extract publicly listed phone numbers from Booking.com hotel and property pages. Keep each number with its property URL, available property name and location context, and optional ID in your dataset. Properties without a public number are reported with an empty phoneNumbers array.

- **URL**: https://apify.com/maximedupre/booking-com-phone-number-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Travel, Lead generation, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 phone numbers

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📞 Find Booking.com property phone numbers

Hotel researchers, sales teams, and travel data teams can submit public Booking.com property pages, a city, or a public Booking.com search URL. Get structured rows with public phone numbers, property names, location details, and available business contact data so you can review hotel contacts or join them to your own records.

**Use it to:**

- Find a public contact number for one hotel page with **[Hotel Contact Number Scraper](https://apify.com/maximedupre/booking-com-phone-number-scraper/examples/hotel-contact-number-scraper)**.
- Build phone rows from several hotel pages with **[Hotel Phone Number Scraper](https://apify.com/maximedupre/booking-com-phone-number-scraper/examples/hotel-phone-number-scraper)**.
- Keep your own ID beside each property result with **[Booking Com Property Phone Number](https://apify.com/maximedupre/booking-com-phone-number-scraper/examples/booking-com-property-phone-number)**.
- Collect public numbers from hotel pages with **[Booking Com Hotel Phone Number Scraper](https://apify.com/maximedupre/booking-com-phone-number-scraper/examples/booking-com-hotel-phone-number-scraper)**.
- Run the general Booking.com phone workflow with **[Booking Com Phone Number Scraper](https://apify.com/maximedupre/booking-com-phone-number-scraper/examples/booking-com-phone-number-scraper)**.

#### 🧾 Booking.com property phone rows

Each saved row represents the first eligible match for one property. It keeps the property page URL and `phoneNumbers`, which can contain several distinct public numbers or be empty when no public number is shown. Optional fields can include the property name, location, emails, business name, website, registration number, business location, and your ID. If the same property appears again through another submitted value, later matches are ignored and the saved row keeps the first match.

#### ▶️ Find property contacts from pages or search

Choose one discovery method per run. Add public property pages, a city, or a public Booking.com search URL, then choose whether to include all public property hosts or focus on professional or business hosts. The Actor reads public pages without requiring a Booking.com account.

**Run steps**

1. Choose `propertyPages`, `city`, or `searchUrl` as `discoveryMethod`.
2. Add the matching pages, city, or public search URL.
3. Set `hostScope` to `all` or `professional`.
4. Start the run and open the default dataset from the output link.

#### ⚙️ Input

Choose one discovery method per run. Use property page URLs, a city, or a public Booking.com search URL. Fields for the other choices are ignored. Set the host scope for every choice.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | string | Required. Choose `propertyPages`, `city`, or `searchUrl` for this run. |
| `propertyPages` | array of objects | Add one or more public Booking.com hotel or property pages when `discoveryMethod` is `propertyPages`. |
| `propertyPages[].url` | string | Public Booking.com hotel or property listing URL. |
| `propertyPages[].id` | string | Optional ID returned as `id` so you can join that property row to your records. |
| `city` | string | City used to find Booking.com property pages when `discoveryMethod` is `city`. |
| `searchUrl` | string | Public Booking.com search URL used to find property pages when `discoveryMethod` is `searchUrl`. |
| `hostScope` | string | Choose `all` for all public property hosts or `professional` for professional or business hosts. |

**Successful hosted QA input**

This example uses the public input from a successful current-beta default-input run.

```json
{
  "discoveryMethod": "propertyPages",
  "propertyPages": [
    {
      "url": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html"
    }
  ],
  "hostScope": "all"
}
```

#### 🧾 Output

The output schema provides a link to the default dataset view. Open `results` to read one saved row for each eligible property.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | string | Link to the default dataset view for property phone and contact rows. |

**Property result row**

The dataset has one public row shape. `propertyUrl` and `phoneNumbers` are required. `phoneNumbers` can be empty when no public phone number is shown, while the other fields appear when the source or input provides them.

| Field | Type | What it does |
| --- | --- | --- |
| `propertyUrl` | string | Public Booking.com page checked for this property result. |
| `propertyName` | string | Hotel or property name shown on the public page. |
| `phoneNumbers` | array of objects | Distinct public phone numbers shown on the page, or an empty array when none is shown. |
| `phoneNumbers[].number` | string | Phone number in the form returned by the public page. |
| `phoneNumbers[].countryCode` | string | Phone country calling code when the page provides enough context. |
| `location` | object | Public property location details when available. |
| `location.address` | string | Property address shown on the public page. |
| `location.city` | string | City shown for the property. |
| `location.region` | string | State, province, or region shown for the property. |
| `location.country` | string | Country shown for the property. |
| `location.countryCode` | string | Country code shown or supported by the public page. |
| `emails` | array of strings | Public professional email addresses associated with the property. |
| `businessName` | string | Public business or company name associated with the property. |
| `website` | string | Public property or business website associated with the property. |
| `registrationNumber` | string | Public business registration number associated with the property. |
| `businessLocation` | object | Public business contact location details when available. |
| `businessLocation.address` | string | Public business contact address. |
| `businessLocation.city` | string | City in the public business contact location. |
| `businessLocation.region` | string | State, province, or region in the public business contact location. |
| `businessLocation.country` | string | Country in the public business contact location. |
| `businessLocation.countryCode` | string | Country code in the public business contact location. |
| `id` | string | Optional ID supplied in a `propertyPages` entry. |

**Genuine current-beta row**

This complete row comes from a successful current-beta run with an optional input ID.

```json
{
  "propertyUrl": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html",
  "phoneNumbers": [
    {
      "number": "795147966",
      "countryCode": "+48"
    },
    {
      "number": "+48728501133",
      "countryCode": "+48"
    }
  ],
  "propertyName": "Close",
  "location": {
    "address": "Waliców 11, Wola, 00-855 Warsaw, Poland",
    "city": "Waliców 11",
    "region": "Masovia",
    "country": "Poland",
    "countryCode": "PL"
  },
  "emails": [
    "info@golden.apartments"
  ],
  "businessName": "Golden Apartments & Glamping",
  "website": "https://golden.apartments",
  "registrationNumber": "9662158354",
  "businessLocation": {
    "address": "Grzybowska 43A/84",
    "city": "Warszawa",
    "region": "Mazowieckie",
    "country": "Poland",
    "countryCode": "PL"
  },
  "id": "qa-id-1"
}
```

**No public phone outcome**

When a page exposes no public phone number, the row keeps its property URL and an empty `phoneNumbers` array. Other public contact fields can still appear. This complete row comes from a successful current-beta run.

```json
{
  "propertyUrl": "https://www.booking.com/hotel/gb/rosie-apartment.en-gb.html",
  "phoneNumbers": [],
  "propertyName": "Rosie Cottage",
  "emails": [
    "cottages.booking.com@cottages.com"
  ],
  "businessName": "Awaze Vacation Rentals Ltd.",
  "registrationNumber": "965389"
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. One event is charged for each public phone number extracted and saved to the dataset. The current event price is $0.002 per phone number.

#### 🔌 Integrations

Open the default dataset from the output link, export it through Apify, or read it through the Apify API. Use the property URL and optional ID when you pass rows into another workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I start with a city or a Booking.com search URL?

Yes. Set `discoveryMethod` to `city` and enter a city, or set it to `searchUrl` and enter a public search URL. Use `propertyPages` to submit pages directly. Use one method per run.

##### Can I focus on professional or business hosts?

Yes. Set `hostScope` to `professional`. The default `all` choice includes all public property hosts.

##### What happens when a property has no public phone number?

The Actor saves a row with the property URL and an empty `phoneNumbers` array. Other public fields can still appear. A public phone number is not guaranteed for every property.

##### Can one property row contain more than one phone number?

Yes. `phoneNumbers` can contain distinct phone numbers, with a country calling code when the page provides enough context.

##### What other contact details can a row include?

When the public source provides them, a row can include professional emails, a business name, a website, a registration number, and a business contact location.

##### Can I attach my own ID to a page?

Yes. Add `id` inside a `propertyPages` entry. The same value is returned as `id` so you can join the row to your own records.

##### What happens when the same property appears more than once?

The first eligible match is saved. Later matches for the same property are ignored, so the row keeps the first submitted value that found it.

##### Does it collect emails, rates, or reservations?

It can include public professional emails when available. Rates, availability, reservations, and booking actions are outside its scope.

##### Do I need a Booking.com account?

No. The Actor reads public Booking.com pages and does not support private or login-gated content.

##### Can I read the dataset with the Apify API?

Yes. Use the `results` output link or the default dataset API link after the run finishes.

##### Can I use the collected public data for any purpose?

Check current Booking.com terms, applicable laws, and your own data obligations before using the results. This Actor reads public pages and does not provide legal advice.

### 📝 Changelog

**v0.1** (01-10-2026)

- Find property phone numbers from a city or a public Booking.com search URL.
- Filter results to professional or business hosts.
- Include available public business contact details in property rows.

**v0.0** (25-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~booking-com-phone-number-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Google Maps Phone Number Scraper](https://apify.com/maximedupre/google-maps-phone-number-scraper): Find public business phone numbers from Google Maps search or listing URLs.
- [Google Maps Shared List Scraper](https://apify.com/maximedupre/google-maps-shared-list-scraper): Export public place lists with phone numbers and location context.
- [Website Email & Contact Scraper](https://apify.com/maximedupre/website-emails-scraper): Find public emails from property or business websites after you collect website links.
- [Phone Number Validation API](https://apify.com/maximedupre/phone-number-validation): Check and format phone numbers from your saved property rows.
- [Yellow Pages Scraper](https://apify.com/maximedupre/yellowpages-scraper): Find public US business listings with phone, address, and category data.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find Booking.com property pages. Use one choice per run.

## `propertyPages` (type: `array`):

Add one or more public Booking.com hotel or property page URLs. Use the optional ID to join each property's results to your own records.

## `city` (type: `string`):

Enter a city name. The Actor finds Booking.com property pages in that city.

## `searchUrl` (type: `string`):

Add a public Booking.com search URL. The Actor finds property pages from that search.

## `hostScope` (type: `string`):

Choose which public hosts to include. If omitted, the Actor includes all public property hosts.

## Actor input object example

```json
{
  "discoveryMethod": "propertyPages",
  "propertyPages": [
    {
      "url": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html"
    }
  ],
  "hostScope": "all"
}
```

# Actor output Schema

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

Open the property phone results in the default dataset.

# 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 = {
    "discoveryMethod": "propertyPages",
    "propertyPages": [
        {
            "url": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html"
        }
    ],
    "hostScope": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/booking-com-phone-number-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 = {
    "discoveryMethod": "propertyPages",
    "propertyPages": [{ "url": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html" }],
    "hostScope": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/booking-com-phone-number-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 '{
  "discoveryMethod": "propertyPages",
  "propertyPages": [
    {
      "url": "https://www.booking.com/hotel/pl/golden-apartments-warszawa-mennica-11-big-apartment.en-gb.html"
    }
  ],
  "hostScope": "all"
}' |
apify call maximedupre/booking-com-phone-number-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/booking-com-phone-number-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/cp5BAw5rlVgPHapRy/builds/kzAflOmGY2mCupknr/openapi.json
