Airbnb Scraper avatar

Airbnb Scraper

Pricing

from $3.50 / 1,000 results

Go to Apify Store
Airbnb Scraper

Airbnb Scraper

Scrape Airbnb listings via location search or direct URLs. Three modes: search-fast (cards only), search-full (full details), urls (specific listings). HTTP-only, no browsers.

Pricing

from $3.50 / 1,000 results

Rating

0.0

(0)

Developer

Blynx

Blynx

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

2

Monthly active users

11 days ago

Last modified

Share

Single Apify actor that combines three search modes for Airbnb listings:

  • search-fast — fast scrape of listing cards from /api/v3/StaysSearch (price, rating, basic facts; no detail page hit).
  • search-fullsearch-fast + full listing details merged in (StaysPdpSections per listing).
  • urls — full details for an explicit list of https://www.airbnb.com/rooms/<id> URLs.

HTTP-only — no Playwright/Selenium/Puppeteer/nodriver in the production image. The actor talks to Airbnb's internal Niobe GraphQL persisted-query endpoint directly through curl_cffi(impersonate="chrome") so TLS/HTTP-2 fingerprints look like real Chrome.

Modes

ModeInputsOutputSpeedCost
search-fastlocationQueries[]cards onlyfastestcheapest
search-fulllocationQueries[]cards + listing detailsmediumper listing
urlsstartUrls[]listing detailsmediumper listing

If mode is omitted, it's auto-detected: startUrls present → urls, else search-fast.

Quick start (Apify Console)

Default prefill runs out of the box and is sized to satisfy Apify's quality test:

{
"mode": "search-fast",
"locationQueries": ["Prague"],
"maxItemsPerQuery": 5,
"currency": "USD",
"locale": "en"
}

Example: search-fast

{
"mode": "search-fast",
"locationQueries": ["Prague", "Berlin"],
"checkIn": "2026-06-01",
"checkOut": "2026-06-07",
"adults": 2,
"minPrice": 50,
"maxPrice": 250,
"roomType": "Entire home/apt",
"maxItemsPerQuery": 100,
"currency": "USD",
"locale": "en"
}

Returns one item per listing with: id, url, name, coordinates, rating, bedrooms/beds/bathrooms, price (for the requested dates, including original price and discounts), images, badges.

Example: search-full

{
"mode": "search-full",
"locationQueries": ["Prague"],
"checkIn": "2026-06-01",
"checkOut": "2026-06-07",
"adults": 2,
"maxItemsPerQuery": 30,
"includeReviews": true,
"includeCalendar": true,
"currency": "USD",
"locale": "en"
}

Same as search-fast plus from the listing detail: propertyType, host (Superhost status, years hosting, rating count, profile photo, cohosts), amenities (categorised), highlights, description, sleepingArrangement, houseRules, safety, full image set, and optionally reviews and availabilityCalendar.

Example: urls

{
"mode": "urls",
"startUrls": [
{ "url": "https://www.airbnb.com/rooms/53997462" },
{ "url": "https://www.airbnb.com/rooms/20277576?adults=2&check_in=2026-06-01&check_out=2026-06-07" }
],
"adults": 2,
"checkIn": "2026-06-01",
"checkOut": "2026-06-07",
"includeCalendar": true,
"currency": "USD",
"locale": "en"
}

Output schema

Every item contains (null keys are dropped):

{
"id": "53997462",
"url": "https://www.airbnb.com/rooms/53997462",
"name": "Cozy apartment at historical center",
"propertyType": "Entire condo", // search-full / urls only
"roomType": "Entire home/apt", // search-full / urls only
"personCapacity": 2, // search-full / urls only
"bedrooms": 1, "beds": 2, "bathrooms": 1, // from search card
"coordinates": { "lat": 40.6298, "lng": 22.9497 },
"neighborhood": "Thessaloniki, Greece", // search-full / urls only
"rating": {
"value": 4.95,
"reviewsCount": 65,
"categories": { // search-full / urls only
"accuracy": 4.91, "checkin": 4.97, "cleanliness": 4.94,
"communication": 5.0, "location": 4.98, "value": 4.95, "overall": 4.95
}
},
"images": [{ "id": "...", "url": "https://a0.muscache.com/..." }],
"imageCount": 46, // search-full / urls only
"price": {
"currency": "USD",
"displayPrice": "$954",
"originalPrice": "$1,400",
"qualifier": "total",
"breakdown": { /* full Airbnb price breakdown */ }
},
"badges": ["Superhost", "Guest favorite"],
"amenities": [{ "category": "Bathroom", "items": [...] }], // search-full / urls
"highlights": [{ "type": "...", "headline": "...", "body": "..." }],
"description": "...", // search-full / urls
"descriptionLanguage": "en",
"sleepingArrangement": [{ "title": "Bedroom", "subtitle": "1 queen bed" }],
"houseRules": ["Check-in after 3:00 PM", "Checkout before 11:00 AM"],
"safety": ["Carbon monoxide alarm", "Smoke alarm"],
"host": {
"name": "Alexia", "isSuperhost": true, "ratingCount": 65,
"ratingAverage": 4.95, "yearsHosting": 4, "monthsHosting": 4,
"profilePictureUrl": "...", "cohosts": [...]
},
"reviews": { // only when includeReviews=true
"total": 65,
"fetched": 50,
"reviews": [{ "id": "...", "rating": 5, "comments": "...", "createdAt": "...", "reviewer": {...} }],
"tags": [...]
},
"availabilityCalendar": { // only when includeCalendar=true
"constantMinNights": 2,
"months": [{ "month": 6, "year": 2026, "days": [{ "date": "2026-06-01", "available": false, ... }] }]
},
"locale": "en",
"currency": "USD",
"sourceUrl": "https://www.airbnb.com/rooms/53997462"
}

Pass "rawOutput": true to embed the raw GraphQL responses under _raw.

Notes & limits

  • Currency is restricted to USD and EUR. Anything else falls back to USD. Rubles aren't supported on purpose — Airbnb left the Russian market in 2022.
  • Search ceiling is 270 listings per query (Airbnb returns at most 15 pages of 18). Use multiple locationQueries to scrape more.
  • Empty input is handled gracefully: the actor exits with code 1 and a readable status message instead of a stack trace.
  • Proxy: The default is { "useApifyProxy": true } (Apify picks an available group automatically). If your plan has DATACENTER access, set apifyProxyGroups: ["DATACENTER"] for the cheapest path -- it works fine for Airbnb because curl_cffi(impersonate="chrome") handles TLS fingerprinting. Otherwise use ["RESIDENTIAL"].

Throughput & maxConcurrency

maxConcurrency is a global cap on parallel HTTP requests to Airbnb -- every operation (search, listing details, calendar, reviews, BookIt) shares the same budget. Every listing in search-full fans out into 1-4 HTTP calls depending on which enrich flags are on, and the global semaphore makes sure they don't all burst at once.

Measured on a clean machine with no proxy, hitting the live Airbnb API, with search-full + includeReviews + includeCalendar (3-4 requests per listing) and 25 listings per query:

maxConcurrencyitems/secnotes
3~1.0safe even for fragile residential proxies
5~1.5good balance for typical residential plans
10~2.6comfortable for datacenter proxies
20~3.7aggressive; datacenter / no-proxy territory
30~4.4maxed out -- Airbnb's own latency dominates
50~4.9no extra gain beyond ~30

Picking the right value

Your proxyRecommended maxConcurrency
No proxy (useApifyProxy: false)20-30
Apify DATACENTER10-20
Apify RESIDENTIAL3-5

If the log starts spamming network/proxy error (ProxyError / Timeout) or transient status=503 -- halve maxConcurrency and rerun. The actor has three independent retry budgets (proxy_failures, captcha_failures, attempt), so transient errors don't lose listings; they just slow the run down.

Expected wall time for a full run

A full 270-listing search-full + reviews + calendar query is ~810-1080 HTTP calls. At measured rates:

  • DATACENTER, maxConcurrency=15: ~2 min
  • RESIDENTIAL, maxConcurrency=5: ~10-15 min
  • No proxy, maxConcurrency=30: ~1 min (but the IP gets hot fast)

Tech

  • apify >= 3.3, < 4 SDK, crawlee >= 1.5, < 2
  • curl_cffi >= 0.7.0 — Chrome TLS/HTTP-2 fingerprinting
  • pydantic >= 2.7 — input validation
  • Default container: 512 MB RAM (HTTP-only — no browser needed)