Airbnb Property Details Scraper Β· 30+ Fields by City or URL
Pricing
from $3.49 / 1,000 results
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
Actor stats
0
Bookmarked
112
Total users
14
Monthly active users
11 hours ago
Last modified
Categories
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 goal | Suggested setup |
|---|---|---|
| Revenue / pricing analyst | Compare nightly rates and amenities across a market | City search + price filter |
| STR operator / PM | Audit your portfolio or a competitor set | Listing URLs mode (bulk) |
| Data team / engineer | Enrich an internal table using listingId | Listing URLs mode |
| Market researcher | Snapshot a city by property type and rating | City search + Maximum coverage |
| Vacation rental investor | Evaluate 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
- Open the actor in Apify Console
- Mode: choose City search
- City name(s): enter
Lyon, France(one per line) - 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
| Category | Fields |
|---|---|
| Identity | listingId, url, title |
| Type | propertyType, roomType, propertyCategory |
| Capacity | guests, bedrooms, bathrooms, beds |
| Price | pricePerNight, totalPrice |
| Location | location, latitude, longitude |
| Host | hostName, hostType (Superhost / Host), hostSinceYears, hostUrl |
| Ratings | rating, ratingCount |
| Amenities | amenities (raw list), boolean flags: hasPool, hasWifi, hasParking, hasGarden, hasTerrasse, hasVueMer, hasJacuzzi, hasCheminee, hasSauna, hasHammam, hasAnimaux, hasBilliard |
| Photos | mainImage, images (array) |
| Quality | completenessScore (0β100) |
| Meta | extractedAt |
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
| Field | Type | Default | Description |
|---|---|---|---|
mode | select | city | city β search by city name; bulkUrls β scrape specific listing URLs |
city | string list | β | One city per line. Format: City or City, Country (e.g. Lyon, France). Country improves autocomplete accuracy. |
listingUrls | URL list | β | /rooms/{id} URLs (plain strings or { "url": "β¦" } objects). Used when mode = bulkUrls. |
multiDateSearch | boolean | false | 23 search variants merged and deduplicated β same strategy as the Professional Host actor. Finds 4β6Γ more listings. |
priceMin | integer | β | Minimum total stay price (β¬). Leave empty for no floor. |
priceMax | integer | β | Maximum total stay price (β¬). Leave empty for no ceiling. |
priceFilterNumNights | integer | 5 | Number of nights the total price refers to. |
propertyTypes | select | all | Filter by apartment, house, guest_house, or hotel. |
amenities | select | none | Filter by Pool or Jacuzzi. |
API-only fields (pass via JSON input)
These are not in the Console form but are accepted by the actor:
| Field | Type | Default | Description |
|---|---|---|---|
maxResults | integer | 0 (no cap) | Stop after N listings extracted in Phase 2. 0 = unlimited. |
maxPages | integer | 0 (no cap) | Maximum search result pages per city pass. 0 = paginate until end. |
checkin | string | auto (+21 days) | Check-in date for search (YYYY-MM-DD). |
checkout | string | auto (+26 days) | Check-out date for search (YYYY-MM-DD). |
adults | integer | 1 | Number of guests for the search query. |
flexibleTripLengths | string[] | [] | Extra flexible search passes: weekend_trip, one_week, one_month. |
multiPassConcurrency | integer | 10 | Parallel city search passes when multiDateSearch is on (max 10). |
useCityAutocomplete | boolean | true | Use Airbnb autocomplete to resolve city β place_id. |
locale | string | auto | Force locale: fr, en, es, de, it, pt. |
proxyConfiguration | object | auto | Apify 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
- 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. - Phase 2 β Extraction: Opens each listing page, parses the
niobeClientDataJSON 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.
| Scenario | Approx. 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.
Is scraping Airbnb legal?
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
npminstall# 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.
