Airbnb Scraper: Listings, Prices, Fees, Calendar & Reviews avatar

Airbnb Scraper: Listings, Prices, Fees, Calendar & Reviews

Pricing

from $0.25 / 1,000 search results

Go to Apify Store
Airbnb Scraper: Listings, Prices, Fees, Calendar & Reviews

Airbnb Scraper: Listings, Prices, Fees, Calendar & Reviews

Scrape Airbnb listings by location, map area, search URL or listing URL. Exact stay prices as numbers with breakdown, host ratings, permit numbers, availability calendar, occupancy estimates and reviews.

Pricing

from $0.25 / 1,000 search results

Rating

0.0

(0)

Developer

The Last Scraper

The Last Scraper

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

2

Monthly active users

18 hours ago

Last modified

Share

Airbnb Scraper: Listings, Prices, Fees, Calendar & Reviews

Scrape Airbnb listings for any city, neighborhood, map area, search URL or listing URL, and get exact stay prices as numbers (nightly rate, subtotal, discounts, total, per night, and whether cleaning and service fees are included), full listing details, host ratings, registration / permit numbers, an optional availability calendar with occupancy estimates and guest reviews: all in one run, with no login and no browser.

  • Three questions, no manual. Where (a neighborhood, a city, an Airbnb URL or listing IDs), when (or leave it empty: automatic dates so there is always a price) and how much detail, from a free estimate to everything. Pay only for the level you pick.
  • Know the cost before you pay. The free Estimate level counts the listings in your area in seconds and tells you what each level would cost, before you pay anything.
  • The whole market of an area in one run. Search results, listing pages, 12-month calendar with occupancy, and every review, for a few dollars: Dubai Marina, the 635 two-bedroom apartments free on our test dates, with calendar and 8,925 reviews, costs $6.69 on the Free plan ($3.15 on Gold), plus $0.50 if you keep the market report on, versus ~$750 combining the other Airbnb Actors.
  • Every listing, not only the free ones. An Airbnb search with dates only shows the homes still free on those nights, so the busiest homes, already booked, are missing and the area looks emptier than it is. From Details up the Actor finds every active listing with a search without dates and then quotes each one for your dates: booked homes come with price.is_available: false and no price, and their calendar and reviews still count.
  • Spreadsheet-ready by default. One flat row per listing with 98 curated columns in a useful order: the listing link first, listing_id as text (long ids survive), prices as numbers, key amenities as true/false, estimates marked est_. Download as Excel, CSV or JSON. Developers can switch Output format to Full JSON for the complete nested record.
  • Prices you can put in a spreadsheet. total, price_per_night, nightly_rate, discounts_total and an ISO currency (in Full JSON: price.total, price.price_per_night...), never "$1,234" text. Every line Airbnb shows is kept and typed, and fees_included_in_rate tells you that cleaning and service fees are inside the nightly rate (how Airbnb shows prices today).
  • The same price meaning on every run and every row. Airbnb shows totals with taxes to visitors from the EU and before taxes to everyone else, so the same listing can look like two prices. The Actor always asks as a visitor from the US, and total is before taxes on every row, comparable from one run to the next. Even to US visitors Airbnb itemizes the taxes of some listings (about 15 % of the Dubai quotes in our runs): that amount goes to the taxes column and stays out of total (total + taxes = what the guest pays). Want the taxes of every listing? Set Proxy strategy: Residential only and Proxy country to an EU country: the taxes column fills in. In Full JSON, price.total is Airbnb's Total line as shown (with the taxes it itemized) and price.total_before_taxes is always before taxes.
  • No 270-result cap. Airbnb never shows more than ~270 results for one search. The Actor counts the listings in the map area and splits it into smaller areas until each part is under the cap, then removes duplicates. The run summary shows how many listings Airbnb announced and how many were collected.
  • Same area every run. Locations are resolved with OpenStreetMap boundaries (Airbnb's own map area changes from one request to the next), so scheduled runs are comparable.
  • Compliance data. The registration or permit number shown on the listing (e.g. Dubai DET/DTCM holiday home permits) as its own field, with a format check and duplicates across listings.
  • Honest estimates. Occupancy, revenue and cleaning fee are labeled as estimates, each with its method, assumptions and a confidence level.

What data can I get from Airbnb?

GroupFields
ListingID, URL, app links (iOS and Android), title, description (text and HTML), property type, type of place, guests, bedrooms, beds, bathrooms, sleeping arrangements; optionally title, description, amenities and house rules in one of Airbnb's 66 languages
LocationCoordinates (Airbnb blurs most of them, flagged by coordinates_exact), neighborhood, city, country, area text, inside-the-searched-area flag
Price (with dates)Nightly rate, subtotal, discounts, total (before taxes: see above), original (struck-through) total, per night, per guest and per bedroom, typed line items, fees-included flag; for your adults, children, infants and pets; why a listing cannot be booked for your dates ("Minimum stay is 3 nights")
RatingsOverall rating, review count, the six category ratings, Guest favorite, review tags
HostSuperhost, verified, host rating, host's total reviews, years hosting, response rate and time, co-hosts, languages, "lives in", work and business label (when the listing page shows them), professional-host signals, and from the host's profile the total number of listings on Airbnb (free) or the whole profile: years on Airbnb, sign-up month, verifications (names and photos can be omitted)
RulesCheck-in and check-out times, max guests, pets, smoking, events, min/max nights (from Revenue up: they come with the calendar), instant book, cancellation policy
AmenitiesEvery amenity with a stable key and its group, plus a boolean map of key amenities (pool, parking, kitchen, washer...)
PhotosPhoto URLs with room and caption: the whole gallery or a quick preview (Photos), never image files
ComplianceRegistration / permit / license number, jurisdiction, format check, listings sharing the same number (annotations dataset or Delivery: end)
Calendar (Revenue, Everything)Summary per listing: available/unavailable days for the next 30/60/90 days (and 365 with Everything), next available date. With Daily calendar rows, per day: available, check-in allowed, check-out allowed, bookable, minimum and maximum nights
Reviews (Everything)Text, original text and language, translation flag, date, stars, reviewer tenure, stay type, host response. Summary per listing: reviews per month, last 12 months, languages, host response rate
EstimatesADR, occupancy (calendar and reviews methods, kept apart), monthly and annual revenue, RevPAR, cleaning fee (optional), Dubai tax breakdown (only with totals with taxes, from an EU proxy country), price and rating vs. the other listings of the run

How do I scrape Airbnb listings?

  1. Click Try for free.
  2. Where? Type one or more places (Dubai Marina, Dubai), paste Airbnb search URLs or listing URLs, or listing IDs, one per line, in the same box. The Actor detects which is which.
  3. When and who? Pick check-in and check-out dates and the guests (adults, children, infants and pets, like on airbnb.com), or leave the dates empty: the Actor uses automatic dates (30 days from today, 5 nights) so Airbnb quotes a price, and every record says so (scrape.dates_auto). Guests work like Airbnb's filter: 4 adults brings every listing for 4 or more people (5, 6, 8...), each priced for 4. Adults 0 = any number of guests: no capacity filter, each listing priced for one guest.
  4. How much detail? Choose a level: Estimate (free count and cost), Snapshot (search results), Details (full listing page), Revenue & occupancy (+ calendar), Everything (+ all reviews) or Find management leads (ranked leads for property managers). Add filters if you want: bedrooms (minimum or exact), bathrooms, beds, type of place, property type, amenities, price range, free cancellation, only available on your dates, minimum rating, Superhosts only. Pick a Language to also get the listing texts in it.
  5. Click Start and download the results as JSON, CSV, Excel or HTML, or read them through the API. Not sure about the cost? Run Estimate first: it is free and takes seconds.

How pricing works

Start with the free Estimate. Set the level to Estimate: in a few seconds the run counts the listings in your area and shows what each level would cost on your plan, without charging anything. Then pick the level and run it for real.

You only pay for delivered results. Listings that fail, listings your filters drop and duplicates are not charged; there is no subscription and no platform usage on top. Set a maximum cost per run in the run options and the Actor stops cleanly before going over it, keeping everything collected so far.

Typical runs, in USD (Free plan / Gold plan):

runwhat you getcost
100 listings in a neighborhood, level Detailsfull listing page and exact price for your dates$0.25 / $0.10
1,000 listings, level Revenue & occupancy+ 12-month calendar, occupancy and revenue estimates$3.50 / $1.45, + $0.50 for the market report
Dubai Marina, the 635 two-bedroom homes free on our test dates, level Everything+ all 8,925 reviews$6.69 / $3.15, + $0.50 for the market report
A daily monitor of 600 listings, level Revenue & occupancyfirst run, then every daily run$2.10 / $0.87, then $0.90 / $0.42 a day
10 specific listings by URL, level Detailsfull page and price$0.015 / $0.007

By level of detail, per 1,000 listings found by a search:

LevelWhat you getFree planGold plan
Estimatehow many listings match and what each level would costfreefree
Snapshotsearch card: price for your dates, rating, capacity, location, photos$1.00$0.25
Details+ full listing page: price breakdown, cancellation, host, amenities, rules, permit$2.50$0.95
Revenue & occupancy+ 12-month availability calendar, occupancy and revenue estimates; when your dates are booked part of the time, an indicative price per night of their free periods$3.50$1.45
Everything+ every guest review and a 13-month calendar$3.50 + $0.50 per 1,000 reviews$1.45 + $0.25 per 1,000 reviews
Find management leadsRevenue & occupancy + the lead score, ranked, and the LEADS table (reviews read, not charged)$3.50$1.45

Listings given by URL or ID have no search card: Details, Revenue and Everything cost $1.00 less per 1,000 (Free plan). Daily calendar rows (one row per listing and day, off by default; the occupancy and revenue estimates come without them) add $0.25 per 1,000 listing-months on every plan: $3.00 per 1,000 listings for 12 months.

Free periods of a stay that is booked part of the time. From Revenue & occupancy up, when your dates are not available because some nights are booked (say 1-30 November, booked the 1st to the 9th), the Actor quotes each free period inside them on its own (10-30 November) and gives an indicative price per night of those free nights, before taxes (free_price_per_night, with free_nights_quoted; each period in the full record's price.free_periods). The same when the nights are free but the listing does not accept your check-in or check-out day, or that many nights: the bookable stay inside your dates is quoted. Airbnb shows no price per day, so it is the average of each free period: a short period carries its whole cleaning fee, and a host can price a single night far above the rest, so look at the periods themselves when one matters. No extra charge. In monitoring, a listing gets them the first time it is delivered, not on its re-checks. The run's status says how many of the listings booked on your dates have such a price.

Under the hood these are pay-per-event prices per 1,000 events, by Apify plan (Pricing tab; Platinum and Diamond pay the Gold price):

EventWhen it is chargedFreeBronzeSilverGold
listingeach unique listing found by a search$1.00$0.60$0.40$0.25
listing-detailseach listing with its full page and price quote$1.50$1.30$1.00$0.70
calendareach listing with its availability calendar$1.00$0.75$0.60$0.50
calendar-daysDaily calendar rows only: each month of a listing's daily rows (12 months = 12 events)$0.25$0.25$0.25$0.25
revieweach review$0.50$0.40$0.30$0.25
host-profileHost profile: Full only: the host's whole public profile, once per unique host in a run (the default listing count of the host is free)$1.00$0.80$0.60$0.50
listing-updatemonitoring only: each listing already delivered by the same monitor and checked again in a later run, changed or not$1.50$1.30$1.00$0.70
market-reportthe market report of a run (on by default for Revenue & occupancy, Everything and Find management leads)$0.50 per report$0.50$0.50$0.50

A real example. Dubai Marina, every 2-bedroom entire home available for 5 nights in November 2026 (635 listings) with the full listing page, the availability calendar and all 8,925 reviews (level Everything): $6.69 on the Free plan, $3.15 on Gold, plus $0.50 for the market report (on by default at this level; set Market report to Off to skip it). With the default Which listings: All active listings, the same run also returns the 2-bedroom homes already booked on those nights: more listings, so a higher cost (the free Estimate shows both counts). The same data with the most popular Airbnb Actors (the leading listing scraper plus its reviews Actor, plus a calendar Actor that charges per day and per listing) costs about $749 / $723, almost all of it for the calendar.

Same 635 listingsThis Actor (Free / Gold)Other Airbnb Actors on the Store (Free / Gold)
Search results only$0.64 / $0.16$1.59 / $0.79
Full listing pages$1.59 / $0.60$2.54 / $0.64
+ 12-month calendar, 365 daily rows per listing$4.13 / $2.83~$704 / ~$702 (calendar charged per day)
+ 8,925 reviews$8.59 / $5.06~$749 / ~$723

The market report ($0.50 per run, on by default for Revenue & occupancy, Everything and Find management leads) is not included in this comparison: the other Actors do not offer one.

To be fair: the leading listing scraper costs less than this one on the Platinum and Diamond plans for listing pages ($0.75 and $0.50 against $0.95 per 1,000) and has a much longer track record; one calendar Actor quotes a price for each day, which this Actor does not (Airbnb's public calendar has no daily prices without a login); and one all-in-one Actor bundles calendar and reviews for less per row, with a naive occupancy figure. Competitor prices as published on the Apify Store on 2026-10-14.

Listings that fail, and listings dropped by your filters, are not returned and not charged. Duplicates are charged once. With a maximum cost per run, the Actor estimates the cost of each listing before fetching it, stops cleanly when the next one would not fit, and keeps everything collected so far.

Input example

{
"where": ["Dubai Marina, Dubai"],
"checkIn": "2026-11-10",
"checkOut": "2026-11-15",
"adults": 2,
"dataLevel": "revenue",
"currency": "AED",
"roomTypes": ["Entire home/apt"],
"minBedrooms": 2,
"bedroomsExact": 2,
"maxListings": 700,
"omitPersonalData": true
}

First, how many and how much? (free):

{
"where": ["Dubai Marina, Dubai"],
"dataLevel": "estimate",
"bedroomsExact": 2,
"currency": "AED"
}

Specific listings and a search URL in the same box, everything, automatic dates:

{
"where": [
"https://www.airbnb.com/rooms/614178316141803089",
"23491570",
"https://www.airbnb.com/s/Paris/homes?min_bedrooms=2"
],
"dataLevel": "everything",
"maxReviewPages": 2,
"minRating": 4.8,
"photos": "full"
}

Output example

Spreadsheet (default). One flat row per listing in the default dataset, always the same 98 columns in the same order (null when unknown; with a Language picked, two more right after title: title_localized and description_localized), so a sheet or a CSV import keeps working from run to run. Real output for a Dubai Marina listing (5 nights, 2 adults, AED, level Revenue & occupancy, omitPersonalData on), abridged:

{
"url": "https://www.airbnb.com/rooms/614178316141803089",
"listing_id": "614178316141803089",
"title": "Stunning Marina View | High Floor Apartment",
"property_type": "serviced_apartment",
"property_type_label": "Entire serviced apartment",
"room_type": "entire_home",
"city": "Dubai",
"building": "Al Murjan Tower",
"guests": 4, "bedrooms": 2, "beds": 2, "bathrooms": 2.0,
"check_in": "2026-11-10", "check_out": "2026-11-15", "nights": 5,
"currency": "AED",
"nightly_rate": 1286.65,
"price_per_night": 1286.65,
"price_per_night_before_taxes": 1286.65,
"taxes": null,
"total": 6433.27,
"total_original": 8334,
"fees_included_in_rate": true,
"is_available": true,
"rating": 4.76, "review_count": 21,
"rating_cleanliness": 4.71, "rating_location": 4.86, "rating_value": 4.62,
"superhost": false,
"host_id": "<host id>",
"host_name": null,
"cancellation_policy": "non_refundable",
"instant_book": true,
"license_number": "DUB-AL-HDTDQ",
"has_pool": true, "has_gym": true, "has_parking": true, "has_marina_view": true,
"photo_count": 21, "photos_complete": true,
"available_days_30": 11, "available_days_90": 66,
"est_occupancy_calendar_30": 0.6333,
"est_adr": 1286.65,
"est_revenue_monthly_calendar": 24771,
"warning_codes": "LOCATION_TEXT_HIDDEN | NO_TAX_LINE | PERSONAL_DATA_OMITTED",
"scraped_at": "2026-10-14T11:23:23Z",
"record_type": "listing"
}

Full JSON (outputFormat: full_json). The complete record: 200+ fields grouped in blocks, and every key is always present (null when unknown). Real output for the same listing (5 nights, 2 adults, AED, level Everything, estimateCleaning on, omitPersonalData on):

{
"record_type": "listing",
"listing_id": "614178316141803089",
"url": "https://www.airbnb.com/rooms/614178316141803089",
"identification": {
"title": "Stunning Marina View | High Floor Apartment",
"property_type_label": "Entire serviced apartment",
"room_type": "entire_home",
"home_tier": 1
},
"location": {
"lat": 25.0854,
"lng": 55.1494,
"coordinates_exact": true,
"neighborhood": null,
"city": "Dubai",
"country_code": "AE",
"inside_search_area": null
},
"capacity": {
"guests": 4,
"bedrooms": 2,
"beds": 2,
"bathrooms": 2.0
},
"price": {
"currency": "AED",
"check_in": "2026-11-10",
"check_out": "2026-11-15",
"nights": 5,
"adults": 2,
"is_available": true,
"nightly_rate": 1286.65,
"subtotal_nights": 6433.27,
"discounts_total": 0,
"taxes_total": null,
"total": 6433.27,
"total_display_original": 8334,
"price_per_night": 1286.65,
"fees_included_in_rate": true,
"line_items": [
{
"type": "nightly_subtotal",
"label": "5 nights x ﺩ.ﺇ 1,286.65",
"amount": 6433.27,
"currency": "AED",
"raw": "ﺩ.ﺇ 6,433.27"
}
]
},
"quality": {
"rating": 4.76,
"review_count": 21,
"category_ratings": {
"cleanliness": 4.71,
"accuracy": 4.81,
"checkin": 4.76,
"communication": 4.76,
"location": 4.86,
"value": 4.62
},
"is_guest_favorite": false
},
"host": {
"host_id": "<host id>",
"name": null,
"is_superhost": false,
"is_verified": true,
"rating": 4.59,
"total_reviews": 5315,
"years_hosting": 12,
"response_rate": 0.96,
"listings_count": null
},
"rules": {
"check_in_start": "16:00",
"checkout_time": "11:00",
"max_guests": 4,
"pets_allowed": true,
"min_nights": 1,
"instant_book": true,
"cancellation_policy": "non_refundable"
},
"regulatory": {
"license_number": "DUB-AL-HDTDQ",
"jurisdiction": "AE-DU",
"license_format_valid": true,
"license_source": "description_registration_section"
},
"availability": {
"calendar_start": "2026-10-01",
"calendar_end": "2027-09-30",
"available_days_30": 10,
"unavailable_days_90": 25,
"next_available_date": "2026-10-16",
"min_nights_today": 1
},
"reviews_summary": {
"reviews_fetched": 50,
"last_review_date": "2026-09-26",
"reviews_last_12m": 40,
"avg_rating_fetched": 4.9
},
"estimates": {
"cleaning_fee_estimated": {
"value": 340.05,
"method": "regression_subtotal_vs_nights",
"confidence": "low"
},
"occupancy": {
"calendar": {
"unavailable_rate_30": 0.6667,
"unavailable_rate_90": 0.2778,
"method": "calendar_unavailable_share",
"confidence": "low"
},
"reviews": {
"value": 0.6575,
"method": "inside_airbnb_san_francisco",
"confidence": "medium"
}
}
},
"scrape": {
"scraped_at": "2026-10-14T09:00:00Z",
"mode": "full",
"tiers": [
"details",
"pdp_quote",
"..."
],
"currency": "AED",
"dataset_annotations_pending": true,
"dates_auto": false
}
}

Review rows go to the reviews dataset and, with Daily calendar rows on, calendar rows to the calendar dataset (join by listing_id), or inside each listing with outputLayout: "nested", or all in the default dataset with outputLayout: "single_dataset":

{
"schema_version": "1.0.0",
"record_type": "review",
"review_id": "<review id>",
"listing_id": "614178316141803089",
"created_at": "2026-09-26",
"created_at_label": "2 weeks ago",
"rating": 5,
"text": "Thank you so much for your great hospitality",
"text_original": "Thank you so much for your great hospitality",
"language": "en",
"is_translated": false,
"reviewer": {
"id": "<reviewer id>",
"name": null,
"location": null,
"picture_url": null,
"profile_url": null,
"tenure_label": "2 years on Airbnb"
},
"stay_context": "Stayed a few nights",
"host_response": null,
"highlight": null
}
{"schema_version": "1.0.0", "record_type": "calendar_day", "listing_id": "614178316141803089", "date": "2026-11-10", "available": true, "available_for_checkin": true, "available_for_checkout": true, "bookable": true, "min_nights": 2, "max_nights": 99, "price": null, "currency": null, "previous_available": null, "changed": null}

The OUTPUT record in the key-value store summarizes the run: per-search coverage (listings announced vs. collected, map cells split), counts, events charged and why the run stopped if it stopped early: stoppedCode is done, max_listings, spending_cap (Max charge per run), request_cap (Max requests), aborted, timeout (the run's timeout was near: it stops itself about 90 seconds before, keeping everything delivered), blocked or api_changed (Airbnb changed its API: report it in Issues), a fixed value you can check in code, with the reason in words in stoppedReason. MARKET_SUMMARY adds the market view of the run: median, p25 and p75 price per night (before taxes) by bedrooms and by neighborhood + bedrooms, rating distribution, hosts with several listings and license numbers shared by several listings.

When do results appear?

As they are scraped. With the default Delivery: Automatic (incremental, except Find management leads, which delivers at the end so the dataset comes ranked), each listing (with its reviews and calendar) is saved and charged the moment it is complete, so you can watch the dataset grow and nothing is lost if the run stops early.

A few fields compare a listing with the rest of the run: how many listings the same host has in this run (host.listings_count_in_dataset), other listings showing the same license number (regulatory.license_shared_with), price and rating vs. similar listings (estimates.price_vs_market_pct, estimates.rating_vs_market) and suspected duplicates (estimates.duplicate_group_id). Their value is only known when the run ends, so in each listing they are null and scrape.dataset_annotations_pending is true, instead of a misleading partial value. At the end the Actor writes them to the annotations dataset (one row per listing, join by listing_id) and summarizes the market in MARKET_SUMMARY.

Prefer complete records? Set Delivery to All at the end: those fields come filled in each listing, but nothing appears until the run finishes and an unexpected crash loses the results.

Why is there no cleaning fee or service fee line?

Airbnb now shows the total price: cleaning and service fees are folded into the nightly rate in every market we checked (Dubai, Paris, New York area, London, Buenos Aires, Tokyo), so fees_included_in_rate is true and there is no separate line to read. Turn on Estimate the cleaning fee and the Actor asks for two more quotes with different stay lengths and estimates the fixed per-stay part (estimates.cleaning_fee_estimated, labeled as an estimate).

How is occupancy calculated?

Airbnb publishes availability, not occupancy: a blocked day can be a booking, a host block, a booking on another platform, or a gap too short to book. This Actor never gives you one unlabeled number:

  1. Calendar (unavailable_rate_30/60/90/365): the share of unavailable days. Named honestly: it is an upper bound, inflated by host blocks.
  2. Reviews (the "San Francisco model" used by Inside Airbnb): reviews in the last 12 months divided by an assumed review rate, times the average stay, capped at 70 %. The assumptions are in the output.

Why do some listings have no price?

Airbnb only quotes a price for specific dates and guests, and a listing has no price when it is not available for your dates (price.is_available: false). By default (Which listings: All active listings) those booked listings are delivered too, so you see the whole market: details, calendar and reviews, with the price fields null rather than a price for other dates. Turn on Only available on my dates to drop them (they are not charged). With Search without dates (Advanced) nothing is quoted: each card's price is for dates Airbnb picks per listing (price.quote_source: search_no_dates), so it is not comparable between listings. Airbnb's calendar itself has no daily prices.

Which listings: all active ones or only the available ones?

All active listings (default from Details up when the field is empty)Only listings available on your dates (default for Snapshot; the Store form starts with it)
HowSearch without dates (every active listing), then one exact quote per listing for your datesOne search with your dates, like on airbnb.com
Booked homesIncluded: price.is_available: false, no priceMissing
Price range filterApplied by the Actor to each quote (the price per night before taxes, fees included); booked homes are kept unless Only available on my datesAirbnb's own filter
Listings per areaMore (the whole market)Fewer
Good forMarket size, occupancy, revenue, investment analysisA price snapshot of what can be booked now

Every record says which one was used in scrape.coverage (all or available). With All active listings the search card's price (for dates Airbnb picks) is never used: the price always comes from the quote for your dates.

The form starts with Only available so that a first run shows prices. For market analysis choose All active listings: without dates Airbnb ranks popular homes first, and those are often booked, so with a small Max listings many of the listings you get can be booked and have no price. The run says how many, in the status message ("4 of 5 are booked or blocked on your dates and have no price") and in availabilityOnDates in the OUTPUT record.

How many listings can I scrape, and how fast?

As many as Airbnb has in the area: big searches are split into smaller map areas so the ~270-result limit of a single search does not cut your data. Use Max listings to cap a run (default 200, about $0.50 at Details on the Free plan; 0 = no limit). If the area has more listings than that, the run tells you, in the status message and in the OUTPUT record: "Found ~1,120 listings in the area (all of them at this level: about $2.80); delivered 200 because Max listings = 200. Raise it, or use Estimate to see the full cost." When Airbnb only says "Over 1,000 homes" for the map area, the run says that instead of guessing a number, and points you to Estimate for the real count.

The Actor scrapes 32 listings at a time (Parallel listings), each through its own proxy IP with its own pause (1 to 2 seconds between two of its pages), and requests a listing's price quote, cancellation policy and calendar together with its page, as a browser loads it. Snapshot reads 40 listings per request. A listing in Details takes 3 requests (page, price quote, cancellation policy), plus 1 with Photos: Full gallery when Airbnb sends the page with only 5 photos (the full set then comes from the listing's web page; at busy times this is most regular homes); Revenue adds 1 (12-month calendar) and Everything 2 (13 months) plus 1 per 50 reviews. With the default Host profile: Count there is also one small request per unique host. Measured on Apify with the defaults (4 GB of memory, 32 parallel listings), Dubai Marina, 5 nights: 20 listings in Details in 9-13 seconds, 100 in 18-24 seconds, 1,000 in about 3 minutes, 100 in Revenue (with their 12-month calendars) in 37 seconds, 20 in Everything (all 715 reviews and full photo galleries) in 23 seconds. Listings start as soon as the search finds them. With less memory the Actor is slower (it has less CPU). If Airbnb starts blocking, the Actor moves to residential proxies and slows down on its own (Proxy strategy: Auto); if your runs still get blocked, lower Parallel listings (down to 20) or raise Pause between requests to 2 seconds. Those limits keep a run's duration, which the prices include, bounded.

How many listings are there, and what will it cost? (free estimate)

Choose the level Estimate. The Actor resolves your area, asks Airbnb how many homes there are in the map area (exact below 1,000; the map is split into smaller cells only when Airbnb says "Over 1,000 homes") and works out how many match your filters: exactly N bedrooms from Airbnb's own counts (homes with at least N minus homes with at least N+1, cell by cell), the neighborhood boundary cell by cell (cells inside count whole, cells outside count nothing, cells the boundary crosses count the share of their listings inside it), and filters Airbnb does not apply (minimum rating, superhost, property type) from the search cards. Then it returns the count and the price of each level, for your plan. It does not open any listing and charges nothing. With dates (yours or the automatic ones) it counts twice: every active listing (search without dates) and the ones available on your dates, so you also see how much of the market a dated search misses. Every level is priced on the Which listings choice you make in the form (it starts with "Only listings available on your dates"), and the message adds what Details and up would cost with All active listings, the choice for market analysis. A neighborhood takes a few requests and seconds; all the 2-bedroom homes of Dubai Marina take 50 requests and about a minute and a quarter. Checked against a complete count of that market: within 1-3 %. A real run on Apify (Dubai Marina, entire homes with exactly 2 bedrooms, 14-19 November) said (the Gold amounts at today's prices):

"Estimate: Dubai Marina, Dubai (OpenStreetMap polygon): 1,870 in the map area, ~1,085 active listings matching, ~639 of them available on your dates. Free plan: Snapshot $0.64 · Details $2.71 · Revenue and leads $3.80 · Everything ~$17.79 with ~28,008 reviews (Gold: $0.16 / $1.03 / $1.57 / ~$8.58) (Snapshot priced on the available listings, Details and up on all active ones). 50 requests, 73.6 s, nothing charged."

The full breakdown (area used, both counts, sample, notes, cost with your Max listings) is in the OUTPUT record.

Market report

With Market report on (Auto, the default, turns it on for Revenue & occupancy, Everything and Find management leads; choose On or Off to decide yourself), every run also saves a ready-to-share HTML report of its listings as MARKET_REPORT in the key-value store (Storage tab, or the "Market report" link in the Output tab): prices by bedrooms and by building, occupancy from the calendar and from reviews (never mixed), demand, quality, hosts with several listings, amenities that move the price, cancellation policies, permit numbers and a price map, plus the methodology. One file, no scripts or external assets: open it in a browser, send it, or print it to PDF. It costs $0.50 per run and is charged only if the report was created. With Omit personal data it shows no host names or listing titles.

Find management leads (for property managers)

Choose the level Find management leads. Every listing in the area is scored from 0 to 100 on how much it underperforms the other listings of the run and how likely its owner can still be won; the dataset comes ranked best first, and a LEADS table (JSON, and LEADS_CSV as CSV) lands in the key-value store, ready to work through. The spreadsheet columns lead_score, lead_tier (high from 50, medium from 30, low), lead_type, lead_fit and lead_reasons are in every row.

What the score looks at. Performance carries 60 %: reviews per month in the last 12 months against the area (each review is roughly two stays), how much of the next 90 nights is booked or blocked, and the rating. Fixable gaps carry 40 %: price against similar listings (too high or too low), photos, description length, Superhost, response rate and time, Instant Book, core amenities and long minimum stays. lead_reasons lists the signals that fired, strongest first, with the numbers behind them. Lead types give the angle: dormant (no reviews and no longer new), underperforming, new_listing and optimization (performs fine, but presentation or operations can improve).

Who is left out. Hosts with 5 or more listings are already professional operators: tier excluded, score 0. They stay in the dataset (useful as competitors) but not in the LEADS table. Fewer listings, a business account, a team of co-hosts or a company-like name lower the fit.

What it does not do. It never collects or guesses owners' names, phone numbers, emails or addresses: Airbnb does not publish them and the Actor does not look for them anywhere else. Hosts appear only by Airbnb's public numeric host id (and with Omit personal data, no host names anywhere). How you approach owners is up to you and the rules that apply to you. The score is a screening aid built from public data, not proof that a listing underperforms.

Cost. Priced like Revenue & occupancy ($3.50 per 1,000 listings on the Free plan, $1.45 on Gold): the newest reviews are read for the score but not delivered or charged. The market report (on by default for this level) adds $0.50.

A real row of the LEADS table, from a Dubai Marina run of 635 two-bedroom listings (37 high, 39 medium and 287 low leads; 272 listings of operators left out), with the listing id masked and the host id and an empty building left out for this page:

{
"rank": 21,
"listing_id": "(masked)",
"url": "https://www.airbnb.com/rooms/(masked)",
"score": 67,
"tier": "high",
"lead_type": "underperforming",
"confidence": "medium",
"fit": 1.0,
"reasons": "low_review_velocity: 0.17 reviews/month in the last 12 months vs market median 0.49 | low_rating: 4.20 from 5 reviews vs market median 4.80 | open_calendar: 0% of the next 90 nights booked or blocked vs market median 16% | overpriced: 3,155 AED/night, +152% vs market median 1,252 for 2-bedroom listings | not_superhost | no_instant_book | individual_host: 1 listing",
"bedrooms": 2,
"nightly_price_before_taxes": 3155.3,
"currency": "AED",
"rating": 4.2,
"review_count": 5,
"host_listings_in_run": 1,
"host_listings_total": null,
"is_superhost": false
}

Track a market over time (monitoring)

Give the search a name in Track this market (for example Dubai Marina 2BR) and run it again with the same name, typically every day. Each run compares against the previous one and adds a changes dataset:

changewhat it means
new_listinga listing that was not in the market before (or came back)
price_changeanother total for the same dates
availability_changenights that got booked or blocked, or freed (with the dates)
new_reviews, rating_changeevidence of stays, rating up or down
title_change, photos_change, license_change, policy_change, superhost_changethe listing changed
missing, delistednot in the search any more; removed after 3 absences in a row, or confirmed by its page

The listings dataset of each run also says, per listing, whether it changed (scrape.monitor_changed), which nights became unavailable or available since the last run, and an occupancy measured from those changes (estimates.occupancy.observed), which gets better with every run.

What you pay. The first time a monitor delivers a listing, the normal price of your level. After that, $1.50 per 1,000 listings checked again (listing-update), changed or not: every check costs requests, and the changes dataset tells you what moved. Reviews are charged once (only new ones are delivered), and the changes dataset is free. Monitoring reads the calendar (that is how bookings show up), so a Details monitor is priced as Revenue & occupancy. Example: 600 listings at Revenue & occupancy cost $2.10 on the first run (Free plan), then $0.90 per daily run, less than half of scraping them again.

Run it every day with a Schedule. In Apify Console, open the Actor, set the input (where, level, Track this market, and Max listings: 0 so the whole area is searched and removed listings can be detected), save it as a task, then Schedules -> Create new: choose the task and a time, for example 0 6 * * * (every day at 06:00). The monitor's memory lives in a named key-value store of your account, airbnb-monitor-<name>, so it survives between runs; do not delete it. Two runs of the same monitor never overlap: if one is still running, the next one stops with a message instead of mixing their results.

Get alerts. On the task, open Integrations and add Slack, email, Google Sheets, Zapier, Make or your own webhook, triggered when a run succeeds. Each run's Output tab has a Market changes link with what changed in that run (through the API it is the run's changes dataset), and the status message sums it up, e.g. "Monitor 'Dubai Marina 2BR': 37 change(s) (29 availability change, 6 price change, 2 new listing)".

{
"where": ["Dubai Marina, Dubai"],
"dataLevel": "revenue",
"bedroomsExact": 2,
"currency": "AED",
"maxListings": 0,
"monitorName": "Dubai Marina 2BR"
}

This Actor only collects publicly available information that anyone can see on Airbnb without logging in. It does not log in, does not use accounts and does not access private data such as messages, bookings or guest contact details. Courts in the US have held that scraping public, logged-out web pages is not unauthorized access (e.g. hiQ v. LinkedIn; Meta v. Bright Data, 2024). Reviews and host names can be personal data under GDPR and similar laws: collect them only with a legitimate purpose, or turn on Omit personal data. Check Airbnb's Terms of Service and your local laws for your use case; if in doubt, consult a lawyer. This Actor is not affiliated with or endorsed by Airbnb.

What does Omit personal data remove? Host and co-host names, photos, bios, "lives in" and work, and reviewer names, photos and profile links become null; the host's name is replaced with "the host" in texts Airbnb generates (the price-drop notice, listing highlights); the market report shows no host names or listing titles; listing records carry a PERSONAL_DATA_OMITTED warning. What stays: Airbnb's numeric host and reviewer ids, the reviewer's location label, business data (ratings, Superhost, years hosting, license numbers) and free text as people wrote it (review text, host responses, listing descriptions), which can still mention names.

FAQ

Do I need proxies? No setup and no proxy bill: proxy traffic is included in the event prices. By default (Proxy strategy: Auto) the Actor uses Apify datacenter proxies and switches to residential proxies only if Airbnb starts blocking; after a while it tries datacenter again. If residential proxies are not available to the run, it slows down instead. The run log, the status message and the OUTPUT record show requests, blocks and estimated traffic for each kind of proxy. You can also force datacenter or residential (with a country), or pin an Apify Proxy group in Advanced. Runs without a proxy or through your own proxy URLs are not supported: the Actor scrapes through Apify Proxy, one IP per parallel listing.

Which currencies are supported? Any currency Airbnb offers (ISO code, e.g. USD, EUR, AED, GBP). Amounts are always numbers.

Can I get the listings in my language? Yes: pick one of Airbnb's 66 languages in Language of the texts. Every field is still collected in English (so prices, dates and rules are parsed the same way), and the title, description, amenities and house rules also come in your language in the localized block (title_localized and description_localized in the spreadsheet). When the host wrote in another language, that text is Airbnb's machine translation, and the original stays in the main fields. It adds one listing page per listing (no extra charge). Reviews keep their original language.

Who is the host: an individual or a management company? By default the Actor reads the total number of listings on each host's Airbnb profile (one small request per host, free): host_listings_total in the spreadsheet. The listing page itself shows the "Business" label and two of the host's profile lines at a time (languages, where they live, or their work, often a company name like "Holiday Homes LLC"); those are free. With Host profile: Full you get the complete profile: all of those lines, years on Airbnb, sign-up month and verifications (host-profile, once per host).

Can I search with children or pets? Yes: like on airbnb.com, children count toward the listing's capacity and pay the extra-guest fee, infants are free, and pets keep only pet-friendly listings and add the host's pet fee to the quote. When a listing cannot take your group, unavailable_reason / unavailable_message say why ("Maximum number of guests is 4", "This place doesn't allow pets").

Can I mix listing URLs and searches in the same run? Yes. Locations, map areas, search URLs, listing URLs and IDs can be combined; each listing is returned and charged once.

Can I get exactly 2-bedroom listings? Yes: set Exactly N bedrooms to 2. Airbnb's own filter is "2 or more", so the Actor asks for that and checks the exact count on each search card or, when the card does not show it (in Europe a search without dates shows the host type there instead), on the listing page. Listings that do not match are not delivered or charged.

Why are some neighborhood names empty? Airbnb hides the neighborhood text for some sessions (an A/B test); the record carries a LOCATION_TEXT_HIDDEN warning. Retry listings without neighborhood text asks again with a new session.

What dates are used if I leave them empty? 30 days from today, for 5 nights, so that Airbnb quotes a real price. Every record carries scrape.dates_auto: true and the run's OUTPUT says which dates were used. A plain Airbnb search with dates only shows homes available on those nights; from Details up the Actor also finds the booked ones (see Which listings). Search without dates in Advanced skips the quote entirely.

How do the extra filters work? Airbnb itself filters by minimum bedrooms, bathrooms and beds, type of place, amenities and free cancellation, and by price when Which listings is "Only listings available on your dates". With listing URLs or IDs (no search), the Actor checks bathrooms, beds, amenities and free cancellation on the listing page and its cancellation policy; what the page cannot confirm stays, with a FILTER_UNVERIFIED warning. Exact bedrooms, minimum rating, Superhosts only and property type are checked by the Actor: first on the search card (dropped listings cost no requests and are never charged), and when the card does not tell (for example a Superhost without the badge), on the listing page; listings that do not match are not returned and not charged. With "All active listings" the price range and Only available on my dates are checked on each listing's quote for your dates, the same way.

Does it download the photos? No: every record carries the photo URLs (Airbnb's originals, with room and caption), never image files. Open or download them yourself from the URLs if you need the files.

Why does a listing have only 5 photos? Airbnb often answers with just the first 5 photos of a regular home, especially at busy times. Photos decides what happens then: Full gallery (the default for Everything and Find management leads) gets the rest from the listing's web page, one more request and about 0.5-0.9 MB per such listing, so the run is slower; Preview (the default for Snapshot, Details and Revenue & occupancy) keeps those 5 and the cover, and the record says so: photos.complete: false, photo_count empty, a PHOTOS_TRUNCATED warning; None returns no photo list (the cover photo stays). The price is the same for all three. Listings that really have 5 photos are recognized from the search card and left alone.

Why is listing_id text? Most Airbnb listing ids have 18 or 19 digits, more than a spreadsheet or a JSON number can hold: as a number, 614178316141803089 silently becomes 614178316141803136 and points to another listing (or nowhere). The Actor always writes ids as text, in every dataset and record. Excel still turns long digit strings into numbers when it opens a CSV file, so download Excel (XLSX) instead of CSV, and use the url column, the first one, to open a listing: it is always right.

Can I download the results as Excel? Yes: in the run's Output or Storage tab, choose Excel, CSV, JSON or HTML, or use the API. With the default Output format: Spreadsheet, each listing is one row with 98 readable columns; with Full JSON a CSV has thousands of columns, so keep it for code.

Something is missing or wrong. Open an issue on the Issues tab with the run link (see Support below).

Why this scraper

What it does that you can check yourself, run by run:

  • Exact prices for your dates, as numbers. Every line of Airbnb's quote is kept and typed (nightly rate, discounts, taxes, total), and fees_included_in_rate says whether cleaning and service fees are inside the rate. Verified on 635 Dubai Marina listings and on listings in six cities.
  • The whole area, not the first 270 results. Big searches are split into smaller map areas until each one fits under Airbnb's cap; the run's OUTPUT says how many listings Airbnb announced and how many were collected.
  • Every active listing, not only the free ones, and the same area every run (OpenStreetMap boundaries instead of Airbnb's moving map).
  • Know the cost first. The free Estimate, a maximum cost per run, and a clear message when Max listings cut a run, with what the whole area would cost.
  • Spreadsheet-ready output with ids that survive Excel, and the link first.
  • Occupancy you can defend. Calendar and reviews methods kept apart, each with its method, assumptions and confidence, and an observed occupancy when you monitor the market.
  • Monitoring that charges only what changed, and a market report you can send as is.
  • Calendars charged per listing, not per day: a 12-month calendar costs $0.001 per listing on the Free plan.

Support

  • Open an issue on the Issues tab with the run link: we answer within 48 hours.
  • You only pay for delivered results: listings that fail are not charged, and neither are listings your filters drop.
  • If a run did not deliver what this page promises, tell us in the issue and include the run link; the OUTPUT record (requests, blocks, coverage, why the run stopped) usually shows what happened.

Same engine, same data and prices, one job each: