Airbnb Pro Host Business Email Scraper
Pricing
from $6.99 / 1,000 results
Airbnb Pro Host Business Email Scraper
B2B Airbnb scraper: company legal data for professional hosts — company name, email, phone, registration where EU/EEA disclosure applies. Built for agencies, PMs, and outbound teams.
Pricing
from $6.99 / 1,000 results
Rating
4.6
(4)
Developer
Corentin Robert
Actor stats
3
Bookmarked
121
Total users
17
Monthly active users
2 days ago
Last modified
Categories
Share
Airbnb Professional Host Scraper
Find property managers and rental agencies on Airbnb — with emails, phone numbers, and company details.
Airbnb labels certain hosts as "Professional hosts" — these are companies, property management agencies, and concierge services. This scraper finds them by city, extracts their business contact information directly from their listing pages, and exports everything as a clean dataset ready for outreach.
Built for: B2B lead generation · Market research · CRM enrichment · Sales prospecting
Important: Contact extraction (email, phone, company) works only where legislation obliges professional hosts to display this information. This applies primarily to European Union countries (France, Spain, Germany, Italy, Portugal, Greece, etc.). It may not work in the USA, Mexico, or other regions outside Europe where such disclosure is not required.
What does it extract?
| Category | Fields |
|---|---|
| Contact | Email, phone number, company name, company address, RCS / business ID |
| Host info | Host name, co-host name 1–3 (from listing JSON when present; up to three columns), host type (Pro / Superhost / Private), contact status (Agency / Owner), host profile URL |
| Listing | Title, URL, property type, room type, bedrooms, bathrooms, max guests |
| Location | City, neighbourhood, full address, postal code, country, GPS coordinates |
| Performance | Rating, number of reviews, badges (Guest Favorite, Superhost), free cancellation |
| Pricing | Price per night, total price, original price, discount amount, discount %, taxes |
| Amenities | WiFi, pool, parking, garden, terrace, air conditioning, kitchen, baby equipment, bike |
| Content | Listing description, host description, short description, photo URLs, photo count |
Output: ~54 columns per listing (including Co-host name 1–3 and Photo count when applicable), exportable as CSV or JSON from Apify Console. Local CSV uses UTF-8 with BOM for Excel; listing IDs are exported as plain text. Use the Pro Hosts — Contacts view for a simplified export focused on outreach.
Quick Start
You have 3 minutes? Here's the fastest path to your first results:
- Open the Input tab
- Leave mode as City search
- Add one or more cities in City name(s) (format:
City, Country, e.g.Lyon, France,Athens, Greece) - Hit Run
In a few minutes you'll have a list of professional hosts with their emails and phone numbers. Results stream live in the run log.
Two Modes
City Search
Discover all professional hosts in one or more cities. This is the main mode for building lead lists from scratch.
- Scrapes Airbnb search results page by page
- Automatically identifies professional hosts by Airbnb's own labels
- Visits each listing page to extract company name, email, phone, and address
- Exports one row per listing with ~50 enriched fields
{"mode": "city","city": ["Lyon, France"],"maxPages": 5}
For multiple cities (always use City, Country):
{"mode": "city","city": ["Lyon, France", "Paris, France", "Bordeaux, France"]}
Listing URLs
Paste one URL or hundreds. Same field, same mode — the scraper auto-detects: 1 URL = single lookup, 2+ URLs = bulk enrichment.
{"mode": "bulkUrls","listingUrls": ["https://www.airbnb.fr/rooms/12345678"]}
Bulk:
{"mode": "bulkUrls","listingUrls": ["https://www.airbnb.fr/rooms/12345678","https://www.airbnb.fr/rooms/87654321"]}
Each item can also be in Request List format: { "url": "https://..." }.
Getting More Results — Multi-Pass Search
By default, a single Airbnb search returns up to ~270 listings per city. Enable Maximum coverage (multiDateSearch) to run the same city through 23 parallel search variants (no dates, flexible trips, night lengths, future dates, guest counts) and merge into one deduplicated list.
Why it finds more
Airbnb filters results based on your search criteria. A host who only accepts 4+ guests or 3+ nights won't appear in a default 1-guest, 1-night search. The multi-pass mode searches across:
- Stay durations 1 → 7 nights — catches listings with minimum stay requirements
- Future dates J+60, J+120, J+180 — catches listings currently fully booked (busy pros)
- Guest counts 2, 4, 6, 8, 10 people — catches large apartments, villas, group rentals
- Cross combinations (e.g. 6 guests + J+60) — the hardest-to-find listings
Result: typically 4–6× more listings per city compared to a standard single-pass search.
{"mode": "city","city": ["Athens, Greece"],"multiDateSearch": true}
Example log output:
📍 Athens — multi-pass search (durations + dates + guests)🗓️ 1 night · J+21: 270 found — 269 new (269 total)🗓️ 2 nights · J+21: 270 found — 183 new (452 total)...📅 5 nights · J+60: 270 found — 109 new (732 total)📅 5 nights · J+120: 270 found — 97 new (829 total)👥 4 guests · J+21: 270 found — 130 new (970 total)👥 6 guests · J+21: 270 found — 169 new (1139 total)...✅ Athens: 1400+ unique listings
⚠️ Takes ~5–10 minutes per city instead of ~30 seconds. Recommended for production runs.
EU cities on Apify (empty emails on the cloud but fine locally)
Airbnb serves company legal disclosure (email, phone, business name) based on site + IP/region. For EU/EEA countries, this Actor loads that block from airbnb.fr by default. For the same countries, search (autocomplete, result pages, listing cards) also uses airbnb.fr when the country would otherwise map to airbnb.com (e.g. Greece), so « Hôte professionnel » appears on cards and onlyProHosts works reliably from Apify / proxies. If airbnb.fr returns zero listings (common on Apify for some non‑France EU cities), the actor retries search on airbnb.com once per pagination chain while disclosure stays on airbnb.fr. Advanced: pass disclosureDomain (e.g. airbnb.es) in raw JSON / API only — not shown in the Actor input form.
Output Sample
Here's a sample row from a typical professional host:
{"hostName": "Martin Dupont","hostType": "Professional host","contactStatus": "Agency","companyName": "Lyon Prestige Conciergerie SAS","companyEmail": "contact@lyon-prestige.fr","companyPhone": "+33 6 12 34 56 78","companyAddress": "15 Rue de la République, 69001 Lyon","companyRCS": "RCS Lyon 812 345 678","url": "https://www.airbnb.fr/rooms/12345678","name": "Bright apartment with Saône view - Lyon centre","city": "Lyon","propertyType": "Apartment","roomType": "Entire home","bedrooms": 2,"bathrooms": 1,"maxGuests": 4,"rating": 4.97,"numberOfReviews": 143,"pricePerNight": 89,"totalPrice": 534,"hasWifi": true,"hasPool": false,"hasParking": true,"latitude": 45.7597,"longitude": 4.8422}
Input Parameters
Core settings
| Parameter | Required | Description |
|---|---|---|
mode | ✅ | city / bulkUrls |
city | City mode | ["Lyon, France", "Paris, France"] — format City, Country required |
listingUrls | Listing URLs mode | 1 URL → single · 2+ URLs → bulk |
Airbnb site (automatic)
The actor picks airbnb.com, airbnb.fr, airbnb.es, etc. from the country in each City, Country — nothing to configure. There is no airbnb.gr; Greece maps to airbnb.com internally, but search runs on airbnb.fr (EU) so pro badges on cards stay consistent from the cloud.
If you list several cities in different countries in one run, the actor falls back to airbnb.fr; use one country per run when possible.
Filters (City mode)
| Parameter | Default | Description |
|---|---|---|
maxPages | 0 (unlimited) | Max search result pages per city (each page = ~18 listings) |
multiDateSearch | false | 23 search variants per city (no dates, flexible dates, night lengths, J+60/120/180, guest counts) — typically 4–6× more listings |
onlyProHosts | true | Pro hosts only. Uncheck to include all host types (takes longer, more listings). Apify dataset: with default true, rows are pushed once at the end (after pro filter & deduplication). Set onlyProHosts: false for progressive pushes during extraction. |
deduplicateHosts | false | One row per unique host — adds Listing count. Progressive push while extracting applies when onlyProHosts: false (see above). |
The search URL and Airbnb’s own results define the geographic scope; listings are not discarded afterward based on the city line on each card.
Advanced parameters (City mode — optional)
For islands, micro-zones, or amenity-heavy searches, you can pass these via API input or raw JSON (not all may appear in the Apify UI — see your Actor’s input_schema).
| Parameter | Role | Example |
|---|---|---|
country | Force country in the URL when autocomplete is ambiguous | "country": "Madagascar" |
locationAliases | Synonyms accepted for geographic filtering (JSON string or object) | {"Nosy Be": ["Ampangorina", "Nosy Komba"]} |
strictLocationFilter | Keep only listings whose city/neighborhood/address matches the search | true (default) / false |
multiDateSearch | 23 search variants — see Multi-pass search | true |
checkin / checkout | Custom stay dates in the URL (multiDateSearch varies them automatically) | "2026-03-15" |
amenityIds | URL filter (7 = pool, 26 = hot tub) | [7, 26] |
requirePool / requireJacuzzi / requirePoolOrJacuzzi | Post-scrape shortcuts for pool / hot tub | see input_schema |
Reciprocal aliases: For nearby areas (e.g. Nosy Be ↔ Nosy Komba), include each name in the other’s list to widen coverage:
"locationAliases": "{\"Nosy Be\": [\"Nosy Komba\", \"...\"], \"Nosy Komba\": [\"Nosy Be\", \"...\"]}"
Possible future improvements (not implemented): Configurable extra dateOffsets; searchLocales to merge results across locales; countryAliases; searchVariants for spelling variants; optional room-type splits at search level; geographic radius if supported by the API.
Detecting missing listings
If counts are lower than expected:
- Compare with a manual Airbnb search — Same city, dates, and filters (pool, etc.). A large gap may mean
strictLocationFilter, missinglocationAliases, or pagination limits. - Watch exclusion stats in logs — Many
strictLocationFilterdrops often mean new neighborhood strings need aliases. - Vary parameters
| Test | Change | What to check |
|---|---|---|
| Broader geo | strictLocationFilter: false | Raw listing count before filtering |
| No pool/jacuzzi filter | requirePoolOrJacuzzi: false | Listings missed by amenity detection |
| Single vs multi-pass | multiDateSearch: false | Loss tied to dates/guests |
| Pagination | maxPages: 2 vs unlimited | Listings beyond early pages |
- Micro-zones — From rows you keep, note recurring
city/neighborhoodvalues and add them tolocationAliasesfor your search label. - Deduplication —
deduplicateHosts: truekeeps one row per host; usefalsefor one row per listing. - Regression tests — Add unit cases for real
city/neighborhoodstrings from Airbnb so aliases are not removed by mistake. Runnpm run test:unit:search-utils(URLs, aliases, amenities, dates,normalizeLocationAliases).
Tips & Best Practices
Start small. Set maxPages: 2 on your first run. Check the output, then scale up.
Use multi-pass for production. Enable multiDateSearch when building a full lead list. A city like Athens or Lyon can yield 1,000–1,500 professional host listings instead of ~270. Startup logs show Locale: … when search and disclosure share one domain, or Search: airbnb.fr (EU — pro badges on cards) when the search domain is forced to .fr for an EU country that would otherwise use .com.
Local runs. With root input.json and npm start, stale locale values from Apify’s local INPUT store are dropped when that key is omitted from your file (so country-based choice applies).
One row per host. Enable deduplicateHosts for outreach — avoids contacting the same company multiple times when they manage several listings. With onlyProHosts: false, you may see dataset items on Apify as hosts are extracted; with default onlyProHosts: true, the dataset is filled after deduplication (cleaner export, but stopping the run early may leave an empty or partial dataset).
Combine modes. Run City search to find listings, export the URLs, then use Listing URLs mode to re-enrich with fresh data later.
OOM on 10k+ listings? With onlyProHosts: false, pushes during extraction help bound memory; with default pro-only mode, the final batch push is lighter. If you still hit OOM, try Resurrect with 8 GB.
Development (unit tests)
Contributors: run the full suite with npm run test:unit (pro-host extraction, utils, niobe, searchUtils, locale, country ISO, host labels, amenity filters, coverage regression, Google helpers, etc.).
npm run test:unit # all unit testsnpm run test:unit:search-utilsnpm run test:unit:utils
Optional (local): npm run compare-coverage — compares output.csv to input.json and suggests missing aliases (scripts/compare-coverage.js).
Use Cases
| Use case | Mode | Config |
|---|---|---|
| Build a city-level lead list | City search | default |
| Maximum listings per city | City search | multiDateSearch: true |
| Enrich a prospect list | Listing URLs | 2+ URLs |
| Check one listing fast | Listing URLs | 1 URL |
| Outreach (unique contacts) | City search | deduplicateHosts: true |
| Multi-city lead gen | City search | Multiple cities in city array |
FAQ
Why are some emails/phones empty? Not all professional hosts display contact info on their listing pages. Some only provide a contact form. The scraper extracts everything that's publicly visible.
What does "Professional host" mean? Airbnb explicitly labels certain hosts as professional — typically property management companies, concierge services, and rental agencies. The scraper identifies these hosts and extracts their business details.
Does it work outside Europe? Contact extraction (email, phone, company) works best in European Union countries where regulation requires professional hosts to display business details. It may not work or return empty contact fields in the USA, Mexico, or elsewhere outside Europe, as such disclosure is not legally required there.
Will it bypass Airbnb's bot detection? The scraper uses standard HTTP requests (like a browser) plus a Puppeteer fallback when needed. It respects delays and rate limits. No guarantees — Airbnb's detection can change.
Can I run it on a schedule? Yes. Use Apify's built-in scheduler to run weekly or monthly and keep your lead list fresh.
How many listings can I get per city?
With multiDateSearch: true, typically 1,000–1,500 unique listings per city. Without it, up to ~270. Airbnb caps search results at ~270 per query regardless of the number of pages.
Greece / wrong country in the dataset?
Always use City, Country (e.g. Athens, Greece) so the URL suffix is --Greece while search still hits airbnb.fr for reliable EU cards. For several countries in one input, run separate actors (or accept the airbnb.fr fallback).
Having issues? Contact corentin@outreacher.fr
Last updated: 26 March 2026