Airbnb Scraper — Listings, Prices & Host Details
Pricing
from $0.50 / 1,000 listing scrapeds
Airbnb Scraper — Listings, Prices & Host Details
Airbnb scraper: listings by city or URL with nightly and total price, rating, reviews, coordinates, photos and host. $0.50 per 1,000.
Pricing
from $0.50 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Mohammed Samaan
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
Airbnb Listings Scraper
Search Airbnb by city or by search URL and get back every listing — price, rating, review count, coordinates and photos — with an optional switch to enrich each one with its full detail page. No browser: it reads the JSON payload Airbnb's own front-end renders, so it's fast and cheap to run.
Who it's for
- Short-term-rental investors comparing nightly rates and occupancy signals across a city before buying
- Property managers and dynamic-pricing tools tracking competitor rates
- Market researchers mapping supply by property type, bedroom count and price
What you get
| Field | What it is |
|---|---|
id / url | Listing ID and link |
name / title | Listing title |
propertyType / roomType | Entire home, private room, etc. (detail) |
city / lat / lng | Location |
pricePerNight / priceTotal / originalPrice / currency | Pricing |
rating / reviewsCount | Overall rating and review count |
ratingBreakdown | Per-category rating (detail) |
isSuperhost / hostId / hostName | Host info (detail) |
bedrooms / beds / bathrooms / maxGuests | Space (search + detail) |
amenities / houseRules | Full lists (detail) |
images | Photo URLs — a few from search, all from detail |
description / highlights | Listing text (detail) |
badges | e.g. Superhost, Guest favorite (search) |
checkIn / checkOut / scrapedAt | Dates the price applies to, timestamp |
Detail-only fields are null until includeDetails is on.
Example output
A real row from a search run on "Dubai" (28 Sep 2026, includeDetails off; images shortened from 29 URLs to 3). Fields marked "(detail)" above are null or missing here because no detail page was fetched, and detailsFetched is false:
{"id": "1513636006086015714","url": "https://www.airbnb.com/rooms/1513636006086015714","name": "Large Elegant Space| Burj Views | Near Dubai Mall","title": "Apartment in Dubai","roomType": null,"propertyType": "Apartment","city": "Dubai","lat": 25.1945,"lng": 55.2719,"pricePerNight": 588.6,"priceTotal": 2943,"priceLabel": "$2,943","originalPrice": null,"currency": "USD","rating": 4.97,"reviewsCount": 32,"isSuperhost": null,"hostId": null,"hostName": null,"bedrooms": 4,"beds": 6,"bathrooms": 3.5,"maxGuests": null,"amenities": null,"images": ["https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/70fb869d-52c5-4d42-9605-cf5d5996dabd.jpeg","https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/6a21906c-cb4e-49d9-aea7-65a63ed05c24.jpeg","https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/fa2048aa-3f9e-4974-b671-346bdaf2ecf7.jpeg"],"description": null,"houseRules": null,"cancellationPolicy": null,"instantBook": null,"badges": ["Guest favorite"],"checkIn": "2026-10-07","checkOut": "2026-10-12","detailsFetched": false,"scrapedAt": "2026-09-28T16:04:39.672Z"}
Input
{"locationQueries": ["Dubai"],"maxListingsPerQuery": 200,"currency": "USD","includeDetails": false}
Or paste an Airbnb search URL directly in startUrls to keep its filters.
currency matters — Airbnb otherwise guesses it from your proxy's country,
which mixes currencies across rows if you don't set it. Turn on
includeDetails to fetch each listing's full detail page (billed separately).
Airbnb caps a single search at roughly 270 results; splitByPriceBands
(on by default) automatically re-runs a saturated search across price bands
to go deeper.
Pricing
$0.50 per 1,000 listings scraped, plus $2 per 1,000 listing details
when includeDetails is on and a listing's detail page was actually fetched.
1,000 listings with full details costs $2.50.
How it compares
No browser means no Chromium to boot and no per-second compute charge — just HTTP requests reading the same JSON payload Airbnb's page already loads. That keeps a plain listing scrape cheap; detail enrichment costs more because it's one extra request per listing, priced separately so you only pay for it when you ask for it.
Use with n8n / Make / Zapier
Add an Apify integration node, run this actor with your locations or URLs,
then read the finished dataset back into your workflow — the stable id and
url per listing make it easy to join against a pricing or alerting flow.
Errors and limits
- No input: with no
locationQueriesand nostartUrlsthe run logs a warning, writes aSUMMARYrecord withlistings: 0and finishes without fetching anything. - Empty results: a search that returns no cards, or a 404/410 page, simply produces no rows for that query. The run still finishes and the dataset can be empty.
- Blocked, throttled or erroring (429, 5xx, other 4xx, timeouts): each request has a 45-second timeout and is retried with exponential backoff (about 1, 2, 4, 8 s plus jitter) up to
maxRetriestimes (default 4, max 8). If a search page still fails, or Airbnb returns a page with no search results in it (the log shows the page title), that query is logged as failed and the run continues with the next query. A run where every query fails therefore ends with an empty dataset, not a run failure, so check the log andSUMMARY. - Partial results: if the price-band deepening for a query fails on one band, the rows already collected for that query are kept.
- Detail pages: a detail page that fails or cannot be parsed leaves that listing as a search-only row (
detailsFetchedstaysfalse) and is counted indetailsFailedinSUMMARY. A listing whose detail page returns 404 or 410 is also left as a search-only row. - Search ceiling: Airbnb returns at most about 270 results per search. With
splitByPriceBandson, a saturated search is re-run in price bands to go deeper, and duplicates across bands and queries are dropped before anything is written or charged. - Cost behaviour:
listing-scrapedis charged once per row written, andlisting-detailonce per row whose detail page was actually fetched. Failed requests, retries, skipped rows and duplicates are not charged. If your max-charge cap is reached the run stops writing and keeps what it already wrote.
FAQ
Does it need a login or cookies? No — everything comes from public pages.
Does it use a browser? No — plain HTTP requests against Airbnb's own server-rendered JSON payload.
Can I get every listing in a big city? Turn on splitByPriceBands and
raise maxListingsPerQuery; for exhaustive coverage, feed one startUrl per
neighbourhood or map area.
Why are cancellationPolicy and instantBook usually null? Airbnb only
exposes those inside its booking flow, not on the listing page, so the actor
doesn't fabricate values for them.
Are reviews included? Not the review text — it lives behind a request whose query hash Airbnb rotates per release, so it isn't included in this version rather than ship something that breaks silently.
What if Airbnb blocks the run? If it serves a block page, the run logs
the page's title so you can see what came back instead of a silent empty
dataset. Use RESIDENTIAL proxy for larger runs.
Use it from an AI agent (MCP)
Add this Actor to any MCP client (Claude, Cursor, VS Code) with one URL:
https://mcp.apify.com?tools=leadharbor/airbnb-listings-scraper
Or call it through the Apify API with an input like this:
{"locationQueries": ["Dubai"],"maxListingsPerQuery": 100}
Returns one row per Airbnb listing: price, rating, reviews, coordinates, photos and host. Results land in the run's default dataset (JSON, CSV or Excel). No login or API key is needed for the sites it reads, and pay-per-event pricing works with Apify's x402 agent payments.
API usage
Run it from your own code with an Apify API token. The input below is this actor's prefilled example.
curl (runs the actor and returns the dataset items):
curl -X POST "https://api.apify.com/v2/acts/leadharbor~airbnb-listings-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"locationQueries": ["Dubai","Muscat, Oman"]}'
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("leadharbor/airbnb-listings-scraper").call(run_input={"locationQueries": ["Dubai","Muscat, Oman"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Changelog
28 Sep 2026 — Fixed: Airbnb geo-redirect pages returned 0 listings; buyer max-charge cap now stops the run; MCP agent section. Plus 5 public example tasks with their own pages.
More from leadharbor
- Google Maps MX-Checked Email Scraper
- YouTube Video Scraper
- E-commerce Price & Restock Monitor
- App Store Review Monitor
- Local Review Booster
- Website Contact Extractor
- Bulk Email Verifier
- USA Business Email Finder
- UK Business Email Finder
- UAE Business Email Finder
- UAE Property Broker Contacts
- LinkedIn Jobs Scraper
Using this actor? A quick review helps other buyers find it: airbnb-listings-scraper
Related actors
- Disposable Email & Domain Checker — Flags throwaway and free-provider email domains using 5 merged public lists. $0.30 per 1,000 checks.
- Domain Trust Check — 0-100 trust score for a domain from domain age, SSL, SPF/DKIM/DMARC and disposable-domain lists. $2.50 per 1,000 domains.
- Google Maps Scraper — MX-Checked Business Emails — Finds local businesses on Google Maps with emails, phones and socials.