Airbnb Property Details · Listing Intel by City
Pricing
from $3.49 / 1,000 results
Airbnb Property Details · Listing Intel by City
Full listing rows: description, capacity, amenities, ratings, GPS, photos, completeness — not B2B/legal contacts. City or URLs. Pro host data: apify.com/corent1robert/airbnb-professional-host-scraper · corentin@outreacher.fr
Pricing
from $3.49 / 1,000 results
Rating
0.0
(0)
Developer
Corentin Robert
Maintained by CommunityActor stats
0
Bookmarked
125
Total users
3
Monthly active users
1.2 hours
Issues response
4 days 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.
No login. No API key. No Airbnb account needed.
Also available
The Store does not cross-sell this suite. Pick the Actor that matches the job:
| Actor | Use when |
|---|---|
| Airbnb Pro Host | Business emails and phones by city |
| This Actor — Property Details | Amenities, GPS, photos, completeness |
| Airbnb Calendar | Occupancy and day-by-day availability |
| Airbnb Price Monitor | Nightly rates across a market |
| Airbnb Host Portfolio | Map a host’s listings from profile URLs |
| Airbnb Experiences | Experience hosts, emails when enriched |
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.
Ready-made examples (published tasks)
| Example | Best for |
|---|---|
| Export Airbnb listing details in Lyon | STR operators snapshotting a French city for comps. |
| Airbnb listing intel for Barcelona market | Market researchers comparing a second EU city. |
| Enrich Airbnb listing URLs with amenities | Data teams enriching an internal table of listing IDs. |
| Airbnb market snapshot — prices and amenities | Investors who want a slim price/amenity table, not the full field dump. |
| Export Airbnb listing details in Paris | STR operators snapshotting Paris comps. |
| Export Airbnb listing details in Amsterdam | STR operators snapshotting Amsterdam comps. |
| Export Airbnb listing details in Lisbon | STR operators snapshotting Lisbon comps. |
| Export Airbnb listing details in Berlin | STR operators snapshotting Berlin comps. |
| Export Airbnb listing details in Rome | STR operators snapshotting Rome comps. |
| Airbnb amenities intel for London listings | Investors comparing amenity mix in London. |
| Export Airbnb listing details in Nice | STR operators snapshotting Nice comps. |
| Enrich Airbnb URLs — market-research view | Analysts enriching known listing URLs into a slim comps table. |
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.
Airbnb host cluster
This Actor is step 3 — listing intelligence after you already have URLs. For B2B emails, start at Pro Host.
| Step | Actor | Best for |
|---|---|---|
| 1 — Discover contacts | Airbnb Pro Host Scraper | City search → email, phone, company, hostProfileUrl |
| 2 — Size the host | Airbnb Host Portfolio Scraper | Paste hostProfileUrl → listing URLs |
| 3 — Listing intelligence | This Actor | Amenities, GPS, photos, pricing context — not B2B emails |
| 4 — Availability | Airbnb Calendar Availability Scraper | Day-by-day calendar from listing URLs |
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.