Airbnb Scraper — Listings, Prices & Host Details avatar

Airbnb Scraper — Listings, Prices & Host Details

Pricing

from $0.50 / 1,000 listing scrapeds

Go to Apify Store
Airbnb Scraper — Listings, Prices & Host Details

Airbnb Scraper — Listings, Prices & Host Details

Airbnb scraper: listings by city or URL with nightly and total price, rating, reviews, coordinates, photos and host. $0.50 per 1,000.

Pricing

from $0.50 / 1,000 listing scrapeds

Rating

0.0

(0)

Developer

Mohammed Samaan

Mohammed Samaan

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

12 days ago

Last modified

Share

Airbnb Listings Scraper

Search Airbnb by city or by search URL and get back every listing — price, rating, review count, coordinates and photos — with an optional switch to enrich each one with its full detail page. No browser: it reads the JSON payload Airbnb's own front-end renders, so it's fast and cheap to run.

Who it's for

  • Short-term-rental investors comparing nightly rates and occupancy signals across a city before buying
  • Property managers and dynamic-pricing tools tracking competitor rates
  • Market researchers mapping supply by property type, bedroom count and price

What you get

FieldWhat it is
id / urlListing ID and link
name / titleListing title
propertyType / roomTypeEntire home, private room, etc. (detail)
city / lat / lngLocation
pricePerNight / priceTotal / originalPrice / currencyPricing
rating / reviewsCountOverall rating and review count
ratingBreakdownPer-category rating (detail)
isSuperhost / hostId / hostNameHost info (detail)
bedrooms / beds / bathrooms / maxGuestsSpace (search + detail)
amenities / houseRulesFull lists (detail)
imagesPhoto URLs — a few from search, all from detail
description / highlightsListing text (detail)
badgese.g. Superhost, Guest favorite (search)
checkIn / checkOut / scrapedAtDates the price applies to, timestamp

Detail-only fields are null until includeDetails is on.

Example output

A real row from a search run on "Dubai" (28 Sep 2026, includeDetails off; images shortened from 29 URLs to 3). Fields marked "(detail)" above are null or missing here because no detail page was fetched, and detailsFetched is false:

{
"id": "1513636006086015714",
"url": "https://www.airbnb.com/rooms/1513636006086015714",
"name": "Large Elegant Space| Burj Views | Near Dubai Mall",
"title": "Apartment in Dubai",
"roomType": null,
"propertyType": "Apartment",
"city": "Dubai",
"lat": 25.1945,
"lng": 55.2719,
"pricePerNight": 588.6,
"priceTotal": 2943,
"priceLabel": "$2,943",
"originalPrice": null,
"currency": "USD",
"rating": 4.97,
"reviewsCount": 32,
"isSuperhost": null,
"hostId": null,
"hostName": null,
"bedrooms": 4,
"beds": 6,
"bathrooms": 3.5,
"maxGuests": null,
"amenities": null,
"images": [
"https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/70fb869d-52c5-4d42-9605-cf5d5996dabd.jpeg",
"https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/6a21906c-cb4e-49d9-aea7-65a63ed05c24.jpeg",
"https://a0.muscache.com/im/pictures/hosting/Hosting-U3RheVN1cHBseUxpc3Rpbmc6MTUxMzYzNjAwNjA4NjAxNTcxNA==/original/fa2048aa-3f9e-4974-b671-346bdaf2ecf7.jpeg"
],
"description": null,
"houseRules": null,
"cancellationPolicy": null,
"instantBook": null,
"badges": ["Guest favorite"],
"checkIn": "2026-10-07",
"checkOut": "2026-10-12",
"detailsFetched": false,
"scrapedAt": "2026-09-28T16:04:39.672Z"
}

Input

{
"locationQueries": ["Dubai"],
"maxListingsPerQuery": 200,
"currency": "USD",
"includeDetails": false
}

Or paste an Airbnb search URL directly in startUrls to keep its filters. currency matters — Airbnb otherwise guesses it from your proxy's country, which mixes currencies across rows if you don't set it. Turn on includeDetails to fetch each listing's full detail page (billed separately). Airbnb caps a single search at roughly 270 results; splitByPriceBands (on by default) automatically re-runs a saturated search across price bands to go deeper.

Pricing

$0.50 per 1,000 listings scraped, plus $2 per 1,000 listing details when includeDetails is on and a listing's detail page was actually fetched. 1,000 listings with full details costs $2.50.

How it compares

No browser means no Chromium to boot and no per-second compute charge — just HTTP requests reading the same JSON payload Airbnb's page already loads. That keeps a plain listing scrape cheap; detail enrichment costs more because it's one extra request per listing, priced separately so you only pay for it when you ask for it.

Use with n8n / Make / Zapier

Add an Apify integration node, run this actor with your locations or URLs, then read the finished dataset back into your workflow — the stable id and url per listing make it easy to join against a pricing or alerting flow.

Errors and limits

  • No input: with no locationQueries and no startUrls the run logs a warning, writes a SUMMARY record with listings: 0 and finishes without fetching anything.
  • Empty results: a search that returns no cards, or a 404/410 page, simply produces no rows for that query. The run still finishes and the dataset can be empty.
  • Blocked, throttled or erroring (429, 5xx, other 4xx, timeouts): each request has a 45-second timeout and is retried with exponential backoff (about 1, 2, 4, 8 s plus jitter) up to maxRetries times (default 4, max 8). If a search page still fails, or Airbnb returns a page with no search results in it (the log shows the page title), that query is logged as failed and the run continues with the next query. A run where every query fails therefore ends with an empty dataset, not a run failure, so check the log and SUMMARY.
  • Partial results: if the price-band deepening for a query fails on one band, the rows already collected for that query are kept.
  • Detail pages: a detail page that fails or cannot be parsed leaves that listing as a search-only row (detailsFetched stays false) and is counted in detailsFailed in SUMMARY. A listing whose detail page returns 404 or 410 is also left as a search-only row.
  • Search ceiling: Airbnb returns at most about 270 results per search. With splitByPriceBands on, a saturated search is re-run in price bands to go deeper, and duplicates across bands and queries are dropped before anything is written or charged.
  • Cost behaviour: listing-scraped is charged once per row written, and listing-detail once per row whose detail page was actually fetched. Failed requests, retries, skipped rows and duplicates are not charged. If your max-charge cap is reached the run stops writing and keeps what it already wrote.

FAQ

Does it need a login or cookies? No — everything comes from public pages.

Does it use a browser? No — plain HTTP requests against Airbnb's own server-rendered JSON payload.

Can I get every listing in a big city? Turn on splitByPriceBands and raise maxListingsPerQuery; for exhaustive coverage, feed one startUrl per neighbourhood or map area.

Why are cancellationPolicy and instantBook usually null? Airbnb only exposes those inside its booking flow, not on the listing page, so the actor doesn't fabricate values for them.

Are reviews included? Not the review text — it lives behind a request whose query hash Airbnb rotates per release, so it isn't included in this version rather than ship something that breaks silently.

What if Airbnb blocks the run? If it serves a block page, the run logs the page's title so you can see what came back instead of a silent empty dataset. Use RESIDENTIAL proxy for larger runs.

Use it from an AI agent (MCP)

Add this Actor to any MCP client (Claude, Cursor, VS Code) with one URL:

https://mcp.apify.com?tools=leadharbor/airbnb-listings-scraper

Or call it through the Apify API with an input like this:

{
"locationQueries": [
"Dubai"
],
"maxListingsPerQuery": 100
}

Returns one row per Airbnb listing: price, rating, reviews, coordinates, photos and host. Results land in the run's default dataset (JSON, CSV or Excel). No login or API key is needed for the sites it reads, and pay-per-event pricing works with Apify's x402 agent payments.

API usage

Run it from your own code with an Apify API token. The input below is this actor's prefilled example.

curl (runs the actor and returns the dataset items):

curl -X POST "https://api.apify.com/v2/acts/leadharbor~airbnb-listings-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"locationQueries": [
"Dubai",
"Muscat, Oman"
]
}'

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("leadharbor/airbnb-listings-scraper").call(run_input={
"locationQueries": [
"Dubai",
"Muscat, Oman"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Changelog

28 Sep 2026 — Fixed: Airbnb geo-redirect pages returned 0 listings; buyer max-charge cap now stops the run; MCP agent section. Plus 5 public example tasks with their own pages.

More from leadharbor


Using this actor? A quick review helps other buyers find it: airbnb-listings-scraper