Airbnb Scraper (Proxy Included) + Prices & Ratings avatar

Airbnb Scraper (Proxy Included) + Prices & Ratings

Pricing

from $0.10 / 1,000 listing results

Go to Apify Store
Airbnb Scraper (Proxy Included) + Prices & Ratings

Airbnb Scraper (Proxy Included) + Prices & Ratings

$0.2/1K listings | Extract Airbnb listings in bulk for any city or map area: price, rating, review count, room type, beds and coordinates, with date, guest and price filters. Residential proxy included, no login. Not affiliated with Airbnb.

Pricing

from $0.10 / 1,000 listing results

Rating

0.0

(0)

Developer

Nomad.Devs

Nomad.Devs

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

5

Monthly active users

3 days ago

Last modified

Share

Airbnb Scraper (No Login) + Prices & Ratings

$0.2/1K listings | Extract Airbnb listings in bulk for any city or map area: price, rating, review count, room type, beds and coordinates, with date, guest and price filters. Residential proxy included, no login. Not affiliated with Airbnb.

Airbnb Listings Bulk Scraper

Our scraper collects Airbnb listings for a named location or a map area and lets you filter by dates, guests, nightly price, room type and minimum bedrooms, beds or bathrooms. Every row is one flat record with price, rating, review count, room type, bed counts and coordinates. It is ideal for short-term-rental market research, competitive sets for property managers and pricing or investment models.

Key Benefits

  • No login: it reads only what a logged-out visitor sees, so there is no Airbnb account to connect or put at risk.
  • Low pricing: $0.20 per 1,000 listings, with lower rates on Scale and Business plans ($0.15 and $0.1 per 1,000), plus a $0.00005 start fee per run. Residential proxy traffic is included, so there is no separate proxy bill.
  • Quick to try: a 10-listing test run finished in about 8 seconds. πŸš€
  • Past the result ceiling: Airbnb serves about 270 results per query, so the Actor splits the price range into sub-searches (up to maxPriceSplits times) to reach your maxItems.
  • Optional depth: detail mode adds host, amenities, an availability calendar and guest reviews.

How It Works

  1. Choose the mode. search (the default) lists a location or map area; detail resolves specific listing URLs or ids. Both bill the same per listing returned.
  2. Provide your search:
    • (required in search mode) location (e.g., Lisbon, Portugal), or latitude and longitude for a map area.
    • (optional) checkIn and checkOut (e.g., 2026-09-23). With both set, prices are stay totals for those dates.
    • (optional) priceMin and priceMax per night, adults, children, roomType (e.g., entire_home).
    • (optional) minBedrooms, minBeds, minBathrooms. 0 means no filter.
    • (detail mode) listingUrls, plus calendarMonths (0 to 12) and includeReviews for the extras.
  3. Click Start. The form opens with Lisbon, Portugal and 20 listings, so a first run returns real rows.

Run the same search again and you get only listings you have not received yet; set dedupe.enabled to false to see everything again.

More settings:

  • maxItems - Hard cap on listings returned. Default is 100.
  • currency - ISO code for returned prices. Default is USD.
  • maxReviewsPerListing - Reviews fetched per listing when includeReviews is on. Default is 10.
  • maxPriceSplits - How many times a search may split its price range. Default is 8; lower it to cap cost in dense markets.
  • concurrency - Parallel fetches in detail mode. Default is 2; keep it low, Airbnb rate-limits hard.

Search rows carry the card fields only. In our test run, hostName, amenitiesCount and description were empty on all 10 search rows; use detail mode when you need them.

With dates set, prices are stay totals, and pricePer says which kind you got (for example for 5 nights). Divide by the number of nights for a nightly rate.

The calendar and review fetches use internal Airbnb endpoints and are not always available. If Airbnb changes them, the field comes back null for that run and the rest of each record is unaffected.

If Airbnb blocks a run, the Actor stops cleanly and keeps the listings it already collected. Lower concurrency to 1 and retry.

Data You'll Receive

  • Listing: id, URL, title, property type, room type, photo count and thumbnail.
  • Price: numeric price, currency and the qualifier (total, night or for N nights).
  • Reputation: rating and review count.
  • Space: beds, bedrooms and baths where Airbnb shows them.
  • Location: latitude and longitude.
  • Detail mode only: host first name, amenity count, guest capacity, Superhost flag, full description, availability calendar and reviews.

Sample output data

Here is an example listing from a search-mode test run of this Actor:

{
"id": "7743405",
"url": "https://www.airbnb.com/rooms/7743405",
"title": "Newly renovated in the heart of Chiado, with a private balcony and A/C",
"propertyType": "Apartment in Lisbon",
"price": 2023,
"currency": "USD",
"pricePer": "for 5 nights",
"rating": 4.99,
"reviewsCount": 502,
"roomType": "Entire home/apt",
"beds": 4,
"bedrooms": 3,
"baths": 2,
"lat": 38.7107,
"lng": -9.1442,
"hostName": null,
"thumbnail": "https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6Nzc0MzQwNQ==/original/ee38447f-2efa-4f82-9a67-bb2b30b23a66.jpeg",
"imagesCount": 6,
"amenitiesCount": null,
"description": null,
"calendar": null,
"reviews": null,
"mode": "search"
}

Airbnb Listings API

Results are stored in a dataset that you can export as CSV, JSON or Excel, or read through the Apify API. Connect it to Make, n8n or Zapier, or let an agent call it through the Apify MCP server.

Support and Feedback

We improve these scrapers from your feedback. If something breaks or you need a filter:

  • Open an issue on the Actor's Issues tab.
  • If this Actor saved you time, a short review on the Store helps other people find it.

Run evidence

Start with one input and output

An Apify account is required. Use your Apify API token when calling the API; Console runs do not need that token pasted into the input. No user API-key field is required by this input schema.

Free-tier event rates checked 2026-10-04: result $0.0002; actor-start $0.00005.

Cost: Total = Actor event charges + platform usage if separately billed + any BYO-provider charges. See β€œCurrent costs” for your event rates, plan tiers and a calculation. A sample does not promise future billable volume.

Input and output below were read from the same successful run VaBJw4FKrs3lJzSfF (2026-10-04, immutable build cOrfvuy3Jc6uK5xVs). This is an observed example, not a guarantee that repeating it returns this row.

Input JSON

{
"mode": "search",
"maxLocationDeviation": 0.05,
"priceMin": 0,
"priceMax": 0,
"adults": 0,
"children": 0,
"roomType": "any",
"minBedrooms": 0,
"minBeds": 0,
"minBathrooms": 0,
"calendarMonths": 0,
"includeReviews": false,
"maxReviewsPerListing": 10,
"maxItems": 100,
"currency": "USD",
"concurrency": 2,
"maxPriceSplits": 8
}

Matching output excerpt

Long strings and arrays are shortened for display; this is not a complete dataset fixture.

{
"id": "1550967010992579703",
"url": "https://www.airbnb.com/rooms/1550967010992579703",
"title": "Lofty ceilings with a Tagus River view",
"propertyType": "Apartment in SΓ£o Paulo",
"price": 1201,
"currency": "USD",
"pricePer": "for 5 nights",
"rating": 4.98,
"reviewsCount": 61,
"roomType": "Entire home/apt",
"beds": 3,
"bedrooms": 2,
"baths": 2,
"lat": 38.7069,
"lng": -9.1422,
"hostName": null,
"thumbnail": "https://a0.muscache.com/im/pictures/hosting/Hosting-1550967010992579703/original/c172a896-3844-4c36-a2b2-c87d8633a18c.png",
"imagesCount": 17,
"amenitiesCount": null,
"description": null,
"calendar": null,
"reviews": null,
"mode": "search"
}

Scrape Airbnb listings into clean, structured JSON β€” search any location (or a lat/lng map area) with dates, guests, price, room-type and bedroom/bed filters, or resolve listing URLs to full detail records (optionally including an availability calendar and per-listing reviews). Built for reliability: automatic price-range splitting gets past Airbnb's ~270-result cap, blocks are classified and logged (never crash a run), and every record comes back in one flat, predictable shape.

Claude / Codex skill to describe and setup this actor: SKILL.md

What Airbnb data does this scraper extract?

One flat JSON record per listing:

FieldMeaning
idAirbnb listing id
urlDirect airbnb.com/rooms/... link
titleListing name
propertyTypee.g. "Entire rental unit", "Apartment in Lisbon"
price / currency / pricePerNumeric price, ISO currency, qualifier (total / night)
rating / reviewsCountGuest rating and review count
roomTypeEntire home/apt, Private room, Shared room, Hotel room
beds / bedrooms / bathsWhere Airbnb exposes them
lat / lngListing coordinates
hostNameHost first name (detail mode)
thumbnailURL of the primary photo, where exposed
imagesCountNumber of photos
amenitiesCountNumber of amenities (detail mode)
personCapacity / isSuperhost / descriptionDetail mode extras
calendar[{month, year, availableDays}, ...] β€” only populated when calendarMonths > 0 (detail mode); otherwise null
reviews[{id, author, date, rating, language, text, response}, ...] β€” only populated when includeReviews is on (detail mode); otherwise null
modesearch or detail

Input

NameTypeDefaultDescription
modestring (search | detail)"search"Search a location, or resolve specific listing URLs/ids to full detail records.
locationstringβ€”Where to search, as typed on airbnb.com (e.g. "Lisbon, Portugal"). Required in search mode unless you use latitude/longitude.
latitude / longitudenumberβ€”Search mode. Centre of a coordinate/map search that bypasses named-location geocoding. Set both; location then becomes optional. Best-effort.
maxLocationDeviationnumber0.05Search mode. Half-width in degrees of the map box around latitude/longitude (~0.05Β° β‰ˆ 5.5 km).
listingUrlsarray of stringsβ€”Listing URLs or bare numeric ids. Required in detail mode.
checkIn / checkOutstring (YYYY-MM-DD)β€”Optional dates. With both set, prices become stay totals.
priceMin / priceMaxinteger0Nightly price filter bounds. 0 = no bound.
adults / childreninteger0Guest counts.
roomTypestring (enum)"any"any, entire_home, private_room, shared_room, hotel_room.
minBedroomsinteger0Only listings with at least this many bedrooms. 0 = no filter.
minBedsinteger0Only listings with at least this many beds. 0 = no filter.
minBathroomsinteger0Only listings with at least this many bathrooms. 0 = no filter.
calendarMonthsinteger0Detail mode only. Fetch this many months (0–12) of availability into the calendar output field. 0 = skip. Best-effort (see Known limitations).
includeReviewsbooleanfalseDetail mode only. Also fetch per-listing guest reviews into the reviews output field. Best-effort, cost-bounded by maxReviewsPerListing.
maxReviewsPerListinginteger10Cap on reviews fetched per listing when includeReviews is on (paged 50 at a time).
maxItemsinteger100Hard cap on listings returned.
currencystring"USD"ISO currency code for returned prices.
concurrency (Advanced)integer2Parallel listing fetches in detail mode. Values above 4 (up to 8) are an aggressive opt-in β€” faster but more blocks. Keep low β€” Airbnb rate-limits aggressively.
maxPriceSplits (Advanced)integer8How many times a search may auto-split its price range past the ~270-result cap. Lower it to cap cost on dense markets.
proxyConfigurationobjectApify ResidentialProxy group. Residential is strongly recommended (its traffic is included in the per-event prices β€” see Pricing below).

How to scrape Airbnb listings with this Actor

Search mode β€” set location (e.g. "Lisbon, Portugal"), optionally checkIn/checkOut, priceMin/priceMax (per night), adults, roomType, minBedrooms/minBeds/minBathrooms and maxItems. Instead of a named location, you can search a map area by setting latitude/longitude (with an optional maxLocationDeviation radius in degrees) β€” handy for programmatic, gridded market scans. With dates set, prices are stay totals for those dates. When a query hits Airbnb's ~270-result ceiling, the Actor automatically splits the price range into sub-ranges (up to maxPriceSplits times) and searches each β€” so large markets still come back complete up to your maxItems.

Detail mode β€” set mode to detail and pass listingUrls (full URLs or bare numeric ids). Each listing resolves to a full record including coordinates, per-category ratings source, host, photo and amenity counts, and a complete plain-text description. If the detail API omits its description section, the Actor falls back to the public page's canonical listing description. Set calendarMonths for a month-by-month availability summary; turn on includeReviews to also pull up to maxReviewsPerListing guest reviews per listing into the reviews field.

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-agent/airbnb-scraper").call(run_input={
"mode": "search",
"location": "Lisbon, Portugal",
"checkIn": "2026-09-23",
"checkOut": "2026-09-28",
"priceMax": 150,
"maxItems": 200,
"proxyConfiguration": {"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"]},
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["price"], item["currency"], "|", item["title"], item["url"])
curl -X POST \
"https://api.apify.com/v2/acts/nomad-agent~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode": "detail", "listingUrls": ["https://www.airbnb.com/rooms/796929"]}'

Output example

Real push_data shape (detail mode, live-fetched 2026-07 β€” the example description is abbreviated here for readability; emitted detail records retain the complete source body):

{
"id": "796929",
"url": "https://www.airbnb.com/rooms/796929",
"title": "Rental unit in Lisbon",
"propertyType": "Entire rental unit",
"price": 465.0,
"currency": "EUR",
"pricePer": "total",
"rating": 4.92,
"reviewsCount": 463,
"roomType": "Entire home/apt",
"beds": 2.0,
"bedrooms": 1.0,
"baths": 1.0,
"lat": 38.71991,
"lng": -9.13289,
"hostName": "Bruno",
"imagesCount": 44,
"amenitiesCount": 63,
"personCapacity": 4,
"isSuperhost": true,
"description": "A very cool flat in a great location! ...",
"calendar": null,
"mode": "detail"
}

With calendarMonths set (e.g. 2), calendar is populated instead of null:

{
"calendar": [
{"month": 7, "year": 2026, "availableDays": 2},
{"month": 8, "year": 2026, "availableDays": 8}
]
}

With includeReviews on, reviews is populated (each up to maxReviewsPerListing):

{
"reviews": [
{"id": "1234567890", "author": "Ana", "date": "May 2026", "rating": 5,
"language": "en", "text": "Great location, spotless flat.", "response": null}
]
}

Pricing

Pay per event β€” you pay per listing returned, search results and detail records alike. Current rates are on this Actor's Pricing tab. No subscription β€” pay only for what you fetch.

Platform usage is included. Compute, storage, and proxy traffic β€” including the default Residential proxy (

{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
) β€” are covered by the per-event prices. You are never billed separately for this Actor's platform usage.

Integrations

Dataset results export straight to JSON, CSV, Excel/XLSX, or a plain HTML table from the Apify Console. Pull them into Make, Zapier or n8n via Apify's native integrations, call run-sync-get-dataset-items from any HTTP client (see the curl example above), or use the Apify MCP server to let an LLM agent drive this Actor and read results directly.

Why this Actor?

Airbnb scrapers are notorious for flaky runs and messy nested output. This one is built around three choices: (1) it reads the same structured payloads Airbnb's own site renders from, not brittle HTML selectors; (2) every record is one flat object with stable field names β€” no digging through sections[12].section.cardData; (3) blocks and rate limits are detected and reported with the partial results you already paid for, instead of a crashed run.

Anti-blocking notes

Airbnb aggressively blocks datacenter and shared IPs. Residential proxies are strongly recommended β€” set proxyConfiguration to Apify residential (the default prefill). The Actor uses a fixed browser User-Agent, randomized 1–2.5 s delays between requests, and low concurrency (default 2; up to 8 as an aggressive opt-in). A 403/429/challenge response stops the run gracefully and keeps everything collected so far.

Use cases

  • Market and pricing research for short-term rentals (STR analytics)
  • Competitive sets for property managers and revenue managers
  • Feeding availability/pricing data into investment models
  • Monitoring specific listings (price, rating, review count over time)

FAQ

Is it legal to scrape Airbnb? The Actor only reads publicly visible listing data β€” the same data any logged-out visitor sees. Review Airbnb's terms and your local regulations for your use case; you are responsible for how you use the data.

Why do I get fewer results than Airbnb claims exist? Airbnb itself only serves ~15 pages (~270 listings) per query. The Actor splits price ranges to go past that; extremely dense markets may still need narrower filters (dates, room type).

Why are prices totals, not per night? With checkIn/checkOut set (or when Airbnb picks default dates), listing cards show stay totals β€” pricePer tells you which one you got. Divide by nights for a nightly rate.

The run says "blocked" β€” what now? Switch to residential proxies, lower concurrency to 1, and retry. Partial results are kept.

Can I filter by property type (house, apartment, guesthouse, ...) instead of room type? Not currently. roomType (entire home / private room / shared room / hotel room) is a confirmed, documented-by-reverse-engineering raw filter on Airbnb's search page. A separate "property type" facet (house vs. apartment vs. guesthouse) does not have a similarly discoverable raw query param on the public search page β€” Airbnb only exposes that facet through its interactive UI, not a stable URL param we could verify. propertyType is still returned per-listing in the output (e.g. "Entire rental unit") β€” it just isn't a request-side filter.

How reliable is calendarMonths? It replays an internal, unauthenticated Airbnb GraphQL persisted query (PdpAvailabilityCalendar) using a known-good operation hash β€” live-verified working as of 2026-07. Unlike the amenities count (whose operation hash is rediscovered from a JS bundle on every run), this hash is not currently re-discoverable at runtime from any bundle we could find referenced by the listing page, so it's a static snapshot. If Airbnb ever rotates it, calendar fetches fail closed (best-effort β€” the rest of the record is unaffected) and calendar comes back null for that run until the Actor is updated.

How reliable are reviews? Same best-effort footing as calendarMonths: reviews come from an internal, unauthenticated Airbnb GraphQL persisted query using a known-good operation hash. If Airbnb rotates that hash the review fetch fails closed (reviews comes back null for that run) β€” the rest of each record is unaffected, and the run still succeeds. Reviews are opt-in (includeReviews) and capped by maxReviewsPerListing to keep runs cost-bounded.

Something broken or missing? Open an issue on the Actor's Issues tab β€” it is monitored and fixes ship fast.

Attribution

See NOTICE. Price-range-splitting pagination strategy inspired by digital-engineering/airbnb-scraper (GPL-3.0) β€” algorithm inspiration only, no code copied, translated or derived. All code in this Actor was written from scratch against Airbnb's current site (2026) and is MIT-licensed.

Fast setup and source code

Public repository Β· Agent setup skill.

Use the Actor’s current input form for filters, or start with its documented API example. Select the latest build. Read the dataset together with the run summary: a successful status alone does not show that every source was reached.

Restrictive filters or repeat-delivery suppression can produce zero results.

Current costs

Current Actor event rates, checked 2026-10-16. USD; use the Pricing tab for your plan and later changes.

EventFreeBronzeSilverGoldPlatinumDiamond
Listing result (result)$0.0002$0.0002$0.00015$0.0001$0.0001$0.0001
Actor start (actor-start)$0.00005$0.00005$0.00005$0.00005$0.00005$0.00005

For example, 100 Γ— result, 1 Γ— actor-start totals $0.02005 in Actor event charges on Free. This is an arithmetic example, before any waiver; actual charged events depend on the run and selected options. It is not a promise of output or a charge for simply setting an item cap.

Your total is the charged Actor events, plus platform usage only if this Actor’s Pricing tab bills it separately, plus any external provider you use with your own key. Do not add platform usage twice when it is included. Apify credits and plan discounts affect your invoice. Set a run cost limit in Console before starting.


Independent tool. We built and run this Actor ourselves. Airbnb does not operate, sponsor or endorse it, and its name is used only to say which service the data comes from.