Airbnb Search Scraper — Stays, Prices & Ratings avatar

Airbnb Search Scraper — Stays, Prices & Ratings

Pricing

from $1.02 / 1,000 results

Go to Apify Store
Airbnb Search Scraper — Stays, Prices & Ratings

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

The Netaji

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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.

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.