Airbnb Pro Host · Business Emails by City avatar

Airbnb Pro Host · Business Emails by City

Pricing

from $5.99 / 1,000 contact person data scrapes

Go to Apify Store
Airbnb Pro Host · Business Emails by City

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

Corentin Robert

Maintained by Community

Actor stats

17

Bookmarked

461

Total users

58

Monthly active users

a day ago

Last modified

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?

ModeHow it worksBest for
City searchScrapes 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 URLsPaste 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 goalSuggested setup
B2B / outbound salesCold-email property managers and conciergerie companiesCity search · deduplicateHosts: true · EU cities
CRM / RevOpsImport company email, phone, and host portfolio sizeCity search or bulk URLs · Outreach — Email & Phone dataset view
Vacation-rental SaaS vendorProspect PM software buyers (agencies with many listings)City search · multiDateSearch: true · export listingCount
Market research / consultingMap agencies, ratings, and nightly prices in a marketCity search · Market Research dataset view
Local services agencyPartner with Airbnb managers in one territorySingle city · onlyProHosts: true (default)
Data / ops teamScheduled master table of pro hosts by regionMulti-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 caseModeConfig
Build a city-level lead listCity searchdefault
Maximum listings per cityCity searchmultiDateSearch: true
Enrich a prospect listListing URLs2+ URLs
Check one listing fastListing URLs1 URL
Outreach (unique contacts)City searchdeduplicateHosts: true
Multi-city lead genCity searchMultiple cities in city array

Quick Start

A — City search (most users)

Three minutes to your first results:

  1. Open the Input tab
  2. Leave mode as City search
  3. 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.
  4. 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)

  1. Open the Input tab
  2. Set mode to Listing URLs
  3. Paste one Airbnb listing URL or hundreds
  4. 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?

CategoryFields
ContactEmail, phone number, company name, company address, RCS / business ID
Host infoHost 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
ListingTitle, URL, property type, room type, bedrooms, bathrooms, max guests
LocationCity, neighbourhood, full address, postal code, country, GPS coordinates
PerformanceRating, number of reviews, badges (Guest Favorite, Superhost), free cancellation
PricingPrice per night, total price, original price, discount amount, discount %, taxes
AmenitiesWiFi, pool, parking, garden, terrace, air conditioning, kitchen, baby equipment, bike
ContentListing 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

{
"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

ParameterRequiredDescription
modecity / bulkUrls
cityCity mode["Lyon, France", "Paris, France"] — prefer City, Country. Well-known cities (Paris, Marbella, Lyon, Miami) infer the country; unknown names still need City, Country.
listingUrlsListing URLs modeString 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)

ParameterDefaultDescription
maxPages5 (0 = unlimited)Max search result pages per city (each page ≈ 18 listings). Five pages oversample so ~20 unique pro hosts remain after onlyProHosts + deduplicateHosts.
multiDateSearchtrue (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.
onlyProHoststruePro 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.
deduplicateHoststrueOne 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):

ScenarioApprox. timeApprox. 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 listtens 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:

ExampleBest for
Find property managers in Lyon with emailsB2B leads — France, EU contacts
Marbella pro host leads (max coverage)Vacation rental agencies — Spain
Enrich listing URLs with host contactsBulk URL enrichment / CRM
Paris conciergerie business emailsCold outreach — minimal CRM columns

All examples:

ExampleBest for
French Riviera agencies with contactsMulti-city premium market
Berlin property manager contactsB2B leads — Germany
Barcelona agencies (max coverage)High-volume urban search — Spain
Lisbon and Porto rental agenciesMulti-city Portugal
Athens pro hosts with contactsB2B leads — Greece
Costa del Sol agency contactsRegional Spain — Malaga area
French Alps ski rental managersSeasonal niche — Chamonix, Courchevel
Amsterdam rental company contactsB2B leads — Netherlands
Miami vacation rental managersUS market discovery
Analyze Barcelona competitorsMarket research — ratings and pricing
Paris hotel operators on AirbnbHospitality vertical
Export host emails for CRM outreachMulti-city EU export workflow

Then size the host

Copy hostProfileUrl from any export above, then run Airbnb Host Portfolio:

ExampleBest for
Bulk host portfolios from Pro Host exportPaste many hostProfileUrl rows
Map one Airbnb host portfolioQualify a single host
Host portfolio with business contactPortfolio + email/phone on the host row
Host reputation — full profile reviewsReview history on the host profile

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.


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:

  1. Compare with a manual Airbnb search — Same city, dates, and filters (pool, etc.). A large gap may mean strictLocationFilter, missing locationAliases, or pagination limits.
  2. Watch exclusion stats in logs — Many strictLocationFilter drops often mean new neighborhood strings need aliases.
  3. Vary parameters
TestChangeWhat to check
Broader geostrictLocationFilter: falseRaw listing count before filtering
No pool/jacuzzi filterrequirePoolOrJacuzzi: falseListings missed by amenity detection
Single vs multi-passmultiDateSearch: falseLoss tied to dates/guests
PaginationmaxPages: 2 vs unlimitedListings beyond early pages
  1. Micro-zones — From rows you keep, note recurring city / neighborhood values and add them to locationAliases for your search label.
  2. DeduplicationdeduplicateHosts: true keeps one row per host; use false for one row per listing.
  3. Regression tests — Add unit cases for real city/neighborhood strings from Airbnb so aliases are not removed by mistake. Run npm 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).

ParameterRoleExample
countryForce country in the URL when autocomplete is ambiguous"country": "Madagascar"
locationAliasesSynonyms accepted for geographic filtering (JSON string or object){"Nosy Be": ["Ampangorina", "Nosy Komba"]}
strictLocationFilterKeep only listings whose city/neighborhood/address matches the searchtrue (default) / false
multiDateSearch23 search variants — see Multi-pass searchtrue
checkin / checkoutCustom stay dates in the URL (multiDateSearch varies them automatically)"2026-03-15"
amenityIdsURL filter (7 = pool, 26 = hot tub)[7, 26]
requirePool / requireJacuzzi / requirePoolOrJacuzziPost-scrape shortcuts for pool / hot tubsee 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.

ActorUse when
This Actor — Pro HostBusiness emails and phones by city
Airbnb Host PortfolioMap a host’s listings from profile URLs
Airbnb Property DetailsAmenities, GPS, photos, completeness
Airbnb CalendarOccupancy and day-by-day availability
Airbnb Price MonitorNightly rates across a market
Airbnb ReviewsGuest comments by listing URL
Airbnb ExperiencesExperience hosts, emails when enriched

Recommended chain:

StepActorBest for
1 — Discover contactsThis ActorCity search → business email, phone, company, hostProfileUrl
2 — Size the hostAirbnb Host Portfolio ScraperPaste hostProfileUrl → listing count, ratings, every listing URL
3 — Listing intelligenceAirbnb Property Details ScraperAmenities, GPS, photos, pricing context — not B2B emails
4 — AvailabilityAirbnb Calendar Availability ScraperDay-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.json
apify 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 tests
npm run test:unit:search-utils
npm 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.