Airbnb Pro Host · Business Emails by City
Pricing
from $5.99 / 1,000 contact person data scrapes
Airbnb Pro Host · Business Emails by City
Search any city worldwide for Airbnb professional hosts. Business emails, phones, and company names where disclosed (best in EU/EEA). Companion Actors: Airbnb Property Details and Airbnb Calendar. Free plan: 20 contacts. No login.
Pricing
from $5.99 / 1,000 contact person data scrapes
Rating
4.8
(5)
Developer
Corentin Robert
Maintained by CommunityActor stats
17
Bookmarked
461
Total users
58
Monthly active users
a day ago
Last modified
Categories
Share
Find property managers and rental agencies on Airbnb — with emails, phone numbers, and company details.
Airbnb labels certain hosts as "Professional hosts" — property management companies, concierge services, and rental agencies. Search by city or paste listing URLs, extract business contact information from listing pages, and export a clean dataset for outreach.
No login. No API key. No Airbnb account.
This is not a hunt for Gmail addresses buried in listing descriptions. Contacts come from Airbnb’s professional-host disclosure block (company email, phone, legal name) — richest in the EU/EEA. You search by city, not by scraping one listing at a time.
Free Apify plan: 20 contacts per run. Paid plans export up to your PPE budget.
City search works worldwide (EU, US, UK, Canada, Australia, and more). Emails and phones are richest in EU/EEA, where professional hosts must disclose business details. Outside Europe, company name and portfolio still export — contact fields are often empty because Airbnb does not require disclosure.
What does it do?
| Mode | How it works | Best for |
|---|---|---|
| City search | Scrapes Airbnb search results page by page, identifies professional hosts by Airbnb's own labels, then visits each listing page for company name, email, phone, and address. One row per listing with ~50 enriched fields (or one row per host if you deduplicate). | Lead lists from scratch |
| Listing URLs | Paste one URL or hundreds in the same field. 1 URL = single lookup, 2+ URLs = bulk enrichment. | CRM lists you already have |
Who is this for?
| You are… | Typical goal | Suggested setup |
|---|---|---|
| B2B / outbound sales | Cold-email property managers and conciergerie companies | City search · deduplicateHosts: true · EU cities |
| CRM / RevOps | Import company email, phone, and host portfolio size | City search or bulk URLs · Outreach — Email & Phone dataset view |
| Vacation-rental SaaS vendor | Prospect PM software buyers (agencies with many listings) | City search · multiDateSearch: true · export listingCount |
| Market research / consulting | Map agencies, ratings, and nightly prices in a market | City search · Market Research dataset view |
| Local services agency | Partner with Airbnb managers in one territory | Single city · onlyProHosts: true (default) |
| Data / ops team | Scheduled master table of pro hosts by region | Multi-city in one run · Apify scheduler |
What you get by default: company name, business email, phone, address, RCS where disclosed, host type, listing URL, ratings, and ~50 listing fields. On typical EU city runs, most pro hosts with a legal disclosure block return at least one contact field.
When to enable maximum coverage: turn on Maximum coverage (multiDateSearch) for production lead lists — typically 4–6× more listings per city (e.g. 1,000–1,500 vs ~270). Adds a few minutes per city.
Typical configs:
| 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 |
Quick Start
A — City search (most users)
Three minutes 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). Well-known names (Paris,Marbella,Lyon,Miami) also work without the country. - Click Start
In a few minutes you get professional hosts with emails and phone numbers where publicly disclosed. Progress appears in the run log.
B — Listing URLs (CRM / enrichment)
- Open the Input tab
- Set mode to Listing URLs
- Paste one Airbnb listing URL or hundreds
- Click Start
Paste one URL per line. Same field for a single lookup and bulk enrichment.
Next step: copy hostProfileUrl from a row into Airbnb Host Portfolio Scraper to map that host’s full listing portfolio before outreach.
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. Dataset views: Pro Hosts — Contacts (outreach), Outreach — Email & Phone (minimal CRM), Market Research — Ratings & Pricing, Full Export. Download in JSON, CSV, Excel, or HTML from the Dataset tab.
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
City search
{"mode": "city","city": ["Lyon, France"],"maxPages": 5}
For multiple cities (prefer City, Country; well-known names also work):
{"mode": "city","city": ["Lyon, France", "Paris, France", "Bordeaux, France"]}
Listing URLs
{"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"]}
Console: one URL per line. API { "url": "https://..." } objects are still normalized if they pass input validation.
All input parameters
Core settings
| Parameter | Required | Description |
|---|---|---|
mode | ✅ | city / bulkUrls |
city | City mode | ["Lyon, France", "Paris, France"] — prefer City, Country. Well-known cities (Paris, Marbella, Lyon, Miami) infer the country; unknown names still need City, Country. |
listingUrls | Listing URLs mode | String list — 1 URL per line. 1 URL → single · 2+ URLs → bulk. If Mode is still city, the run fails instead of ignoring the links. |
Filters (City mode)
| Parameter | Default | Description |
|---|---|---|
maxPages | 5 (0 = unlimited) | Max search result pages per city (each page ≈ 18 listings). Five pages oversample so ~20 unique pro hosts remain after onlyProHosts + deduplicateHosts. |
multiDateSearch | true (Console) | 23 search variants per city (no dates, flexible dates, night lengths, J+60/120/180, guest counts) — typically 4–6× more listings. ~5–10 minutes per city instead of ~30 seconds. Uncheck for a fast test run. |
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 | true | 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.
API-only / advanced city filters (country, locationAliases, amenity shortcuts, …) are listed under Advanced parameters.
How much does it cost to scrape Airbnb professional hosts?
Browser-based extraction uses more compute than HTTP-only scrapers. Approximate Apify consumption (varies by city size and Maximum coverage):
| Scenario | Approx. time | Approx. cost |
|---|---|---|
| 25 contacts (first test run) | ~30 s if Maximum coverage is off | < $0.05 |
| 1 city, standard search (~50–150 pro hosts with contacts) | ~30 s | ~$0.10–0.40 |
| 1 city, maximum coverage + full enrichment | ~5–10 min | ~$0.50–2.00 |
| 5 EU cities, deduplicated outreach list | tens of minutes | ~$2–8 |
Residential proxies are not required by default (datacenter proxy on Apify). Pricing follows Apify platform usage. Cost uses Apify consumption-based pricing (Compute Units) plus pay-per-event on exported contacts.
Free Apify plan: up to 20 contacts per run. Paid plans export up to your pay-per-event budget. Try the Actor first, then upgrade if you need a full city.
Ready-made examples
Pre-configured Actor tasks are one-click runs. 16 published examples sit under the Actor Examples tab, each with its own SEO landing page (Apify task publishing). Browse all examples →
Start here:
| Example | Best for |
|---|---|
| Find property managers in Lyon with emails | B2B leads — France, EU contacts |
| Marbella pro host leads (max coverage) | Vacation rental agencies — Spain |
| Enrich listing URLs with host contacts | Bulk URL enrichment / CRM |
| Paris conciergerie business emails | Cold outreach — minimal CRM columns |
All examples:
| Example | Best for |
|---|---|
| French Riviera agencies with contacts | Multi-city premium market |
| Berlin property manager contacts | B2B leads — Germany |
| Barcelona agencies (max coverage) | High-volume urban search — Spain |
| Lisbon and Porto rental agencies | Multi-city Portugal |
| Athens pro hosts with contacts | B2B leads — Greece |
| Costa del Sol agency contacts | Regional Spain — Malaga area |
| French Alps ski rental managers | Seasonal niche — Chamonix, Courchevel |
| Amsterdam rental company contacts | B2B leads — Netherlands |
| Miami vacation rental managers | US market discovery |
| Analyze Barcelona competitors | Market research — ratings and pricing |
| Paris hotel operators on Airbnb | Hospitality vertical |
| Export host emails for CRM outreach | Multi-city EU export workflow |
Then size the host
Copy hostProfileUrl from any export above, then run Airbnb Host Portfolio:
| Example | Best for |
|---|---|
| Bulk host portfolios from Pro Host export | Paste many hostProfileUrl rows |
| Map one Airbnb host portfolio | Qualify a single host |
| Host portfolio with business contact | Portfolio + email/phone on the host row |
| Host reputation — full profile reviews | Review history on the host profile |
Is it legal to scrape Airbnb host contact data?
This Actor only reads data that Airbnb displays on public listing pages (including business disclosure blocks where hosts are required to show company details). It does not access private host dashboards or guest-only areas.
Data may include personal and business contact information. Ensure your use complies with GDPR, CAN-SPAM, and local marketing rules. See Apify's guide to web scraping legality.
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.
Tips & best practices
Start small. Set maxPages: 2 on your first run, or uncheck Maximum coverage. 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.
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.
Size a host before outreach. Export hostProfileUrl from this dataset and paste bulk URLs into Airbnb Host Portfolio Scraper to map listing counts, ratings, and every listing URL in the portfolio before you prioritize contacts.
Timeout & 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 the run times out, increase Timeout under Input → Run options and use Runs → Actions → Resurrect — the Actor resumes from the Request Queue (no duplicate work). If you still hit OOM, try Resurrect with 8 GB.
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. On Apify, EU disclosure can also depend on site + IP — see EU disclosure on Apify.
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).
Results look incomplete? See Detecting missing listings.
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).
Advanced parameters (API / raw JSON)
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.
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.
EU disclosure on Apify
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.
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.
Airbnb suite
Pick the job, then chain. Do not run Property Details as a standalone discovery tool — start here.
| Actor | Use when |
|---|---|
| This Actor — Pro Host | Business emails and phones by city |
| Airbnb Host Portfolio | Map a host’s listings from profile URLs |
| Airbnb Property Details | Amenities, GPS, photos, completeness |
| Airbnb Calendar | Occupancy and day-by-day availability |
| Airbnb Price Monitor | Nightly rates across a market |
| Airbnb Reviews | Guest comments by listing URL |
| Airbnb Experiences | Experience hosts, emails when enriched |
Recommended chain:
| Step | Actor | Best for |
|---|---|---|
| 1 — Discover contacts | This Actor | City search → business email, phone, company, hostProfileUrl |
| 2 — Size the host | Airbnb Host Portfolio Scraper | Paste hostProfileUrl → listing count, ratings, every listing URL |
| 3 — Listing intelligence | Airbnb Property Details Scraper | Amenities, GPS, photos, pricing context — not B2B emails |
| 4 — Availability | Airbnb Calendar Availability Scraper | Day-by-day calendar from listing URLs |
Booking Pro Host Scraper — same B2B lead pattern on Booking.com.
Local development
$npm install
Edit input.json at the project root, then:
cp input.json storage/key_value_stores/default/INPUT.jsonapify run --purge-none
Example input.json for city search:
{"mode": "city","city": ["Lyon, France"],"maxPages": 2}
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).
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).
Task catalog for maintainers: ./published-tasks/.
Support
For questions, custom automation, or feedback: corentin@outreacher.fr or the Issues tab on the Actor page.
Ready? Pick City search, add Lyon, France (or your market), and click Start.