Airbnb Listings Scraper avatar

Airbnb Listings Scraper

Pricing

$3.20 / 1,000 listing scrapeds

Go to Apify Store
Airbnb Listings Scraper

Airbnb Listings Scraper

Scrape Airbnb listings by location. Returns price per night, rating, review count, room type, host, amenities, coordinates, photos and listing URL. No login required.

Pricing

$3.20 / 1,000 listing scrapeds

Rating

0.0

(0)

Developer

Bruno

Bruno

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Scrape Airbnb search-result listings for any location — with optional check-in/check-out dates and guest count — without a headless browser. The actor sends a browser-grade HTTP request (via got-scraping, routed through Apify Proxy residential IPs) to Airbnb's own search page, then parses the JSON data Airbnb embeds in the page itself to pull out structured listing data.

Why it's useful

Airbnb doesn't have a public listings-search API. This actor gets the same data a browser sees — title, room type, price, rating, review count, coordinates and badges — directly from Airbnb's search results, for any city or region.

Input

{
"location": "Barcelona, Spain",
"checkIn": "2026-06-01",
"checkOut": "2026-06-07",
"adults": 2,
"maxItems": 30,
"currency": "USD"
}
  • location — required. A place name, exactly as you'd type it into Airbnb's search box.
  • checkIn / checkOut — optional, YYYY-MM-DD. Omit for a dates-agnostic search.
  • adults — number of guests (default 2).
  • maxItems — how many listings to return (default 30). The actor follows Airbnb's own pagination cursors (found inside the page data) across a few pages if needed to reach this count; if Airbnb doesn't expose a further cursor it stops and returns what it found.
  • currency — 3-letter code Airbnb should display prices in (default USD).
  • proxyConfiguration — Apify Proxy config; residential is strongly recommended.

Output (per listing)

{
"query_location": "Barcelona, Spain",
"checkIn": "2026-06-01",
"checkOut": "2026-06-07",
"adults": 2,
"currency": "USD",
"id": "12345678",
"name": "Charming loft in Gràcia",
"roomType": "entire_home",
"price_per_night_display": "$95",
"price_per_night": 95,
"price_total_display": "$665 total",
"price_total": 665,
"rating": 4.87,
"reviewsCount": 213,
"latitude": 41.4036,
"longitude": 2.1589,
"badges": ["Guest favorite"],
"url": "https://www.airbnb.com/rooms/12345678"
}

How it works

Airbnb's server-rendered search page embeds the full search response as JSON in a <script> tag (historically id="data-deferred-state-0"). The actor:

  1. Fetches the search page with browser-like TLS fingerprint/headers through a rotating residential proxy session, retrying with a fresh session up to 5 times if the response looks blocked (captcha page, small body, 403/429/503).
  2. Locates and JSON.parses the embedded state.
  3. Walks the parsed object generically looking for the search-results array (first by the known key name, then — if Airbnb has renamed or re-nested it — by scanning for arrays of objects shaped like { listing: { id, ... } }), so small upstream changes don't break extraction outright.
  4. If Airbnb's own pagination cursors are present in the same JSON, follows them for a few pages to reach maxItems; otherwise returns the first page and stops.

If every retry still looks blocked, the actor honestly reports { location, error: "blocked (needs residential proxy)" } instead of fabricating data. If the page loads but the JSON shape has changed enough that no listings array can be found, it reports that specific diagnosis instead.

Notes

  • No headless browser — faster and cheaper than a browser-based scraper.
  • Unofficial: this reads Airbnb's own search-page HTML/JSON, not a published API, so results depend on Airbnb not having changed its page structure.
  • Charges per listing returned (listing event).

⭐ Enjoying this Actor?

A quick rating/review helps others find it. Want neighborhood/amenity filters or listing-detail enrichment added? Open a ticket on the Issues tab.