Airbnb Search Scraper — Stays, Prices & Ratings
Pricing
from $1.02 / 1,000 results
Airbnb Search Scraper — Stays, Prices & Ratings
Search Airbnb anywhere and export every stay it returns. Set dates and guest counts and each row comes back priced for that trip, with the rating, review count, coordinates and photos. Turn on stay details to add amenities, the host and per-category scores.
Pricing
from $1.02 / 1,000 results
Rating
0.0
(0)
Developer
The Netaji
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Airbnb Search Scraper
The Actor searches Airbnb for a destination and returns every stay the search yields, priced for
the dates supplied. Each record carries the stay's name, its price for that trip, its rating and
review count, its coordinates, and the photographs shown on the search card. Enabling
enrichStayDetails adds the whole stay page to every row.
Accepted input
destination is required and is free text, written as it would be typed into Airbnb: a city, a
region, a neighbourhood, or an address. It is the only required field.
checkin and checkout are ISO dates and must be supplied together. Airbnb ignores a lone
check-in date and returns undated results instead of reporting an error, so the Actor rejects a
half-specified stay before the request is made, as it does a checkout on or before checkin.
When both dates are present, every price returned covers that exact stay length.
adults accepts 1 to 16, children 0 to 15, and infants 0 to 5. Guest counts change both which
stays Airbnb shows and what they cost. Fields left empty are omitted from the request rather than
sent blank, because Airbnb treats an empty guest value as malformed and discards the entire guest
set.
maxItems bounds the number of records saved and defaults to 50. The bound cannot exceed 270;
see Why a run stops at 270 stays below. A value of 0 requests as many as the search will give,
which is the same 270 ceiling rather than an unlimited walk.
{"destination": "San Francisco, CA","checkin": "2026-10-05","checkout": "2026-10-09","adults": 2,"maxItems": 20,"enrichStayDetails": false}
Response fields
Every record carries id, url, name, title, subtitle, price, price_original,
price_qualifier, price_label, rating, reviews, latitude, longitude, image_url,
images, destination_matched, and destination_resolved.
price is the total for the dates searched, in the currency Airbnb displayed, and
price_qualifier states what it covers. price_original is populated only on a discounted stay
and is null otherwise. price_label preserves Airbnb's own full price sentence, such as
$197 for 5 nights, originally $253.
rating and reviews are null on a stay that has not been reviewed yet, rather than 0; a
stay with no reviews and a stay rated zero are different things and are returned differently.
id is the stay's numeric identifier and is the value the Airbnb Listing Scraper accepts.
{"id": "1348596009084608060","url": "https://www.airbnb.com/rooms/1348596009084608060","name": "Hotel Stratford","subtitle": "Hotel in Downtown San Francisco-Union Square","price": "$624","price_qualifier": "for 5 nights","price_label": "$624 for 5 nights","rating": 4.54,"reviews": 243,"latitude": 37.787,"longitude": -122.408,"destination_matched": true,"destination_resolved": "San Francisco, CA"}
Why every row reports whether the destination matched
Airbnb does not fail an unrecognisable destination. A search for a place it cannot resolve returns a full page of ordinary, real stays for somewhere else entirely, with no notice of any kind on the page: no "no results" message, no "showing nearby stays" banner, nothing in the visible text that distinguishes it from a successful search.
destination_matched is false on every row of such a run, and the run log carries a warning
naming the destination that failed to resolve. destination_resolved reports the place Airbnb
actually searched, which is worth checking even on a successful run, since a vague destination can
resolve to somewhere other than intended.
A run that returns plausible stays for the wrong city is the failure mode this field exists to
make visible. Filtering on destination_matched is the reliable way to discard one.
Behaviour on partial results
Pagination is performed upstream in a single request, so a run issues one search regardless of
maxItems. Fewer records than requested means the search itself was exhausted, not that the run
was cut short.
Why a run stops at 270 stays
Airbnb's search returns 18 stays per page and publishes 15 page cursors, on every destination measured, irrespective of how much inventory the place actually holds. 18 × 15 is 270, and that is the ceiling the surface imposes rather than a limit chosen here. A city with forty thousand listings returns the same 270 as a village with four hundred. Requests above the ceiling are capped rather than rejected.
Enriching with stay details
enrichStayDetails adds the stay's own page to every row: description, amenities with a flag
on each entry recording whether the stay has it, overview, highlights, host and the flattened
host_name and host_is_superhost, rating_categories, property_type, space_type,
person_capacity, and the complete stay_detail record.
This costs one additional request per stay and is billed per stay as an enrichment, charged only after the lookup succeeds. A stay removed between the search and the lookup leaves its search row intact, logs a warning, and bills nothing.
Where the stay page and the search card disagree, the stay page wins, with two exceptions that the
search knows and the stay page does not: price, which is priced for the dates searched, and
destination_matched.
Leaving the toggle off returns search cards only and is substantially faster on a large run.
Related Actors
The Airbnb Listing Scraper takes stay IDs directly and returns the same detail without a search. It is the cheaper route when the IDs are already known, or when only a handful of stays are needed from a destination that would otherwise be walked in full.
