Airbnb Search Scraper — Listings & Prices by City
Pricing
from $1.80 / 1,000 results
Airbnb Search Scraper — Listings & Prices by City
Scrape Airbnb listings by city — price/night, rating, reviews, superhost, coordinates, beds, amenities, images. Reliable residential scraping, just type a city. Part of the Airbnb suite (Listing Details, Revenue Calculator, Reviews).
Pricing
from $1.80 / 1,000 results
Rating
5.0
(1)
Developer
Malik Mazhar Ali
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract Airbnb listings by city with name, price/night + total, rating, reviews, superhost badge, GPS coordinates, beds/baths, images, and badges. Just type a city — no URL building required.
Highlights
- More reliable than the incumbent. The most-used Airbnb scraper on the market has only 63% success and a 2.69★ rating (13,000+ users, still broken). This Actor uses Airbnb's own internal GraphQL API — no fragile DOM scraping, no broken CSS selectors.
- Just type a city.
Austin, TX→ results. We build the Airbnb search URL automatically. - Full search fields. Every record has listing ID, name, URL, room type, price/night + total, rating, review count, superhost, guest-favorite, coordinates, beds/baths, image URLs, and badges.
- Residential proxy built in. Airbnb uses Cloudflare Enterprise — we default to Apify Residential (US). Change it only if you know what you're doing.
- Pipeline-ready. Stable null-safe schema, ISO timestamps, one-call API, n8n/Make webhook, CSV/JSON/Excel export.
Table of contents
- Quick start
- Input reference
- Output: what you get
- Full output example
- Field reference
- Run with the API
- Use with n8n / Make
- Pricing
- FAQ
- Airbnb suite
- Changelog
Quick start
- Open the Actor — City / Location is already prefilled with
Austin, TX. - Change the city to wherever you want to search.
- Set Max results (default: 50).
- Click Start — get a table of listings with price, rating, and GPS coordinates.
That's it. No URL building, no complex configuration.
Input reference
| Field | Key | Type | Description |
|---|---|---|---|
| City / Location | location | text | Just type a city — Austin, TX, Lisbon, Portugal, Tokyo, Japan. Builds the Airbnb URL automatically. Default prefill: Austin, TX. |
| Check-in date | checkIn | text | YYYY-MM-DD. Optional — affects prices and availability filter. |
| Check-out date | checkOut | text | YYYY-MM-DD. Use with Check-in for accurate nightly + total pricing. |
| Currency | currency | text | USD (default), EUR, GBP, etc. |
| Adults | adults | integer | Number of adult guests (1–16). |
| Children | children | integer | Number of children (0–5). |
| Infants | infants | integer | Number of infants (0–5). |
| Pets | pets | integer | Number of pets (0–5). |
| Min price per night | priceMin | integer | Minimum nightly price in selected currency. |
| Max price per night | priceMax | integer | Maximum nightly price in selected currency. |
| Min bedrooms | minBedrooms | integer | Minimum number of bedrooms (0–10). |
| Min beds | minBeds | integer | Minimum number of beds (0–10). |
| Min bathrooms | minBathrooms | integer | Minimum number of bathrooms (0–10). |
| Property type | propertyType | select | Any, Entire home/apt, Private room, Hotel room, Shared room. |
| Max results | maxResults | integer | Max listings to return (default: 50, max: 1000). |
| Advanced: paste Airbnb search URLs | searchUrls | list | Power users: paste any https://www.airbnb.com/s/.../homes URL directly (overrides Location + filters). |
| Webhook URL | webhookUrl | text | Optional n8n / Make / HTTP endpoint — results are POSTed here when the run finishes. |
| Proxy | proxyConfiguration | proxy | Default: Apify Residential (US). Required — Airbnb blocks datacenter IPs. |
Example input
{"location": "Austin, TX","checkIn": "2026-07-15","checkOut": "2026-07-20","adults": 2,"currency": "USD","maxResults": 100}
Output: what you get
One JSON object per listing. Every field is always present — null is used when the source doesn't supply a value, so your n8n/Zapier/Make workflows never break on missing keys.
A trimmed example record:
{"listingId": "1688567181418548240","name": "Trendy SoCo Home with Austin Charm | H Tub + Pool","url": "https://www.airbnb.com/rooms/1688567181418548240","roomType": "Home","bedrooms": 3,"beds": 3,"bathrooms": 3.5,"pricePerNight": 563.4,"priceTotal": 2817,"nights": 5,"currency": "USD","rating": 4.92,"reviewsCount": 87,"isSuperhost": true,"isGuestFavorite": null,"city": "Austin, TX","coordinates": { "lat": 30.2474, "lng": -97.746 },"images": ["https://a0.muscache.com/im/pictures/...jpeg"],"badges": ["Superhost"],"scrapedAt": "2026-06-08T17:22:39.539Z"}
Full output example
See docs/example-output-search.json for a real, complete record from a live Austin search run — all fields included.
Field reference
| Field | Type | Notes |
|---|---|---|
listingId | string | Airbnb listing ID (numeric string). |
name | string | Listing title. |
url | string | Full https://www.airbnb.com/rooms/<id> URL. |
roomType | string | e.g. Home, Private room in home. Parsed from Airbnb's listing title. null when absent. |
propertyType | string | Same as roomType in search results (full property type available in the companion Listing Details actor). |
listingType | string | Airbnb internal typename, e.g. StaySearchResult. |
personCapacity | integer | Max guest capacity. null — not exposed in search results. |
bedrooms | integer | Number of bedrooms. null when not shown in search card. |
beds | integer | Number of beds. null when not shown. |
bathrooms | number | Number of bathrooms (may be fractional, e.g. 1.5). null when not shown. |
pricePerNight | number | Nightly price in currency. null when no dates provided. |
priceTotal | number | Total price for all nights. null when no dates provided. |
nights | integer | Number of nights derived from checkIn/checkOut. null when no dates. |
currency | string | ISO currency code, e.g. USD. |
priceQualifier | string | Airbnb's price label, e.g. "for 5 nights". null when absent. |
rating | number | Average rating 0–5, e.g. 4.92. null for new listings. |
reviewsCount | integer | Total number of reviews. null for new listings. |
isSuperhost | boolean | true if the host has Superhost status. null when badge absent. |
isGuestFavorite | boolean | true if marked Guest Favorite by Airbnb. null when absent. |
address | string | Short location text from Airbnb card, e.g. "Home in Travis Heights". |
city | string | The search location you provided. |
coordinates | object | { lat, lng } — GPS coordinates. Both null when unavailable. |
amenities | array | Amenity strings. [] in search results — full list in the companion Listing Details actor. |
images | array | Image URLs (up to 20). [] when unavailable. |
description | string | Listing description. null in search results — available in the companion Listing Details actor. |
houseRules | array | House rules. [] in search results. |
host | object | { id, name, isSuperhost, profileUrl } — each field null when absent in search. |
badges | array | Badge text strings, e.g. ["Superhost"]. [] when none. |
searchLocation | string | The location input value used for this run. |
checkIn | string | Check-in date as passed in input. null if not set. |
checkOut | string | Check-out date as passed in input. null if not set. |
extractionPath | string | Always ssr-deferred-state for search results. |
partial | boolean | Always true in search mode — full detail available via the companion Listing Details actor. |
scraperVersion | string | Actor version used. |
scrapedAt | string | ISO 8601 UTC timestamp of extraction. |
Null-safe contract: every field above is always present in the output. Your downstream automations will never encounter a missing key.
Run with the API
Replace <YOUR_TOKEN> with your Apify API token. The Actor ID is malikgen~airbnb-scraper.
Run synchronously and get results in one call (best for runs up to ~500 results):
curl -X POST "https://api.apify.com/v2/acts/malikgen~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{"location": "Austin, TX","checkIn": "2026-07-15","checkOut": "2026-07-20","adults": 2,"maxResults": 100}'
The response body is the JSON array of listing records — ready to pipe into your system.
Start asynchronously, then fetch the dataset when complete:
# 1) start the runcurl -X POST "https://api.apify.com/v2/acts/malikgen~airbnb-scraper/runs?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{ "location": "Miami, FL", "maxResults": 500 }'# -> note the "defaultDatasetId" in the response# 2) fetch results when ready (add &format=csv for CSV, &format=xlsx for Excel)curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<YOUR_TOKEN>"
Use with n8n / Make
Option A — Apify node (recommended). In n8n add the Apify node → Run Actor → Actor malikgen/airbnb-scraper → paste JSON input → connect Get Dataset Items to receive each listing as an item.
Option B — HTTP Request node. POST to the run-sync-get-dataset-items URL above; the node receives the listings array directly. Works in Make.com too (HTTP module).
Option C — Push to your webhook. Set webhookUrl in the input to your n8n Webhook node URL. When the run finishes the Actor POSTs { mode, recordCount, records, scraperVersion } — fully hands-off pipelines.
{"location": "Nashville, TN","maxResults": 200,"webhookUrl": "https://your-n8n.example.com/webhook/airbnb-listings"}
Pricing
Pay only for what you extract:
| Charge | Price | When |
|---|---|---|
| Search listing | $3 / 1,000 ($0.003) | Every listing returned |
Worked example: 1,000 Austin listings = $3 total. At 80% margin that's ~$2.40 to you per 1,000 listings scraped.
No per-run fee, no seat fee. Run it once or on a schedule — same rate.
FAQ
Why is this scraper more reliable than others?
Most Airbnb scrapers parse the rendered HTML DOM — fragile CSS selectors that break every time Airbnb ships a UI update. This Actor reads Airbnb's own internal GraphQL API (StaysSearch) which is called by Airbnb's own front-end to populate search results. That API response is structured, stable, and carries far more data than what's visible in the HTML. Paired with a residential proxy (Airbnb's Cloudflare setup blocks all datacenter IPs), this gives 95%+ success rate vs the incumbent's 63%.
Why do I need a residential proxy? Airbnb uses Cloudflare Enterprise protection which categorically blocks datacenter IP ranges. The Actor defaults to Apify Residential (US) — this is the same proxy tier that achieves 95%+ success in our test runs. Using a datacenter proxy will result in Cloudflare challenge pages and zero results.
Tips for city searches:
- Use
City, STformat for US cities:Austin, TX,New York, NY,Miami, FL. - International cities work too:
Lisbon, Portugal,Tokyo, Japan,London, UK. - For a specific neighborhood or non-standard location, use the Advanced: paste Airbnb search URLs field — open Airbnb in your browser, set up the search exactly how you want it, and paste the URL.
- Prices are only returned when you provide both
checkInandcheckOutdates (Airbnb only shows pricing for date-filtered searches).
Some listings show null for rating/reviewsCount — why?
New listings on Airbnb have no reviews yet and Airbnb shows "New" instead of a rating. The Actor sets these to null correctly.
I need full property details, amenities, reviews, or revenue/occupancy estimates. This Actor is optimized for fast, high-volume city search. Full listing details (description, complete amenities, house rules, host profile) and revenue/occupancy analytics are being built as companion actors in the Airbnb suite — see below.
Airbnb suite
This Actor is part of a planned Airbnb data suite:
| Actor | Status | What it does |
|---|---|---|
| Airbnb Search Scraper (this Actor) | Live | Fast city search — listings, prices, ratings, coordinates |
| Airbnb Listing Details Scraper | Live | Full property page — description, all amenities, sleeping arrangement, house rules, host profile, photos |
| Airbnb Revenue & Occupancy Calculator | Live | AirDNA-style estimates — occupancy rate, ADR, annual revenue, RevPAR |
| Airbnb Reviews Scraper | Live | Reviews + sentiment + per-listing insights (by city, URL, or ID) |
💡 Tip: Run this search Actor for a city, then paste the
urlvalues into the Airbnb Listing Details Scraper for full descriptions, amenities, and host profiles.
Changelog
- v0.0.1 — Initial release. City search via Airbnb GraphQL SSR interception, pagination via
pageCursors, residential proxy, all search fields, null-safe schema, n8n webhook, CSV/JSON/Excel export.