Airbnb Phone Number Scraper with Listing Category Leads avatar

Airbnb Phone Number Scraper with Listing Category Leads

Pricing

$19.99/month + usage

Go to Apify Store
Airbnb Phone Number Scraper with Listing Category Leads

Airbnb Phone Number Scraper with Listing Category Leads

Automate phone number extraction from Airbnb with Airbnb Phone Number Scraper. The actor scans listings and pulls available contact numbers into structured datasets for CRM enrichment.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

0

Monthly active users

4 days ago

Last modified

Share

Airbnb Scraper — Extract Listings, Host Leads and Phone Data as JSON

Airbnb Phone Number Scraper with Listing Category Leads discovers Airbnb listings, host profile leads and opportunistic phone contact data by expanding one or more property types (villa, cabin, apartment, loft, house, condo, cottage, studio) into site:airbnb.com Google searches. Every result returns typed, normalized JSON — no HTML, no selectors, no parsing — tagged with its property type, result category, Airbnb ID and SERP rank. After reading this page you'll know exactly what fields it returns, how to run it, and where phone data realistically shows up versus where it doesn't.

What is Airbnb Phone Number Scraper with Listing Category Leads?

Airbnb Phone Number Scraper with Listing Category Leads is an Apify Actor that discovers indexed Airbnb pages — listings, host profiles, and experiences — by running Google site:airbnb.com searches for the property types you choose, then classifies and de-duplicates every result. No Airbnb account or login is required; it reads Google's public search results, not Airbnb's private API.

  • Discover Airbnb listings (/rooms/ pages) tagged by property type
  • Discover host profile leads (/users/ pages)
  • Discover experience listings (/experiences/ pages)
  • Extract phone numbers opportunistically when a public page exposes one
  • Export results as JSON, CSV, or Excel with no proxy setup required

What data does Airbnb Phone Number Scraper with Listing Category Leads collect?

The Actor returns one dataset row per discovered Google result, covering four distinct data types in a single run.

Data TypeKey FieldsJSON Field Names
Airbnb listingsProperty type, Airbnb ID, listing URL, title, snippetpropertyType, airbnbId, listingUrl, title, snippet
Host profile leadsHost ID, profile URL, result typeairbnbId, listingUrl, resultType (profile)
Experience listingsExperience ID, URL, categoryairbnbId, listingUrl, resultType (experience)
Contact / phone leadsPhone number, dial code, country contextphone_number, dial_code, country

Need more Airbnb data?

If you need pricing and availability alongside discovery, Airbnb Scraper With Price & Availability (API-Empire) pairs listing search with a per-day availability calendar, occupancy rate, and nightly price stats. For a full-year cost quote on a specific listing — nightly rate, fees, and grand total by check-in date — Airbnb Full Year Price Tracker Scraper: Total Cost Breakdown (API-Empire) covers that angle instead.

Why not build this yourself?

Airbnb does not publish a public API that returns third-party host contact details, so any DIY approach has to scrape Google search results or Airbnb's pages directly — both of which shift and break without notice. Building this in-house means writing and maintaining a Google SERP parser that survives markup drift, provisioning and rotating proxies capable of reaching Google search pages without getting blocked, and re-testing extraction logic every time a class name or page layout changes. This Actor already does that: it ships with a resilient two-path result parser (a primary selector plus an anchor-scanning fallback) and enforces the GOOGLE_SERP proxy group needed to fetch Google reliably, so you get structured rows instead of a scraping project to babysit.

Why do developers and teams scrape Airbnb?

Airbnb concentrates host and listing data — by property type, by market, and occasionally by contact detail — that isn't available through any public API. Teams pull it for a handful of recurring, concrete reasons.

B2B outreach and lead generation

Sales and marketing teams selling to independent hosts — cleaning services, property insurance, smart-lock vendors, dynamic-pricing tools — need a seed list of real host and listing leads segmented by property type and market. Setting propertyTypes: ["villa", "cottage"] with a location builds exactly that list, with airbnbId and listingUrl ready to import into a CRM, and phone_number populated on the rare rows where Airbnb's public page exposes one.

Host partnership sourcing

Vacation-rental software companies and co-hosting platforms recruit hosts by property type and city rather than cold-searching Airbnb manually. Filtering resultTypeFilter: "profiles" isolates host pages directly, so a partnerships team can work through /users/ leads for villas or cabins in a target market without wading through listing pages that aren't hosts.

Property management sales

Companies selling property-management software prioritize outreach by inventory mix: a city with many indexed condos is a different sales motion than one dominated by cottages. Running every property type for a market and comparing resultCategory and propertyType counts gives a quick read on local inventory composition before a sales team commits research time to that market.

AI and RAG-ready market research

Because every response is typed JSON with stable field names, the output drops straight into a vector store or agent pipeline for market-research assistants — "which property types are indexed for Lisbon" becomes a structured query over propertyType and resultCategory counts instead of a scraping task the agent has to solve itself.

How to scrape Airbnb (step by step)

  1. Open Airbnb Phone Number Scraper with Listing Category Leads on its Apify Store listing under the API-Empire account.
  2. Provide at least one value in propertyTypes (e.g. ["villa", "cabin"]) — the Actor logs an error and returns no rows if this is left empty.
  3. Optionally set location to scope discovery to a city or region, and resultTypeFilter to keep only listings, profiles, or experiences.
  4. Start the run.
  5. Download results as JSON, CSV, or Excel from the run's Dataset tab, or pull them via the Apify API.

What to do when Airbnb changes its structure

The Actor targets Google's search-result markup rather than Airbnb's own site, and already ships a primary selector plus an anchor-scanning fallback so it survives common Google layout drift. It is maintained, and the output schema — field names and types — stays stable on your end even when the underlying page structure shifts.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
propertyTypesNoarrayOne or more property types to discover (villa, cabin, apartment, loft, house, condo, cottage, studio). Each is expanded into its own site:airbnb.com "<type>" query.["villa", "cabin"]
locationNostringOptional city / region / neighborhood added to every property-type query. Leave empty to discover a type worldwide."Lisbon"
maxPerTypeNointegerMaximum number of results to collect per property type (min 1, max 10000). Default 20.50
resultTypeFilterNostringKeep only any, listings (/rooms/), profiles (/users/), or experiences (/experiences/). Default any."listings"
marketCountryNostringOptional market country whose name + dial code is tagged onto every row (country / dial_code). Does not restrict which listings are found."Portugal (+351)"
sitePlatformNostringWhich site the property-type queries are scoped to. Currently Airbnb."Airbnb"
proxyConfigurationNoobjectProxy settings. The Actor enforces the GOOGLE_SERP proxy group required to fetch Google search pages.{"useApifyProxy": true}

Example JSON input

{
"propertyTypes": ["villa", "cabin"],
"location": "Lisbon",
"maxPerType": 50,
"resultTypeFilter": "any",
"marketCountry": "Portugal (+351)",
"sitePlatform": "Airbnb",
"proxyConfiguration": {
"useApifyProxy": true
}
}

The most common input mistake is leaving propertyTypes empty — since no field is technically marked required, it's easy to start a run with no property type selected, which produces zero rows instead of an error result.

⬆️ Output

Every response is typed, normalized JSON with a stable field set across all three entity types the Actor discovers. Results export as JSON, CSV, or Excel directly from the dataset.

Scraped Airbnb listings

{
"platform": "Airbnb.com",
"keyword": "villa",
"title": "Beachfront villa in Lisbon - Villas for Rent",
"description": "Entire villa hosted by Maria. 6 guests · 3 bedrooms · 4 beds · 2 baths",
"url": "https://www.airbnb.com/rooms/12345678",
"phone_number": null,
"country": "Portugal",
"dial_code": "+351",
"listingUrl": "https://www.airbnb.com/rooms/12345678",
"airbnbId": "12345678",
"resultType": "listing",
"serpRank": 3,
"snippet": "Entire villa hosted by Maria. 6 guests · 3 bedrooms · 4 beds · 2 baths",
"locationKeyword": "Lisbon",
"propertyType": "villa",
"resultCategory": "listing",
"scrapedAt": "2026-07-25T12:00:00+00:00"
}

Host profile leads

{
"platform": "Airbnb.com",
"keyword": "villa",
"title": "Maria - Superhost - Lisbon, Portugal",
"description": "Joined in 2016 · 214 reviews · Response rate 100%",
"url": "https://www.airbnb.com/users/show/98765432",
"phone_number": null,
"country": "Portugal",
"dial_code": "+351",
"listingUrl": "https://www.airbnb.com/users/show/98765432",
"airbnbId": "98765432",
"resultType": "profile",
"serpRank": 7,
"snippet": "Joined in 2016 · 214 reviews · Response rate 100%",
"locationKeyword": "Lisbon",
"propertyType": "villa",
"resultCategory": "other",
"scrapedAt": "2026-07-25T12:00:00+00:00"
}

Experience listings

{
"platform": "Airbnb.com",
"keyword": "cabin",
"title": "Sunset kayak tour near the cabin district - Airbnb Experiences",
"description": "2.5 hour guided kayak experience · 4.9 (312) · Hosted by João",
"url": "https://www.airbnb.com/experiences/1122334",
"phone_number": null,
"country": "Portugal",
"dial_code": "+351",
"listingUrl": "https://www.airbnb.com/experiences/1122334",
"airbnbId": "1122334",
"resultType": "experience",
"serpRank": 5,
"snippet": "2.5 hour guided kayak experience · 4.9 (312) · Hosted by João",
"locationKeyword": "Lisbon",
"propertyType": "cabin",
"resultCategory": "other",
"scrapedAt": "2026-07-25T12:00:00+00:00"
}

phone_number is a null-tolerant field on every row: it is populated only when the SERP snippet itself contains an explicit international-format number, which is rare because Airbnb strips host contact details from its public pages. It is never fabricated — a missing number always returns null rather than a guessed value.

How many results can you scrape with Airbnb Phone Number Scraper with Listing Category Leads?

maxPerType caps results per property type at up to 10,000 (default 20), so the practical ceiling for one run is maxPerType × number of property types selected (up to the 8 known types). There is no separate hard cap in the Actor itself beyond that per-type limit. In practice, discovery stops earlier whenever Google returns three consecutive empty or fully-duplicate result pages for a property type, since Google's own index of site:airbnb.com pages for any single query is finite — the cap is a ceiling, not a guarantee of that many results. Pagination walks Google's start offset in increments of 10 until the cap or the empty-page limit is reached.

Integrate Airbnb Phone Number Scraper with Listing Category Leads and automate your workflow

Airbnb Phone Number Scraper with Listing Category Leads works with any language or tool that can send an HTTP request.

REST API integration

import requests
TOKEN = "your_apify_token"
ACTOR = "API-Empire~airbnb-phone-number-scraper-with-listing-category-leads"
run = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={"propertyTypes": ["villa", "cabin"], "location": "Lisbon", "maxPerType": 50},
)
run.raise_for_status()
for row in run.json():
print(row["propertyType"], row["resultType"], row["listingUrl"])

Works in Python, Node.js, Go, Ruby, cURL.

MCP for AI agents

The Actor is callable through Apify's own MCP Server, which exposes any Apify Actor as a tool an MCP-compatible agent can invoke mid-task:

npx -y @apify/actors-mcp-server --actors API-Empire/airbnb-phone-number-scraper-with-listing-category-leads

Once registered, an agent running in Claude Desktop, Claude Code, Cursor, or another MCP client can call the Actor directly and get back typed rows — no separate scraping step.

Automation platforms (n8n, Make)

In n8n, use the Apify node's "Run Actor" action with the Actor ID API-Empire/airbnb-phone-number-scraper-with-listing-category-leads and pass the JSON input shown above; the node returns the dataset items to the next step in your workflow. In Make, the Apify app's "Run Actor and Get Dataset Items" module accepts the same Actor ID and input object, letting you route discovered listings, host leads, or phone rows into a CRM, spreadsheet, or notification module without custom code.

Yes — Airbnb Phone Number Scraper with Listing Category Leads only returns data that is already publicly indexed by Google from airbnb.com pages; it does not log in, bypass any access control, or access private listings. Because output can include phone_number and host-identifying titles or snippets, rows containing that information are personal data under GDPR and CCPA, and you are responsible for having a lawful basis before storing, contacting, or otherwise processing it. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does Airbnb Phone Number Scraper with Listing Category Leads work without an Airbnb account?

Yes. It reads Google's public search results for site:airbnb.com and requires no Airbnb login or credentials — only an Apify account to run the Actor.

How often is the scraped data updated?

Every run performs a live Google search at the time you start it; there is no cache. Results reflect whatever Google has currently indexed for airbnb.com, which may lag behind brand-new listings.

What happens if a property type has no indexed results?

The Actor logs the empty streak and moves on once it hits three consecutive empty or fully-duplicate result pages for that property type; it does not error out, it simply returns fewer rows (or none) for that type while continuing with the others.

Can I scrape private or login-gated Airbnb content?

No. Only publicly indexed airbnb.com pages are returned — private listings, messages, and anything behind Airbnb's login wall are out of scope.

Does Airbnb Phone Number Scraper with Listing Category Leads work for AI agent workflows and LLM pipelines?

Yes. It's registrable through Apify's MCP Server (npx -y @apify/actors-mcp-server --actors API-Empire/airbnb-phone-number-scraper-with-listing-category-leads) for MCP-compatible clients, and it's callable as a standard HTTP Actor by any agent framework — every response is typed JSON with no parsing step before it enters an LLM's context.

How does Airbnb Phone Number Scraper with Listing Category Leads handle Google's anti-bot defenses?

It fetches through Apify's GOOGLE_SERP proxy group, rotates user agents and Accept-Language headers per request, jitters delays between requests, and retries up to three times with a fresh proxy URL when a response looks like a Google block/consent interstitial.

Does Airbnb Phone Number Scraper with Listing Category Leads return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with stable field names — no HTML, no selectors, no parsing. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool call.

Can I use Airbnb Phone Number Scraper with Listing Category Leads without managing proxies?

Yes. The Actor provisions and rotates its own GOOGLE_SERP proxy connections automatically; you only need to leave proxyConfiguration at its default.

Will phone numbers be populated for most rows?

No, and this is worth setting expectations on: phone_number is a null-tolerant, opportunistic field. Airbnb strips host contact details from its public pages, so the field is populated only on the rare row where a SERP snippet happens to expose an explicit international-format number — most rows will carry phone_number: null.

What happens when Airbnb or Google changes its page structure?

The scraper is maintained and the output schema — field names and types — stays stable on the user's end. The parser already includes a primary selector and an anchor-scanning fallback to absorb common markup drift without a numeric turnaround promise.

Your feedback

Found a bug or missing a field? We want to know. Reach out through the Actor's Apify Store page or the API-Empire support channel — reports like this keep the schema accurate and the scraper maintained.