Airbnb Search Scraper — Listings & Prices by City avatar

Airbnb Search Scraper — Listings & Prices by City

Pricing

from $1.80 / 1,000 results

Go to Apify Store
Airbnb Search Scraper — Listings & Prices by City

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

Malik Mazhar Ali

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

  1. Open the Actor — City / Location is already prefilled with Austin, TX.
  2. Change the city to wherever you want to search.
  3. Set Max results (default: 50).
  4. Click Start — get a table of listings with price, rating, and GPS coordinates.

That's it. No URL building, no complex configuration.


Input reference

FieldKeyTypeDescription
City / LocationlocationtextJust type a city — Austin, TX, Lisbon, Portugal, Tokyo, Japan. Builds the Airbnb URL automatically. Default prefill: Austin, TX.
Check-in datecheckIntextYYYY-MM-DD. Optional — affects prices and availability filter.
Check-out datecheckOuttextYYYY-MM-DD. Use with Check-in for accurate nightly + total pricing.
CurrencycurrencytextUSD (default), EUR, GBP, etc.
AdultsadultsintegerNumber of adult guests (1–16).
ChildrenchildrenintegerNumber of children (0–5).
InfantsinfantsintegerNumber of infants (0–5).
PetspetsintegerNumber of pets (0–5).
Min price per nightpriceMinintegerMinimum nightly price in selected currency.
Max price per nightpriceMaxintegerMaximum nightly price in selected currency.
Min bedroomsminBedroomsintegerMinimum number of bedrooms (0–10).
Min bedsminBedsintegerMinimum number of beds (0–10).
Min bathroomsminBathroomsintegerMinimum number of bathrooms (0–10).
Property typepropertyTypeselectAny, Entire home/apt, Private room, Hotel room, Shared room.
Max resultsmaxResultsintegerMax listings to return (default: 50, max: 1000).
Advanced: paste Airbnb search URLssearchUrlslistPower users: paste any https://www.airbnb.com/s/.../homes URL directly (overrides Location + filters).
Webhook URLwebhookUrltextOptional n8n / Make / HTTP endpoint — results are POSTed here when the run finishes.
ProxyproxyConfigurationproxyDefault: 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 presentnull 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

FieldTypeNotes
listingIdstringAirbnb listing ID (numeric string).
namestringListing title.
urlstringFull https://www.airbnb.com/rooms/<id> URL.
roomTypestringe.g. Home, Private room in home. Parsed from Airbnb's listing title. null when absent.
propertyTypestringSame as roomType in search results (full property type available in the companion Listing Details actor).
listingTypestringAirbnb internal typename, e.g. StaySearchResult.
personCapacityintegerMax guest capacity. null — not exposed in search results.
bedroomsintegerNumber of bedrooms. null when not shown in search card.
bedsintegerNumber of beds. null when not shown.
bathroomsnumberNumber of bathrooms (may be fractional, e.g. 1.5). null when not shown.
pricePerNightnumberNightly price in currency. null when no dates provided.
priceTotalnumberTotal price for all nights. null when no dates provided.
nightsintegerNumber of nights derived from checkIn/checkOut. null when no dates.
currencystringISO currency code, e.g. USD.
priceQualifierstringAirbnb's price label, e.g. "for 5 nights". null when absent.
ratingnumberAverage rating 0–5, e.g. 4.92. null for new listings.
reviewsCountintegerTotal number of reviews. null for new listings.
isSuperhostbooleantrue if the host has Superhost status. null when badge absent.
isGuestFavoritebooleantrue if marked Guest Favorite by Airbnb. null when absent.
addressstringShort location text from Airbnb card, e.g. "Home in Travis Heights".
citystringThe search location you provided.
coordinatesobject{ lat, lng } — GPS coordinates. Both null when unavailable.
amenitiesarrayAmenity strings. [] in search results — full list in the companion Listing Details actor.
imagesarrayImage URLs (up to 20). [] when unavailable.
descriptionstringListing description. null in search results — available in the companion Listing Details actor.
houseRulesarrayHouse rules. [] in search results.
hostobject{ id, name, isSuperhost, profileUrl } — each field null when absent in search.
badgesarrayBadge text strings, e.g. ["Superhost"]. [] when none.
searchLocationstringThe location input value used for this run.
checkInstringCheck-in date as passed in input. null if not set.
checkOutstringCheck-out date as passed in input. null if not set.
extractionPathstringAlways ssr-deferred-state for search results.
partialbooleanAlways true in search mode — full detail available via the companion Listing Details actor.
scraperVersionstringActor version used.
scrapedAtstringISO 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 run
curl -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:

ChargePriceWhen
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, ST format 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 checkIn and checkOut dates (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:

ActorStatusWhat it does
Airbnb Search Scraper (this Actor)LiveFast city search — listings, prices, ratings, coordinates
Airbnb Listing Details ScraperLiveFull property page — description, all amenities, sleeping arrangement, house rules, host profile, photos
Airbnb Revenue & Occupancy CalculatorLiveAirDNA-style estimates — occupancy rate, ADR, annual revenue, RevPAR
Airbnb Reviews ScraperLiveReviews + sentiment + per-listing insights (by city, URL, or ID)

💡 Tip: Run this search Actor for a city, then paste the url values 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.