Airbnb Scraper β€” Listings, Prices, Reviews & Calendar avatar

Airbnb Scraper β€” Listings, Prices, Reviews & Calendar

Pricing

from $0.84 / 1,000 listings

Go to Apify Store
Airbnb Scraper β€” Listings, Prices, Reviews & Calendar

Airbnb Scraper β€” Listings, Prices, Reviews & Calendar

Scrape Airbnb listings for any place and dates: price per night and per stay, rating, coordinates, beds, photos, host and amenities. Add guest reviews with host replies and the availability calendar with minimum nights and occupancy, or get one row per review or per calendar. No browser, no login.

Pricing

from $0.84 / 1,000 listings

Rating

5.0

(7)

Developer

Matvey

Matvey

Maintained by Community

Actor stats

0

Bookmarked

45

Total users

19

Monthly active users

14 hours ago

Last modified

Share

Airbnb Scraper is one Actor for everything Airbnb shows about a stay. Give it a place and dates and it extracts Airbnb listings with the price for the stay and per night in your currency, rating and review count, property type, coordinates, bedrooms and beds, Guest favorite badges and photos. Switch on details for the description, amenities, host, capacity, sub-scores, cancellation policy and house rules; switch on the calendar for minimum nights, day-by-day availability and occupancy per month; switch on reviews for the guest reviews with the host's replies β€” all on the same listing row. Or pick a mode and get one row per guest review (up to 2,000 per listing) or one availability-calendar row per listing. It reads the data Airbnb renders into its own pages and its own JSON API, so there is no browser and no login: sixty listings take a few seconds. Airbnb stops a search after about 270 results; this Actor keeps going through price bands, so 400 listings for Seminyak came back from one run in 36 seconds.

One run of Airbnb Scraper: Seminyak listings with the total and per-night price, rating and review count.

Give it a place the way you would type it into Airbnb, a check-in and check-out date and the party size, or paste Airbnb search URLs with your own filters, or listing URLs to open in full. Export as JSON, CSV or Excel, run it on a schedule, or call it from the API and AI agents.

🧭 Three modes in one Actor

Mode (mode)One row perUse it forPrice
Listings (default)listingprices for your dates, market scans, details, amenities, host; calendar and reviews inside the rowfrom $0.40 per 1,000 listings, $0.80 with details (Business plan, from 14 Nov 2026)
Reviews ("reviews")guest reviewreview monitoring, sentiment, complaints research, up to 2,000 reviews per listing$2.00 per 1,000 on the Free plan, $1.40 on Business (from 14 Nov 2026)
Availability calendar ("calendar")listingfree and booked nights, minimum stay, first free date, occupancy per month, up to 12 months ahead$2.40 per 1,000 on the Free plan, $1.68 on Business (from 14 Nov 2026)

Listings come from a place (locationQueries), an Airbnb search URL with your own filters, or listing URLs and ids (startUrls) β€” in every mode.

Moving from Airbnb Listings Scraper, Airbnb Reviews Scraper or Airbnb Availability Calendar

Those three Actors are merged into this one. Change the Actor and keep your input β€” the old field names work as they are:

You usedYour input keeps working here because…Same rows
Airbnb Listings Scraperit had the same fields as Listings modetype: "listing", identical fields
Airbnb Reviews ScrapermaxReviewsPerListing, sortBy and includeListingInfo switch the run to Reviews mode by themselvestype: "review", identical fields
Airbnb Availability CalendarincludeDays and onlyAvailableListings switch the run to Calendar mode by themselves (or set "mode": "calendar")type: "listing-calendar", identical fields

Setting mode explicitly is the clearest. The Availability Calendar Actor stays available as a narrow, calendar-only door; the other two are deprecated and point here.

Tested head-to-head β€” 30 October 2026

Same search for both (Seminyak, Bali, 10–13 Dec 2026, 2 adults, 20 listings), run from an ordinary Free-plan account against the most-used Airbnb scraper in the Store:

This Actor, search rowsThis Actor, with detailsMost-used Airbnb Actor
Listings returned20 of 2020 of 2020 of 20
Run time5 s28 s10 s
Fields per row316337 (several nested)
Fields filled98 %98 %96 %
Paid for 20 rows, Free plan$0.024$0.064 from 14 Nov ($0.113 today)$0.080
Guest reviews, availability calendar, minimum nights in the same Actoryesyesno β€” reviews are a separate Actor, no calendar

Prices come as numbers β€” total, per night, original and discount β€” so they sort and sum in a spreadsheet without cleanup. An earlier test on 23 September 2026 against four popular Airbnb scrapers gave the same picture: all listings returned, 97 % of fields filled, 0 % failed runs.

What is Airbnb Scraper?

It is an Airbnb data scraper for people who need listing prices and availability as a table rather than a screen: hosts and property managers comparing their rates with the street, analysts sizing a short-term rental market, travel apps, and anyone building a price watch for a destination. It answers "what does a two-bedroom in Canggu cost that week", "which villas in Ubud are Guest favorites under $80 a night" and "what amenities does this listing actually have".

What data can Airbnb Scraper extract?

FieldExample
name, propertyType, areaHidden Point Villa "WOODEN HOUSE" Β· Villa Β· Ubud
priceTotal, pricePerNight, currency, nights159 Β· 53 Β· USD Β· 3
priceOriginal210 β€” the struck-through price when a discount is shown
rating, reviewCount4.97 Β· 346
badges, isGuestFavorite["Guest favorite"] Β· true
bedInfo["1 bedroom", "1 queen bed", "1 bath"]
highlights["Free cancellation", "Book early to save"]
latitude, longitude-8.5069 Β· 115.2625 (approximate, as Airbnb shows before booking)
imagesphoto URLs
checkIn, checkOut, adultsthe dates and party the price was quoted for
url, listingId, position, page, placelink, id, order collected, page, how Airbnb understood the place

With Open every listing page switched on:

FieldExample
descriptionFull text, HTML removed
amenities, amenityGroups45 items, grouped as Bathroom, Bedroom and laundry, Entertainment…
hostName, isSuperhost, hostingSinceI Wayan Β· true Β· 8 months hosting
personCapacity, bedrooms, beds, bathrooms2 Β· 1 Β· 1 Β· 1
roomType, propertyTypeDetail, overviewTitleEntire home/apt Β· Entire villa Β· Entire villa in Ubud, Indonesia
ratingAverage, ratingCount, reviewTags4.97 Β· 346 Β· Pool 133, Hospitality 300, Breakfast 149
sleepingArrangements, highlightsDetail["1 queen bed"] Β· ["Outdoor entertainment"]
locationText, isExactLocationUbud, Bali, Indonesia Β· false
hostResponseRate, hostResponseTime, hostIsAirbnbManaged98 Β· within an hour Β· false
ratingDistribution{stars5: 91.7, stars4: 8.3, stars3: 0, …} β€” share of reviews per star
categoryRatings{cleanliness: 4.8, accuracy: 4.9, check_in: 5, communication: 4.7, location: 4.8, value: 4.9}
discountPercent19 β€” how far the nightly price sits below the struck-through original
cancellationPolicyFree cancellation for 24 hours. Cancel before October 8 for a partial refund.
houseRules, checkInTime, checkOutTime, checkInWindow, safetyItems["Up to 4 overnight guests", "No pets", "Quiet hours: 10:00 PM - 9:00 AM", "No parties or events"] Β· 15:00 Β· 11:00 Β· Check in after 3:00 PM Β· ["Smoke alarm", "Must climb stairs"]

With Availability calendar and minimum nights switched on:

FieldExample
minNights, maxNights, availableOnCheckIn2 Β· 1125 Β· true
availabilityByMonth[{month: 2026-10, days: 31, available: 10, occupancyPercent: 68}, …]
availableDaysAhead, calendar21 Β· one entry per day with available, bookable, check-in/out allowed, min and max nights

With Guest reviews switched on:

FieldExample
reviews[{rating: 5, date: "3 weeks ago", text: "Great stay, fantastic location…", reviewerName: "Jenny", reviewerLocation: "Sydney, Australia", hostResponse: null}, …]

πŸ’¬ Reviews mode β€” one row per guest review

FieldExample
listingId, listingUrl, listingName1369235628901673242 Β· https://www.airbnb.com/rooms/1369235628901673242 Β· Tiny home in Kuta Utara
listingRating, listingReviewCount, listingCity, hostName4.96 Β· 435 Β· Kuta Utara, Bali, Indonesia Β· Putu Adi
reviewId, rating, date, createdAt1659269953021095271 Β· 3 Β· April 2026 Β· 2026-04-08T08:33:12Z
text, language"The location and pool suited our needs very well…" Β· en
reviewerName, reviewerLocation, reviewerPhoto, reviewerId, reviewerProfileUrl, reviewerIsSuperhostJenny Β· Sydney, Australia Β· photo URL Β· id Β· profile link Β· false
hostResponse, hostRespondedAtthe host's reply and when it was written
photos, highlight, highlightType, roomTypeTitlephotos the guest attached, Airbnb's card label ("Stayed a few nights")

Order with sortBy: MOST_RECENT (default), LOWEST_RATED (complaints first) or HIGHEST_RATED.

πŸ“… Availability calendar mode β€” one row per listing

FieldExample
listingId, name, url1779422892946998331 Β· Private 1BR Villa Ubud Rice Field Β· link
minNights, maxNights1 Β· 365 β€” the shortest and longest stay the host sells
monthsScanned, daysScanned, availableDays, bookedDays, occupancyPercent2 Β· 61 Β· 20 Β· 41 Β· 67.2
firstAvailableDate2026-10-30 β€” first night a stay can start
availabilityByMonth[{month: "2026-11", days: 30, available: 7, booked: 23, occupancyPercent: 76.7}, …]
calendarone entry per day: available, bookable, check-in / check-out allowed, min and max nights (includeDays: false drops it)
propertyType, area, rating, reviewCount, pricePerNight, latitude, longitudeon listings found by a place search: what the listing is and what it costs for the searched stay

Airbnb's calendar carries no nightly prices β€” Airbnb removed them from it. The price for your dates comes from the search: use Listings mode with checkIn/checkOut, or read pricePerNight on calendar rows found by a place search.

What other Airbnb scrapers get wrong β€” and what this one does instead

The issue trackers and reviews of the most-used Airbnb scrapers on Apify repeat the same complaints. Each one is a design decision here.

Complaint on other actorsAirbnb Scraper
"Only 41 results returned when Airbnb shows 478", "requested 2,000 items, received 243"Plain paging is the first pass, then the same search runs again in nine price bands and every listing is kept once β€” 400 for Seminyak in one run, measured
"checkIn date not being read from startUrls"Dates and guests in a pasted search URL win over the form, per URL
"Add minimum nights to output" β€” open on the leading actor for weeksminNights and maxNights on the check-in date, plus the day-by-day calendar and occupancy per month
Reviews only through a second, separate actorreviews on the listing row, up to 200, with the host's replies
"not scraping descriptions", "half the titles missing", "bed and bath not available"Every field is read from the JSON Airbnb ships in its own page, not from the layout β€” description, title, beds, baths, amenities on every detailed row
"Charged me despite the limits", "no data returned but charged"Billing is per listing row and per opened page; error rows and empty searches cost nothing, and maxListings is a hard cap
"Can't export data if it's too much"Rows are flat, one per listing; arrays are short lists, not nested blobs
"Wrong price"Total for the stay, average per night, the struck-through original and the discount in percent β€” and the dates and party the quote was for on the same row

How much does it cost to scrape Airbnb?

Pricing is pay per row β€” you pay for what lands in your table: no start fee, nothing per page, nothing for proxies. Error rows, the free run-summary row and empty searches are never charged, and "Max cost per run" is respected to the cent.

From 14 November 2026 (per 1,000 rows; your Apify plan sets the column):

RowFree planStarter (Bronze)Scale (Silver)Business (Gold) and up
Listing from a search (Listings mode)$1.20$0.80$0.60$0.40
+ Listing page opened (details, amenities, host, rules; calendar or reviews inside the row)+$2.00+$0.80+$0.60+$0.40
= full listing with details$3.20$1.60$1.20$0.80
Guest review (Reviews mode)$2.00$1.80$1.60$1.40
Listing calendar (Availability calendar mode)$2.40$2.16$1.92$1.68

For comparison, the most-used Airbnb Actor in the Store charges $4.00 / $2.00 / $1.50 / $1.00 per 1,000 full listings on the same four plans plus a start fee, and $5.00 / $4.10 / $3.20 / $2.30 per 1,000 reviews (prices read from the Store on 30 October 2026). A typical run of 100 full listings costs $0.32 here against $0.40 on the Free plan and $0.08 against $0.10 on Business.

Until 13 November 2026 the current prices apply: $1.20 per 1,000 listings (Bronze $1.08, Silver $0.96, Gold $0.84) plus $4.44 per 1,000 opened listing pages ($4.00 / $3.56 / $3.11); review rows and calendar rows are billed as listings during this period. The Pricing tab always shows the price in force today.

Bulk export: what 50,000 listings actually cost

This Actor is built for bulk jobs β€” put hundreds of inputs into one run, or call it from the API on a schedule. There is no fee per run, no fee per page and no proxy charge: you pay for the rows you keep, and error rows are free. That is what decides the bill once you pull a whole market rather than a single search.

JobThis ActorMost-used Actor in this category
50,000 full listings with details across 100 runs, Free plan, from 14 Nov 2026$160$200.01
50,000 full listings with details, Business plan, from 14 Nov 2026$40$50.01

Prices checked on the Apify Store on 30 October 2026 against the Actor with the most monthly users in this category; its per-run fee is counted in, as ours would be if we charged one. Some Actors here ask less per row β€” this table compares against the one buyers actually use most.

How to scrape Airbnb listings

  1. Type the place into πŸ“ Where β€” Ubud, Bali, Lisbon, Portugal, Brooklyn, NY. Several places, one per line, run in one go.
  2. Set πŸ“… Check-in and πŸ“… Check-out. Airbnb quotes a price only for a date range; without dates the Actor searches a stay one month out and says so in the log.
  3. Set πŸ‘₯ Adults to the real party size β€” prices change with occupancy.
  4. Choose πŸ’― Maximum listings and πŸ’± Currency.
  5. Switch on πŸ”Ž Open every listing page if you need amenities, description and host.
  6. Click Start, then export from the Output tab or read the dataset through the API.

To use Airbnb's own filters, run the search on airbnb.com, copy the URL from the address bar and paste it into πŸ”— Airbnb URLs β€” every filter in that URL is honoured. Listing URLs pasted there are always opened in full: name, description, amenities, sleeping arrangements, house rules, host, rating and coordinates. Prices are the one thing a listing URL cannot give you β€” Airbnb quotes a stay inside a search, so run a place or a search URL when you need nightly and total price.

⬇️ Input

Airbnb Scraper input form: the fields a buyer fills in before pressing Start

{
"locationQueries": ["Ubud, Bali, Indonesia"],
"checkIn": "2026-12-12",
"checkOut": "2026-12-15",
"adults": 2,
"currency": "USD",
"maxListings": 60,
"includeDetails": false
}

Filtered search from an Airbnb URL

{
"startUrls": ["https://www.airbnb.com/s/Canggu--Bali--Indonesia/homes?checkin=2026-11-03&checkout=2026-11-06&adults=2&min_bedrooms=2&price_max=150"],
"maxListings": 100
}

One listing in full

{
"startUrls": ["https://www.airbnb.com/rooms/1591176990185841592"],
"checkIn": "2026-12-12",
"checkOut": "2026-12-15"
}

Occupancy and minimum stay for a market

{
"locationQueries": ["Seminyak, Bali, Indonesia"],
"maxListings": 100,
"includeCalendar": true,
"calendarMonths": 3
}

Every listing comes back with minNights, availableOnCheckIn and availabilityByMonth β€” a hundred properties' occupancy for the next quarter in one table.

Reviews for a shortlist

{
"startUrls": ["https://www.airbnb.com/rooms/43597370", "https://www.airbnb.com/rooms/1591176990185841592"],
"includeReviews": true,
"maxReviews": 100
}

πŸ’¬ Reviews mode: every review of a listing

{
"mode": "reviews",
"startUrls": ["https://www.airbnb.com/rooms/1369235628901673242", "1444770032031301233"],
"maxReviews": 500,
"sortBy": "LOWEST_RATED"
}

One row per review, worst first. A place works too β€” "locationQueries": ["Ubud, Bali"], "maxListings": 20 reads the reviews of the first twenty listings Airbnb shows. The input of the former Airbnb Reviews Scraper (startUrls + maxReviewsPerListing) runs here unchanged.

πŸ“… Availability calendar mode: occupancy of a market

{
"mode": "calendar",
"locationQueries": ["Seminyak, Bali, Indonesia"],
"maxListings": 100,
"calendarMonths": 6,
"onlyAvailableListings": false
}

One compact row per listing with free and booked nights, the minimum stay, the first free date and occupancy per month for the next six months. Paste listing URLs instead of a place to track named properties.

⬆️ Output

{
"type": "listing",
"listingId": "30279779",
"url": "https://www.airbnb.com/rooms/30279779",
"name": "Hidden Point Villa \"WOODEN HOUSE\"",
"propertyType": "Villa",
"area": "Ubud",
"latitude": -8.5069,
"longitude": 115.2625,
"priceTotal": 159,
"priceOriginal": null,
"pricePerNight": 53,
"priceText": "$159",
"priceQualifier": "for 3 nights",
"currency": "USD",
"nights": 3,
"rating": 4.97,
"reviewCount": 346,
"badges": ["Guest favorite"],
"isGuestFavorite": true,
"bedInfo": ["1 bedroom", "1 queen bed", "1 bath"],
"highlights": ["Free cancellation"],
"images": ["https://a0.muscache.com/im/pictures/…"],
"query": "Ubud, Bali, Indonesia",
"place": "Ubud, Indonesia",
"checkIn": "2026-12-12",
"checkOut": "2026-12-15",
"adults": 2,
"position": 1,
"page": 1,
"scrapedAt": "2026-09-03T14:00:00.000Z"
}

With details on, the same row also carries description, amenities, amenityGroups, hostName, isSuperhost, hostingSince, personCapacity, bedrooms, beds, bathrooms, roomType, ratingAverage, ratingCount, reviewTags, sleepingArrangements, locationText and isExactLocation. A page that could not be read arrives as a type: "error" row with the URL and the reason, never as a silently missing listing.

A review row (Reviews mode):

{
"type": "review",
"listingId": "1369235628901673242",
"listingUrl": "https://www.airbnb.com/rooms/1369235628901673242",
"listingName": "Tiny home in Kecamatan Kuta Utara, Indonesia",
"listingRating": 4.96,
"listingReviewCount": 435,
"listingCity": "Kecamatan Kuta Utara, Bali, Indonesia",
"hostName": "Putu Adi",
"reviewId": "1659269953021095271",
"rating": 3,
"date": "April 2026",
"createdAt": "2026-04-08T08:33:12Z",
"text": "The location and pool suited our needs very well…",
"language": "en",
"reviewerName": "Jenny",
"reviewerLocation": "Sydney, Australia",
"hostResponse": "Thank you for staying with us…",
"photos": []
}

A calendar row (Calendar mode):

{
"type": "listing-calendar",
"listingId": "1779422892946998331",
"name": "Private 1BR Villa Ubud Rice Field & Romantic Stay",
"url": "https://www.airbnb.com/rooms/1779422892946998331",
"minNights": 1,
"maxNights": 365,
"monthsScanned": 2,
"daysScanned": 61,
"availableDays": 20,
"bookedDays": 41,
"occupancyPercent": 67.2,
"firstAvailableDate": "2026-10-30",
"availabilityByMonth": [{ "month": "2026-11", "days": 30, "available": 7, "booked": 23, "occupancyPercent": 76.7 }],
"calendar": [{ "date": "2026-10-30", "available": true, "bookable": true, "checkIn": true, "checkOut": false, "minNights": 1, "maxNights": 365 }]
}

The table views follow the modes: Listings, Details, Reviews (reviews mode), Availability calendar (calendar mode), plus the reviews and months unwound from listing rows.

πŸ” Get only new listings β€” schedule it

A one-off export is useful once; a feed is useful every day. Fill Only new rows β€” memory name (for example my-listings-watch) and the Actor remembers every listing row β€” or, in Reviews mode, every review β€” it has delivered under that name. Known listings are skipped before their pages are opened, so they cost nothing at all. (A calendar changes every day, so Calendar mode always returns every listing.) Every later run with the same name writes β€” and charges β€” only rows you have not received before; rows delivered earlier are skipped for free.

  1. Run once with the memory name to load the history.
  2. Open the run β†’ Actions β†’ Schedule (or Schedules) and set daily or hourly.
  3. Read the new rows from the run's dataset, or connect a webhook, n8n, Make or Zapier to the run.

Each memory name is separate, so one schedule per hotel list, keyword set or market never mixes with another. To start over, use a new name.

Use cases for Airbnb data

Pricing your own place

Pull every comparable listing in your area for the same dates and see where your nightly rate sits, which badges the competition carries, and what they offer that you do not.

Sizing a short-term rental market

Count listings, property types, ratings and prices for a town before buying or managing there. Run it monthly and keep the history.

Watching prices for a trip

Schedule the same search weekly and watch pricePerNight move for the dates you want.

Travel and property products

Feed listings, coordinates and prices into a map, a comparison page or a recommendation model without maintaining a scraper of your own.

AI agents

An agent asked "find me a villa in Ubud with a pool under $80" can call this Actor with the place, dates and a price cap, and filter on amenities.

Integrations and Airbnb API

Run it from the Apify API, the JavaScript and Python clients, a schedule, or a webhook, and push the dataset to Google Sheets, Slack or a database through n8n, Make or Zapier. Airbnb has no public API for this data; the Actor is the practical substitute.

πŸ€– For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (lergassy/airbnb-scraper).

Modes: mode = listings (default), reviews (one row per review) or calendar (one row per listing with availability). Purpose: returns Airbnb listings for a place and a date range, priced for that stay, with rating, location, beds and badges β€” and, on request, the description, amenities, host and capacity of each listing. Use it to answer "what does a stay in X cost on these dates", "which listings in X have a pool and a 4.9+ rating" and "what does this listing offer".

Minimal input:

{ "locationQueries": ["Ubud, Bali, Indonesia"], "checkIn": "2026-12-12", "checkOut": "2026-12-15", "adults": 2 }

Output: one row per listing β€” listingId, url, name, propertyType, area, latitude, longitude, priceTotal, pricePerNight, priceOriginal, currency, nights, rating, reviewCount, badges, isGuestFavorite, bedInfo, highlights, images, place, checkIn, checkOut, adults, position, page, scrapedAt. With includeDetails: true also description, amenities, amenityGroups, hostName, isSuperhost, personCapacity, bedrooms, beds, bathrooms, roomType, ratingAverage, ratingCount, reviewTags, locationText, isExactLocation. Unreadable pages come back as type: "error".

Behaviors an agent should know:

  • Prices exist only for a date range. Pass checkIn and checkOut; without them the Actor picks a stay one month out and logs it. priceTotal is for the whole stay, pricePerNight is derived from it.
  • adults changes the price. Pass the real party size.
  • maxListings (default 60) caps the run; Airbnb serves 18 per page and rarely more than about 270 per search, so ask for a narrower place rather than a bigger number.
  • includeDetails costs one request per listing and is the only way to get amenities, description and host. Leave it off for price comparisons.
  • Airbnb's own filters (price_max, min_bedrooms, room_types[]…) work through startUrls: paste a filtered search URL. priceMin, priceMax, minBedrooms, minBeds, minBathrooms and roomTypes cover the common ones directly.
  • Reviews mode: startUrls with listing URLs or ids, maxReviews (up to 2,000) and sortBy (MOST_RECENT, LOWEST_RATED, HIGHEST_RATED). Calendar mode: startUrls or locationQueries, calendarMonths 1–12 counted from today, onlyAvailableListings.
  • Coordinates are approximate until booking; isExactLocation says whether Airbnb shows the exact spot.
  • rating and reviewCount are empty for new listings without reviews β€” not zero.
  • Apify Proxy is on by default, because Airbnb rate-limits repeat callers by IP address. If Airbnb starts refusing pages mid-run, the Actor moves itself onto residential addresses and carries on; if it is refused there too, the run fails with the reason instead of handing you an empty table that says "succeeded".

Short-term rental data: nightly rates, availability and occupancy

Every listing comes back with the nightly rate and the total price for the dates you asked about, so the same run answers what a place costs and whether it is free. Run a city on a schedule and the results stack into an availability history β€” the raw material for occupancy and pricing research on a market, without paying for a short-term rental analytics subscription.

Rental prices by city, in one table

Give it several places at once and every row carries its own location, dates, currency, property type and bed count. That is a like-for-like comparison of holiday rental prices across cities, which is the question most people are actually asking when they open Airbnb with a spreadsheet next to them.

❓ FAQ

The Actor reads public listing pages and returns the information any visitor sees: prices, ratings, descriptions and amenities. It does not log in, does not collect guest data and does not bypass any access control. How you use the data is subject to your local law and Airbnb's terms β€” consult a lawyer for commercial use at scale.

Why does a listing show a different price on Airbnb?

Prices depend on dates, party size and currency. The Actor quotes the price for exactly the checkIn, checkOut, adults and currency you set; change any of them and the number changes on Airbnb too. Taxes and fees are as Airbnb displays them in the total.

Can I get more than 270 listings for a place?

Yes. Airbnb caps a search at roughly fifteen pages, so the Actor runs the same search again in price bands (Airbnb filters those server-side) and keeps each listing once. Set maxListings to what you need; 400 for Seminyak took 27 pages and 36 seconds. For a very large city, neighbourhoods or several date ranges still add coverage on top.

Do I need a proxy?

No setup needed. Apify Proxy is on by default because Airbnb rate-limits repeat callers by IP address; the moment Airbnb pushes back the run moves itself onto residential addresses, and you pay nothing extra for it. Calendar and review requests go to Airbnb's own API, which answers plain requests, so those modes are fast.

Can I use it with the Apify API or an MCP server?

Yes. It runs from the API and the official clients, and AI agents reach it through the Apify MCP server without extra setup.

Does it return guest reviews?

Yes, two ways. Switch on Guest reviews and each listing row carries its latest reviews (up to 200). Or set "mode": "reviews" for one row per review, up to 2,000 per listing, newest, lowest or highest rated first: rating, date, text, language, reviewer name, location and photo, the photos the guest attached and the host's reply.

Does it return minimum nights and the availability calendar?

Yes β€” switch on Availability calendar and minimum nights. Each listing gets the host's minimum and maximum stay on your check-in date, whether that date is open, a day-by-day calendar for the months you choose, and occupancy per month (the share of days booked or blocked). The most-used Airbnb scraper has an open request for minimum nights that has gone unanswered. For one compact row per listing β€” free and booked nights, first free date, occupancy per month, up to 12 months from today β€” set "mode": "calendar".

Does the calendar include nightly prices?

No. Airbnb no longer sends prices in its availability calendar, so no scraper that reads the calendar can return them honestly. The price for your stay comes from the search: run Listings mode with checkIn and checkOut, several date ranges if you need a price curve.

I used Airbnb Reviews Scraper or Airbnb Listings Scraper β€” what changes?

Only the Actor name. Paste the same input into this Actor: the old fields switch the right mode on by themselves and the rows have the same fields. Both Actors are deprecated and keep running for existing integrations, but new features land here.

Your feedback

Found a place it mis-reads or a field that is empty when it should not be? Open an issue on the Issues tab β€” every one gets answered.

You might also like

ActorWhat it does
Airbnb Availability CalendarCalendar-only door: free and booked nights, minimum stay, occupancy per month
Trip.com ScraperHotel prices and availability for a city and dates
Agoda Reviews ScraperHotel reviews, including the Booking.com reviews shown on Agoda
Google Flights ScraperLive flight prices, layovers and booking options
Email Verifier & Phone Number ValidatorChecks e-mails and phone numbers in bulk

Also known as

People look for this Actor as an Airbnb scraper, an Airbnb listings API, an Airbnb reviews scraper, an Airbnb availability calendar and occupancy scraper, an Airbnb price scraper, a vacation rental data source, a short-term rental scraper, a holiday rental scraper, an STR analytics feed, and a way to get nightly rates and availability by city.

Use via API

Run this Actor from your own code or pipeline. Get your token in Apify Console β†’ Settings β†’ API & Integrations. Every input field below has the same name as in the JSON tab of the input form.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lergassy/airbnb-scraper").call(run_input={
"locationQueries": [
"Seminyak, Bali, Indonesia"
],
"checkIn": "2027-03-15",
"checkOut": "2027-03-20",
"adults": 2,
"maxListings": 60,
"currency": "USD"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lergassy/airbnb-scraper').call({
"locationQueries": [
"Seminyak, Bali, Indonesia"
],
"checkIn": "2027-03-15",
"checkOut": "2027-03-20",
"adults": 2,
"maxListings": 60,
"currency": "USD"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL (runs the Actor and returns the results in one call)

curl -X POST "https://api.apify.com/v2/acts/lergassy~airbnb-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"locationQueries": ["Seminyak, Bali, Indonesia"], "checkIn": "2027-03-15", "checkOut": "2027-03-20", "adults": 2, "maxListings": 60, "currency": "USD"}'