Airbnb Scraper & Price Monitor - Listing Details, Availability avatar

Airbnb Scraper & Price Monitor - Listing Details, Availability

Pricing

from $3.60 / 1,000 listing returneds

Go to Apify Store
Airbnb Scraper & Price Monitor - Listing Details, Availability

Airbnb Scraper & Price Monitor - Listing Details, Availability

For hosts and revenue managers tracking competitor listings: Airbnb listing details by room URL or ID with total and nightly price for your dates, availability and the reason if not, rating, reviews, host, Superhost, bedrooms, amenities. Monitor returns only price, availability or rating changes.

Pricing

from $3.60 / 1,000 listing returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get the details of any Airbnb listing from its room URL or listing number, together with the price for your dates and guests: total price, price per night, nightly rate and price lines, whether it is available (and if not, Airbnb's own reason such as "Those dates are not available" or "Minimum stay is 3 nights"), plus title, property type, guests, bedrooms, beds, bathrooms, rating, category ratings, number of reviews, host display name, Superhost, area and amenities.

Turn on monitor mode and each run returns only the listings whose total price, availability, rating or number of reviews changed since the last run, with the previous values. Every change is read twice before it is reported, and small currency-conversion moves are ignored.

Unofficial. Reads only public Airbnb listing pages (airbnb.com/rooms/...) and the price box those pages load - the parts Airbnb's robots.txt allows. No login, no Airbnb account, no reviews pages, no photo pages, no search pages.

What you get

ColumnExample
listingId, listingUrl, bookingPageUrl53997462, https://www.airbnb.com/rooms/53997462
title, titleOriginalCozy apartment at historical center (titleOriginal is the host's own language when Airbnb shows an English translation)
headline, propertyType, roomTypeEntire condo in Thessaloniki, Greece; Entire condo; Entire home/apt
personCapacity, bedrooms, beds, bathrooms, bathroomLabel, overviewItems3 guests, 1 bedroom, 2 beds, 1 bath (bedrooms is 0 for a studio; null when Airbnb does not show it, as for many private rooms)
checkIn, checkOut, nights, adults, children, infants, pets, currencythe stay the price is for
available, unavailableReasontrue - or false with "Those dates are not available", "Minimum stay is 100 nights", "Maximum number of guests is 1"
totalPrice, totalPriceText, priceQualifier, nightsQuoted216, "$216", "for 3 nights", 3
pricePerNight, nightlyRate, nightlyRateText72 (total ÷ nights), 71.7, "$71.70"
priceLines[{ "description": "3 nights x $71.70", "amountText": "$215.10", "amount": 215.1 }] - the price details Airbnb shows
originalTotalPrice, priceNote, displayPriceStyle, stayAsRequestedthe struck-through price when Airbnb shows a discount; Airbnb's note; stayAsRequested is false if Airbnb priced a different number of nights than you asked
rating, reviewCount, categoryRatings4.95 from 75 reviews; { cleanliness 4.92, accuracy 4.89, checkIn 4.97, communication 5, location 4.99, value 4.93 }
isGuestFavorite, isNewListingtrue, false
hostName, isSuperhost, hostYearsHostingAlexia, true, 5 - the host's display name only
location, city, latitudeApprox, longitudeApproxThessaloniki, Greece; 40.63, 22.95 (rounded to 2 decimals, about 1 km)
amenitiesKitchen, Wifi, Dedicated workspace, Air conditioning, ... (only the ones marked available)
checkInTime, checkOutTime, maxGuestsRule, petsRule, thumbnailUrlCheck-in after 3:00 PM; Checkout before 11:00 AM; 3 guests maximum; No pets
changeType, changedFields, previousValues, previousCheckedAtwith a watch: changed, ["totalPrice"], { "totalPrice": 216 }

totalPrice is exactly the total Airbnb shows in the booking box for the stay (for example "$216 for 3 nights"). Airbnb rounds the displayed total; priceLines keeps the unrounded lines it shows. Whether taxes are included depends on the country and on how Airbnb displays prices for that stay; displayPriceStyle and priceNote carry what Airbnb says.

Input

FieldWhat it does
listingsAirbnb listing URLs or listing numbers, one per line. Any Airbnb country domain works (airbnb.co.uk, airbnb.de, ...) and anything after ? is ignored. Up to 500 per run. Empty = three example listings. Search pages, experiences, wishlists, host profiles and /h/ short links are not read.
checkIn, checkOutDates of the stay: YYYY-MM-DD or +N days from today. Empty = 30 days from today for 2 nights; only checkIn = 1 night. At most 90 nights.
adults, children, infants, petsGuests. Default 1 adult. Too many guests or pets comes back as unavailable with Airbnb's reason.
currency3-letter code such as USD, EUR, GBP, CAD, AUD, JPY. Default USD.
onlyChangesMonitor mode. Return only listings that changed (or are new to the watch). The first run returns every listing as the starting point.
watchNameName of the remembered state, so different lists can be watched on their own schedules. Different dates, guests or currency are remembered separately.
minPriceChangePercentMonitor mode: smallest total price move to report, in percent. Default 1. 0 reports every change.
resetMonitoringStateForget what the watch remembered and start over.

Example - one listing for fixed dates:

{ "listings": ["https://www.airbnb.com/rooms/53997462"], "checkIn": "2026-12-18", "checkOut": "2026-12-21", "adults": 2, "currency": "EUR" }

Example - a daily price and availability monitor for a competitor set, always 14 days ahead for 2 nights:

{ "listings": ["53997462", "12937", "1142713268362716050"], "checkIn": "+14", "checkOut": "+16", "adults": 2, "onlyChanges": true, "watchName": "comp-set" }

With relative dates (+14), the watch compares "the stay 14 days from today" run after run: a price change then also includes the effect of the date moving forward. Use fixed dates to follow one exact stay.

Monitor mode: what counts as a change

Compared fields: totalPrice, available, rating, reviewCount.

  • Every change is confirmed by reading the listing a second time; only fields that show the same new value in both reads are reported. If the second read fails, the change is not reported, charged or remembered, and a free unreadable row says so; the next run checks the listing again.
  • Small price moves are ignored: a total price move smaller than minPriceChangePercent (default 1%) is not reported. Airbnb converts prices into your currency with a rate that moves every day, so a listing priced in euros shown in dollars moves by cents daily. The remembered price stays the same until the move passes the threshold, so a slow drift is still reported once it adds up.
  • Going from unavailable to available (or back) is reported as a change of available and totalPrice.
  • Not compared: title, amenities, host, photos and the text of the unavailability reason.

How it behaves when something goes wrong

  • The listing does not exist or was removed (Airbnb shows its "404 Page Not Found" page): a free not-found row. Not retried.
  • Airbnb redirects the listing to a search or another page: a free redirected row that says where it was sent.
  • The page or the price could not be read after asking again (twice directly, twice through a datacenter IP, then a residential IP - at most 10 residential requests per run): a free unreadable row. A listing without a readable price is never sold without its price and never reported as "unavailable". It is not remembered, so a later run returns it.
  • A check page / CAPTCHA: this Actor does not solve or bypass it. It stops, writes a free blocked row and charges nothing for that listing.
  • Your maximum charge per run is reached: it stops before reading listings it could not bill, says so in a free budget-reached row and does not remember them.
  • Bad input (a search URL, a date in the past, check-out before check-in, an unknown currency code): a free bad-input row, nothing is requested.
  • Airbnb answers in another currency than you asked for (it silently falls back to US dollars for codes it does not support): the price is not sold under the wrong currency name; a free unreadable row says which price was shown.
  • A run that could not read anything and charged nothing ends with a failed status, so your integration sees it.

Pricing

Pay per event:

  • Run start - once per run that returns at least one listing (in monitor mode: once per run that read and compared at least one listing).
  • Listing returned - per listing row (available or not - "not available for these dates" is an answer).
  • Listing checked - monitor mode only, per listing that was read and had no change (the listing is not returned as a row).

Rows that explain a missing listing, an unreadable page, bad input, no change or a reached limit are free. The exact prices are on the Pricing tab.

Notes and limits

  • Data is what Airbnb shows on the public listing page, in English (en-US). The price is what Airbnb shows a signed-out visitor for your dates, guests and currency; a signed-in guest can see other prices (for example member discounts).
  • Measured on 2026-09-25 from inside Apify: listing pages 10 of 10 read directly, 10 of 10 through a US datacenter IP and 10 of 10 through a residential IP; the price box 10 of 10 on each. No check page appeared. 18 listings took 50 seconds (about 3 seconds per listing, all read directly).
  • Checked against the Airbnb page in a browser for 16 listings (title, rating, reviews, host, and the price or the unavailability message) in USD, GBP and JPY: all matched.
  • One listing is two requests (the listing page and its price box), about 90 KB.
  • Coordinates are rounded to 2 decimals on purpose. Host contact details are not collected; only the display name.
  • This Actor does not read reviews, photo pages or search results (Airbnb's robots.txt disallows them). Bring the listings you want to read.
  • Two schedules writing the same watchName at the same moment can overwrite each other's memory; give each schedule its own watch name.
  • The watch memory and the run's position are saved every 25 listings and again when Apify signals that it is stopping or moving the run; a run that Apify moves to another server continues from the saved position instead of starting over.

Support

Found a listing that is read wrongly? Open an issue in the Issues tab with the listing URL, your input and the run ID.