Airbnb Listings & Pricing Scraper
Pricing
Pay per event
Airbnb Listings & Pricing Scraper
Scrape Airbnb search-results pages into structured listing rows — price, rating, host, superhost status, bedrooms, and location, with optional detail-page amenities. Built for STR investors, dynamic-pricing tool builders, and market researchers who need clean, structured Airbnb data at scale.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
🎯 What this scrapes
Airbnb runs its own vast homes-search index with no public API and no documented quota — access is gated by anti-bot defenses, not an exhaustible rate limit. This Actor walks a search-results page (either a place name like "San Francisco, CA" or a full search URL you paste in, with your own check-in/check-out/guest filters applied) and pulls each listing's price, currency, rating, review count, host, superhost status, bedrooms/beds/bathrooms, location, and photos straight out of the page's embedded listing data. Flip on detail enrichment and we also fetch each listing's own page for its amenities list.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- STR investment comps — pull live nightly pricing and occupancy signals (ratings, review counts) for a market before buying a short-term rental property.
- Dynamic-pricing tools — feed real competitor nightly rates into your own pricing model for a neighborhood or city.
- Property-management benchmarking — compare your listings' price, rating, and amenities against nearby Superhosts.
- Housing-policy research — track short-term-rental density and pricing by neighborhood for zoning or policy studies.
- Travel-price monitoring — watch how nightly rates move for a destination as check-in dates approach.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
location | string | no | None | Place name, e.g. San Francisco, CA. Required if searchUrl is not set — used to build the… |
searchUrl | string | no | None | Full airbnb.com/s/.../homes search URL with your own filters already applied. Wins over… |
checkIn | string | no | None | ISO date (YYYY-MM-DD). Appended as checkin; drives totalPrice on each row. |
checkOut | string | no | None | ISO date (YYYY-MM-DD), must be after checkIn. Appended as checkout. |
guests | integer | no | 1 | Number of adult guests. Appended as adults. |
maxResults | integer | no | 50 | Hard cap on dataset rows. Pagination stops once this cap is hit. |
enableDetailEnrichment | boolean | no | False | Fetch each emitted listing's /rooms/<id> page for its amenities list. Off by default — multiplies… |
proxyCountry | string | no | 'US' | 2-letter uppercase country code. Pins the residential proxy exit country for every request — never randomized. |
proxyConfiguration | object | no | {'useApifyProxy': True, 'apifyProxyGroups': ['RESIDENTIAL'], 'apifyProxyCountry': 'US'} | Apify Proxy spec. Airbnb is fronted by anti-bot defenses — residential exits pinned to proxyCountry are… |
Example input
{"location": "Austin, TX","maxResults": 3,"enableDetailEnrichment": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | Airbnb listing ID. |
url | string | Absolute URL to the listing's /rooms/ |
title | ['string', 'null'] | Listing headline. |
listing_type | ['string', 'null'] | e.g. 'Entire home'. |
room_type | ['string', 'null'] | e.g. 'Entire home/apt'. |
city | ['string', 'null'] | City name. |
country | ['string', 'null'] | Country name. |
lat | ['number', 'null'] | Latitude. |
lng | ['number', 'null'] | Longitude. |
price_per_night | ['number', 'null'] | Nightly price, as observed — no currency conversion. |
currency | ['string', 'null'] | Currency code, as observed. |
total_price | ['number', 'null'] | Populated only when checkIn/checkOut are both given. |
rating | ['number', 'null'] | Aggregate listing rating. |
review_count | ['integer', 'null'] | Number of reviews. |
host_id | ['string', 'null'] | Host ID. |
host_name | ['string', 'null'] | Host display name. |
is_superhost | ['boolean', 'null'] | Whether the host is a Superhost. |
bedrooms | ['integer', 'null'] | Number of bedrooms. |
beds | ['integer', 'null'] | Number of beds. |
bathrooms | ['number', 'null'] | Number of bathrooms. |
max_guests | ['integer', 'null'] | Max guest capacity. |
amenities | array | Empty unless enableDetailEnrichment=true. |
image_urls | array | Listing photo URLs. |
scraped_at | string | ISO-8601 UTC timestamp stamped at push time. |
Example output
{"listing_id": "12345678","url": "https://www.airbnb.com/rooms/12345678","title": "Modern loft near Golden Gate Park","listing_type": "Entire home","room_type": "Entire home/apt","city": "San Francisco","country": "United States","lat": 37.7694,"lng": -122.4862,"price_per_night": 217.0,"currency": "USD","total_price": 1085.0,"rating": 4.87,"review_count": 213,"host_id": "987654","host_name": "Maria","is_superhost": true,"bedrooms": 2,"beds": 3,"bathrooms": 1.5,"max_guests": 4,"amenities": [],"image_urls": ["https://a0.muscache.com/im/pictures/example.jpg"],"scraped_at": "2026-09-09T14:32:07Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result-scraped | $0.0029 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $3.10. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Airbnb is fronted by anti-bot defenses — a residential proxy is required, and the Actor rotates its session and browser fingerprint on any block, which can still slow a run down under heavy load.
- Amenities are only populated when
enableDetailEnrichmentis on; the base search payload rarely carries them. - Review text, full calendar/availability, and Airbnb Experiences/Luxe listings are out of scope — only aggregate rating/review count and homes search are covered.
- Prices and currency are passed through exactly as Airbnb reports them — no currency conversion is performed.
❓ FAQ
Do I need an Airbnb account or API key?
No. Airbnb publishes no public API for this data. This Actor scrapes public search-results pages — see the Limitations section for what that means for reliability.
Can I scrape a specific search with my own filters?
Yes — apply your filters on airbnb.com, copy the resulting search URL, and paste it into searchUrl. It wins over location if both are set.
Why do I need check-in/check-out dates?
They're optional. Without them you get each listing's base nightly price. With both set, we also append them to the search and populate total_price for the stay.
What does detail-page enrichment add?
Turning on enableDetailEnrichment fetches each emitted listing's own page for its amenities list. It's off by default because it roughly doubles the request volume.
Why does this need a residential proxy?
Airbnb fronts its search pages with anti-bot defenses. The default proxy configuration already requests a RESIDENTIAL exit pinned to your chosen country — leave it as-is for reliable results.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.