Airbnb Property Details Scraper · 30+ Fields by City or URL avatar

Airbnb Property Details Scraper · 30+ Fields by City or URL

Pricing

from $3.49 / 1,000 results

Go to Apify Store
Airbnb Property Details Scraper · 30+ Fields by City or URL

Airbnb Property Details Scraper · 30+ Fields by City or URL

Extract full Airbnb listing data from any city worldwide. Get pricing, amenities, host info, ratings, coordinates, and images — one structured row per property, ready to export.

Pricing

from $3.49 / 1,000 results

Rating

0.0

(0)

Developer

Corentin Robert

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

118

Total users

8

Monthly active users

1.2 hours

Issues response

14 days ago

Last modified

Share

Airbnb Property Details Scraper

Turn Airbnb listing pages into a structured table — one row per property with amenities, capacity, pricing context, host display (name, Superhost flag, tenure), ratings, coordinates, images, and a completeness score. Export to CSV, JSON, or Excel for analysis, comps, or internal tools.

No company legal / B2B contact fields — this actor is listing intelligence only. For pro host emails, phones, and company details at scale, use Airbnb Professional Host Scraper. Custom integrations: corentin@outreacher.fr

No login. No API key. No Airbnb account needed.


Who is this for?

You are…Typical goalSuggested setup
Revenue / pricing analystCompare nightly rates and amenities across a marketCity search + price filter
STR operator / PMAudit your portfolio or a competitor setListing URLs mode (bulk)
Data team / engineerEnrich an internal table using listingIdListing URLs mode
Market researcherSnapshot a city by property type and ratingCity search + Maximum coverage
Vacation rental investorEvaluate a new market (pool supply, superhost rate)City search + Pool filter

By default you get: URL, listing ID, title, room type, capacity, amenity flags, rating, GPS, host display, and price context — typically 25–33 fields per listing.

For B2B contacts (email, phone, company name, SIREN) from professional hosts, use the companion scraper linked above.


Quick start

  1. Open the actor in Apify Console
  2. Mode: choose City search
  3. City name(s): enter Lyon, France (one per line)
  4. Click Start — results appear in the Dataset tab within minutes

To scrape specific listings instead: switch Mode to Listing URLs, paste your /rooms/… links, and run.


What it extracts

CategoryFields
IdentitylistingId, url, title
TypepropertyType, roomType, propertyCategory
Capacityguests, bedrooms, bathrooms, beds
PricepricePerNight, totalPrice
Locationlocation, latitude, longitude
HosthostName, hostType (Superhost / Host), hostSinceYears, hostUrl
Ratingsrating, ratingCount
Amenitiesamenities (raw list), boolean flags: hasPool, hasWifi, hasParking, hasGarden, hasTerrasse, hasVueMer, hasJacuzzi, hasCheminee, hasSauna, hasHammam, hasAnimaux, hasBilliard
PhotosmainImage, images (array)
QualitycompletenessScore (0–100)
MetaextractedAt

The dataset has two table views: overview (key fields) and amenities breakdown — selectable in the Console Dataset tab.

Locales: Phase 2 detail fetches match the listing domain (.fr, .es, .de, .com). roomType is always in neutral English; raw propertyType and amenities stay in the page language.


Input parameters

Console fields

FieldTypeDefaultDescription
modeselectcitycity — search by city name; bulkUrls — scrape specific listing URLs
citystring listOne city per line. Format: City or City, Country (e.g. Lyon, France). Country improves autocomplete accuracy.
listingUrlsURL list/rooms/{id} URLs (plain strings or { "url": "…" } objects). Used when mode = bulkUrls.
multiDateSearchbooleanfalse23 search variants merged and deduplicated — same strategy as the Professional Host actor. Finds 4–6× more listings.
priceMinintegerMinimum total stay price (€). Leave empty for no floor.
priceMaxintegerMaximum total stay price (€). Leave empty for no ceiling.
priceFilterNumNightsinteger5Number of nights the total price refers to.
propertyTypesselectallFilter by apartment, house, guest_house, or hotel.
amenitiesselectnoneFilter by Pool or Jacuzzi.

API-only fields (pass via JSON input)

These are not in the Console form but are accepted by the actor:

FieldTypeDefaultDescription
maxResultsinteger0 (no cap)Stop after N listings extracted in Phase 2. 0 = unlimited.
maxPagesinteger0 (no cap)Maximum search result pages per city pass. 0 = paginate until end.
checkinstringauto (+21 days)Check-in date for search (YYYY-MM-DD).
checkoutstringauto (+26 days)Check-out date for search (YYYY-MM-DD).
adultsinteger1Number of guests for the search query.
flexibleTripLengthsstring[][]Extra flexible search passes: weekend_trip, one_week, one_month.
multiPassConcurrencyinteger10Parallel city search passes when multiDateSearch is on (max 10).
useCityAutocompletebooleantrueUse Airbnb autocomplete to resolve city → place_id.
localestringautoForce locale: fr, en, es, de, it, pt.
proxyConfigurationobjectautoApify proxy config. Defaults to datacenter proxy on cloud.

JSON example (API / bulk):

{
"mode": "city",
"city": ["Amsterdam", "Barcelona, Spain"],
"amenities": ["Pool"],
"maxResults": 200,
"maxPages": 5
}

How it works

  1. Phase 1 — Discovery: For each city, builds a search URL (Airbnb autocomplete → place_id), crawls search result pages with Cheerio (no browser needed), and collects all /rooms/… URLs.
  2. Phase 2 — Extraction: Opens each listing page, parses the niobeClientData JSON block, extracts all fields, applies locale-aware normalization, and pushes one row per listing to the dataset.

Output sample

{
"listingId": "12345678",
"url": "https://www.airbnb.fr/rooms/12345678",
"title": "Charming apartment near the canal",
"propertyType": "Logement entier : appartement",
"roomType": "Entire place",
"guests": 4,
"bedrooms": 2,
"bathrooms": 1,
"beds": 2,
"pricePerNight": 95,
"totalPrice": 475,
"location": "Amsterdam, Netherlands",
"latitude": 52.3676,
"longitude": 4.9041,
"hostName": "Marie",
"hostType": "Superhost",
"hostSinceYears": 5,
"rating": 4.87,
"ratingCount": 142,
"hasPool": false,
"hasWifi": true,
"amenities": ["Wi-Fi", "Cuisine", "Machine à laver"],
"mainImage": "https://a0.muscache.com/im/pictures/…",
"completenessScore": 82,
"extractedAt": "2026-06-29T16:00:00.000Z"
}

How much does it cost to scrape Airbnb listings?

This actor uses HTTP-only crawling (no browser) — compute is very cheap.

ScenarioApprox. cost
25 listings (test run)< $0.01
500 listings, one city~$0.05
5,000 listings, multi-city~$0.20–0.50
50,000 listings~$1–3

No residential proxies required for most cities. For heavily geo-restricted searches, enabling Apify datacenter proxies (included at no extra cost on paid plans) is sufficient.

This actor only accesses data that Airbnb makes publicly available on their website — the same pages any visitor can see without logging in. As with any data collection involving publicly visible information, ensure your use complies with Airbnb's Terms of Service and applicable regulations (GDPR, CCPA, etc.) for your specific use case.


Also available

Airbnb Professional Host Scraper — Extract B2B contact data (email, phone, company name, SIREN/VIES) from professional hosts. Same city-search engine, different output.

Airbnb Host Portfolio Scraper — Get all listing URLs from a host profile page. Combine with this actor's URL mode for full listing intelligence on a specific host.


Local development

npm install
# Write input to the Apify local storage:
cp input-city-with-filters.json storage/key_value_stores/default/INPUT.json
# Or use --input-file:
apify run --input-file=./input-city-with-filters.json

storage/ is excluded from Docker via .apifyignore. When not on Apify cloud, the actor merges the repo-root input.json (if present) with Actor.getInput() — KV input wins on key collision.

Tests: npm run test:unit — pure input / URL builders, no network.


Changelog

See CHANGELOG.md.