# Airbnb Professional Host Scraper Ppe (`silentflow/airbnb-professional-host-scraper-ppe`) Actor

Extract professional Airbnb host business contacts with pay-per-result pricing. Get verified company emails, phone numbers, names, addresses, and registration details (RCS, SIRET). Search by city, listing URLs, or host profile across 55+ Airbnb markets. Pay only for professional hosts found.

- **URL**: https://apify.com/silentflow/airbnb-professional-host-scraper-ppe.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** Lead generation, Travel, Real estate
- **Stats:** 32 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 host results

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.

- **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

## Airbnb Pro Host Scraper - Pay Per Event

**Turn Airbnb into a B2B lead database. Pay only for the results you get.** Extract verified business emails, phone numbers, company names, and registration details from professional Airbnb hosts across 55+ markets.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/AP04AzbLPNZCNSFym/records/how-it-works-v2.png)

### ✨ Why use this scraper?

Spending hours scrolling Airbnb looking for property managers? Copy-pasting host details one by one? Getting incomplete data from other scrapers?

- 📧 **Verified business contacts in every result.** Company email, phone, address, and registration numbers (RCS, SIRET, SIREN) extracted directly from Airbnb listing pages.
- 🏢 **Professional hosts separated from individuals.** Each result includes a host type classification and contact quality score (email\_and\_phone, email\_only, phone\_only).
- 💰 **Pay per result, not per run.** You only pay for professional hosts found. No results? No charge. Deduplication avoids paying twice for the same host.
- 🌍 **55+ Airbnb markets worldwide.** Company detection adapts to local business formats: FR (SAS/SARL/SCI), ES (SL/SRL), EN (LLC/LTD), DE (GmbH/AG), IT (SRL/SPA), and more.
- ⚡ **Three flexible input modes.** Search by city, paste listing URLs, or scrape a host profile page. Combine multiple cities in one run.

### 🎯 Use cases

| Team | What they build |
|------|----------------|
| **Real estate agencies** | Prospect list of professional Airbnb hosts to pitch property management services |
| **B2B sales teams** | Qualified leads with verified emails for outreach campaigns targeting short-term rental operators |
| **Market researchers** | Map of professional vs. individual hosts by city, with company types and listing counts |
| **Proptech startups** | Database of property managers for partnership or acquisition opportunities |
| **Tourism boards** | Census of commercial hosts and their registration compliance in a given region |

### 📥 Input parameters

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | city | **City Search**, **Listing URL(s)**, or **Host Profile** |
| `city` | string\[] | - | Cities or regions to search (one per line) |
| `listingUrls` | array | - | Airbnb listing URLs to enrich |
| `hostProfileUrl` | string | - | Host profile URL to scrape |
| `locale` | string | fr | Market / language (55+ options). Determines the Airbnb domain and company detection rules |

#### Result Limit

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxPages` | integer | 3 | Pages per city (~18 listings/page). Controls cost: more pages = more results = higher charge |
| `deduplicateHosts` | boolean | true | Collapse multiple listings per host into one row. Saves cost by avoiding duplicate charges |

### 📊 Output data

```json
{
    "listingId": "1234567",
    "name": "Charming studio in Vieux Lyon",
    "url": "https://www.airbnb.fr/rooms/1234567",
    "companyName": "Lyon Apparts SAS",
    "companyEmail": "contact@lyon-apparts.fr",
    "companyPhone": "+33 4 78 12 34 56",
    "companyAddress": "12 Rue de la Republique, 69002 Lyon",
    "companyRCS": "RCS Lyon 831 626 353",
    "companySiret": "83162635300039",
    "companySiren": "831626353",
    "hostName": "Lyon Apparts",
    "hostType": "professional",
    "contactStatus": "email_and_phone",
    "isProHost": true,
    "isSuperhost": true,
    "yearsHosting": 5,
    "city": "Lyon",
    "neighborhood": "Vieux Lyon, Auvergne-Rhone-Alpes",
    "latitude": 45.7623,
    "longitude": 4.8271,
    "rating": 4.92,
    "numberOfReviews": 187,
    "roomType": "Entire home/apt",
    "pricePerNight": "85 EUR",
    "photos": ["https://a0.muscache.com/..."],
    "scrapedAt": "2026-04-01T12:00:00Z"
}
```

### 🗂️ Data fields

| Category | Fields |
|----------|--------|
| **Business contacts** | companyName, companyEmail, companyPhone, companyAddress |
| **Registration** | companyRCS, companySiret, companySiren, companyRegister, companyType |
| **Host info** | hostName, hostId, hostType, isProHost, isSuperhost, yearsHosting, hostProfileUrl |
| **Contact quality** | contactStatus (email\_and\_phone, email\_only, phone\_only, no\_contact), emailDomain, contactFirstName, contactLastName |
| **Location** | city, neighborhood, searchCity, latitude, longitude |
| **Performance** | rating, numberOfReviews, badges, hasGuestFavorite |
| **Listing** | listingId, name, url, description, roomType |
| **Pricing** | price, pricePerNight, priceFull, taxes, priceTotal, pricePerNightValue, numberOfNights |
| **Media** | photos, mainPhoto |
| **Dedup** | listingCount, listingUrls (when deduplication is enabled) |
| **Meta** | scrapedAt |

### 🚀 Examples

#### Find professional hosts in Lyon

```json
{
    "mode": "city",
    "city": ["Lyon"],
    "locale": "fr",
    "maxPages": 3
}
```

#### Scan multiple Spanish cities

```json
{
    "mode": "city",
    "city": ["Barcelona", "Madrid", "Valencia"],
    "locale": "es",
    "maxPages": 5,
    "deduplicateHosts": true
}
```

#### Enrich a list of Airbnb URLs

```json
{
    "mode": "bulkUrls",
    "listingUrls": [
        "https://www.airbnb.fr/rooms/12345678",
        "https://www.airbnb.es/rooms/87654321"
    ],
    "locale": "fr"
}
```

#### Get all listings from a specific host

```json
{
    "mode": "hostProfileUrl",
    "hostProfileUrl": "https://www.airbnb.fr/users/show/12345678",
    "locale": "fr"
}
```

### 💻 Integrations

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("silentflow/airbnb-professional-host-scraper-ppe").call(run_input={
    "mode": "city",
    "city": ["Lyon"],
    "locale": "fr",
    "maxPages": 3
})

for host in client.dataset(run["defaultDatasetId"]).iterate_items():
    if host.get("isProHost"):
        print(f"{host['companyName']}: {host.get('companyEmail', 'N/A')}")
```

#### JavaScript

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('silentflow/airbnb-professional-host-scraper-ppe').call({
    mode: 'city',
    city: ['Barcelona'],
    locale: 'es',
    maxPages: 5
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const proHosts = items.filter(i => i.isProHost);
console.log(`Found ${proHosts.length} professional hosts`);
```

### 📈 Performance & limits

| Metric | Value |
|--------|-------|
| Listings per page | ~18 |
| Enrichment speed | ~2-4 listings/second |
| Supported markets | 55+ |
| Data fields per result | 40+ |
| Company detection | 7 countries (FR, ES, EN, DE, IT, PT, NL) |

### 💡 Tips for best results

1. **Start with 2-3 pages per city.** Each page returns ~18 listings. Scale up once you confirm the data matches your needs.
2. **Enable deduplication to save costs.** One row per host means you pay once per host, not once per listing.
3. **Match the locale to your target market.** Use `fr` for France, `es` for Spain, `en` for UK/US. This controls which Airbnb domain is scraped and how companies are detected.
4. **Use bulkUrls mode for targeted enrichment.** If you already have a list of Airbnb URLs, paste them directly instead of running a full city search.
5. **Large cities can have 50+ pages.** Paris, London, Barcelona have thousands of listings. Limit with maxPages to keep costs predictable.

### ❓ FAQ

**Q: What if no professional hosts are found?**
A: You pay nothing. Only professional host results are charged.

**Q: What if the run fails?**
A: You pay nothing. Failed runs do not charge you.

**Q: How does pro host detection work?**
A: The scraper reads the host type classification and "Professional Host Details" section on each listing page. Only hosts with verified business registrations are flagged as professional.

**Q: Why are some pro hosts missing emails or phones?**
A: Not all professional hosts provide all contact fields to Airbnb. The scraper extracts everything available on the page.

**Q: What does contactStatus mean?**
A: It tells you what contact info was found: `email_and_phone` (both), `email_only`, `phone_only`, or `no_contact` (professional host but no direct contact available).

**Q: What happens with deduplication enabled?**
A: Multiple listings from the same host are merged into one row. The result keeps the best contact info found across all their listings, plus a listing count and URLs list. You pay once per unique host.

### 📬 Support

Need something this scraper does not do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations

Check out our other scrapers: [SilentFlow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `mode` (type: `string`):

**City search** - Discover all professional hosts in a city or region.

**Listing URLs** - Paste one or multiple listing URLs for enrichment.

**Host profile** - Extract all listings and contact details from a host profile page.

## `city` (type: `array`):

Add one city or region per line. The scraper searches each one and combines all results into a single dataset.

## `listingUrls` (type: `array`):

Paste one URL or hundreds. Works with airbnb.fr, airbnb.es, airbnb.com. Each item can be a plain URL or { "url": "https://..." }.

## `hostProfileUrl` (type: `string`):

URL of the host's profile page (e.g., https://www.airbnb.fr/users/show/12345678).

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

Selects the Airbnb domain and adapts parsing to the local language. Company detection is available for FR (SAS/SARL/SCI), ES (SL/SRL), EN (LLC/LTD), DE (GmbH/AG), IT (SRL/SPA), PT (Lda/LTDA), NL (BV/NV).

## `maxPages` (type: `integer`):

Each page returns ~18 listings. You pay per professional host found, so set this to control costs. Start with 2-3 pages.

## `deduplicateHosts` (type: `boolean`):

Collapse multiple listings from the same host into a single row. Best for outreach, avoids paying multiple times for the same host.

## Actor input object example

```json
{
  "mode": "city",
  "city": [
    "Lyon"
  ],
  "locale": "fr",
  "maxPages": 3,
  "deduplicateHosts": true
}
```

# Actor output Schema

## `hosts` (type: `string`):

Complete host data including: companyName, companyEmail, companyPhone, companyAddress, companyRCS, companyRegister, hostName, hostType, contactFirstName, contactLastName, contactStatus, emailDomain, listingId, name, url, description, city, neighborhood, latitude, longitude, roomType, bedrooms, beds, bathrooms, maxGuests, amenities, rating, numberOfReviews, badges, price, photos, isProHost, hasGuestFavorite, hasFlexibleCancellation.

# 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 = {
    "city": [
        "Lyon"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/airbnb-professional-host-scraper-ppe").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 = { "city": ["Lyon"] }

# Run the Actor and wait for it to finish
run = client.actor("silentflow/airbnb-professional-host-scraper-ppe").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 '{
  "city": [
    "Lyon"
  ]
}' |
apify call silentflow/airbnb-professional-host-scraper-ppe --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FrWpTeBvt2jFMh5xl/builds/8u9c3W9Odsp16kAHy/openapi.json
