Airbnb Market & Nightly Rate Scraper
Pricing
from $0.80 / 1,000 stay scrapes
Airbnb Market & Nightly Rate Scraper
Scrape Airbnb stays with the real nightly rate, taxes, fees and total as separate figures that add up - plus rating, reviews, capacity and coordinates. Median rate per market. Every breakdown is checked against its own total and withheld rather than guessed. Global. No API key.
Pricing
from $0.80 / 1,000 stay scrapes
Rating
0.0
(0)
Developer
Eimantas V
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
What a stay actually costs per night — with the tax, fee and discount lines that make up the total, plus a median-rate summary for the whole market.
Austin, TX 72 stays median $217.70/night total $1,258 rating 4.93Paris, France 72 stays median $146.13/night total $ 824 rating 4.88Lisbon, Portugal 72 stays median $134.24/night total $ 684 rating 4.81Studio Haus | Short Drive to ACL 5 nights x $284.20 = $1,421.00+ taxes $241.57 = $1,662.57 total · 4.68 (189 reviews) · 1 bedroom, 1 bath
216 stays across three countries in 15 seconds. No browser, no API key, no login.
The nightly rate is read, not guessed
Most scrapers report the headline price and stop. This one takes Airbnb's own breakdown apart, so you get nightlyRate, accommodationTotal, discount, fees and taxes as separate numbers that add up to totalPrice.
That matters because dividing a total by nights gives a figure nobody is ever quoted — the total already carries cleaning fees, resort fees and tax. Across 216 live stays, every row reconciled: subtotal − discount + fees + taxes = total.
What you get
Per stay
| Group | Fields |
|---|---|
| Pricing | nightlyRate, nights, accommodationTotal, discount, fees, feeLabels, taxes, totalPrice, currency |
| Quality | rating, reviewsCount, isGuestFavorite, isNewListing, badges |
| Property | propertyType, bedText, bedrooms, beds, bathText, bathrooms, isSharedBath |
| Location | listingCity, latitude, longitude |
| Identity | listingId, listingUrl, name, thumbnailUrl |
Per market — median nightly rate, median total, rate range, median rating and review count, Guest Favourite count, unreviewed-supply count, and the whole-property vs private-room split. Medians throughout: one penthouse moves a mean and not a median.
Who this is for
- Short-term rental investors — median $/night by market is the revenue half of a yield model. Pair it with a purchase price and you have a cap rate.
- Revenue managers — track your market's median rate weekly and see where you sit in the range.
- Hosts — find what comparable listings with your bed count charge on your dates.
- Travel and analytics teams — coordinates on every row, stable
listingIdfor clean diffs across runs.
Input
{"locations": ["Austin, TX", "Paris, France"],"checkIn": "2026-10-10","checkOut": "2026-10-15","adults": 2,"currency": "USD","maxListingsPerLocation": 180}
A plain place name is enough — "Austin, TX", "Paris", "Lisbon, Portugal". Paste an airbnb.com/s/... URL instead if you have already filtered it on the site.
| Option | Default | Notes |
|---|---|---|
checkIn / checkOut | — | Strongly recommended. See below |
adults / children / infants / pets | 2 / 0 / 0 / 0 | Changes which stays qualify and what they cost |
currency | USD | Always sent; see below |
roomTypes | all | entire-home, private-room, shared-room, hotel |
minPrice / maxPrice | — | Also the way past the search-depth ceiling — run price bands |
minBedrooms / minBeds / minBathrooms | — | Applied by Airbnb before billing |
superhostOnly | false | |
maxListingsPerLocation | 180 | 270 is Airbnb's hard ceiling per search |
maxConcurrency | 3 | Deliberately low; see below |
Five things worth knowing
Each was found by running against live data.
Without dates, Airbnb invents the window. It always quotes something. Left to itself it picks its own stay length and applies its own long-stay discounts, so the same market scraped twice a week apart is not comparable, and two markets scraped in one run may be priced over different numbers of nights. Every record carries nights and datesWereRequested so you can tell. Pin checkIn and checkOut and the problem disappears. Half a range is no better than none — Airbnb ignores a lone check-in, so the Actor drops it rather than label its own guess with your date.
Currency follows the IP unless you pin it. An Austin search run from a European exit came back in euros. The Actor sends currency on every request for that reason, and locale=en with it so that "1.234" cannot mean one thousand on one row and one-point-two on the next.
Airbnb re-ranks between requests, so pages overlap. Consecutive pages repeated 2 of 18 results on one hop, and a three-market run turned up 29 duplicates in 245 fetched rows — 12%. They are removed by listing id, are not charged, and are counted in the log. Left in, they would inflate the count and pull the median toward whatever the ranker currently favours.
Airbnb does not always send the same payload, so the breakdown checks itself. Most responses carry a full price explanation. Some carry a reduced one — no tax line, no Total line, and on one platform run a positive line equal to the whole subtotal, which naively read would have reported a $2,291 discount on a $2,291 stay. Every record is therefore checked against its own total: if subtotal − discount + fees + taxes does not reach totalPrice, the components are set to null and priceBreakdownComplete is false. nightlyRate, accommodationTotal and totalPrice are read directly and always stand. The same reduced payload omits the card title, which is where propertyType and listingCity come from — the summary reports that as typeUnknown rather than letting the type counts quietly fall short. A residential proxy returns the full payload more often than a datacenter one.
Search stops at 15 pages. That is 270 stays per search, and it is Airbnb's limit, not a setting. Markets that hit it are flagged truncated: true. The way past it is to split the market into price bands, or to search neighbourhoods rather than a whole city.
Output
{"recordType": "listing","listingId": "1239199837879387949","name": "Studio Haus | Short Drive to ACL + Walk to Brewery","propertyType": "Apartment", "listingCity": "Austin","latitude": 30.262, "longitude": -97.7229,"nightlyRate": 284.2, "nights": 5,"accommodationTotal": 1421, "taxes": 241.57, "totalPrice": 1662.57,"currency": "USD", "datesWereRequested": true,"rating": 4.68, "reviewsCount": 189, "isGuestFavorite": true,"bedText": "1 bedroom", "bathText": "1 bath", "bathrooms": 1}
Three ready-made views: Stays, Price breakdown and Market summary. Set flattenOutput: true for CSV.
Honest limits
bedroomsandbedsare never inferred from each other. Airbnb publishes whichever it has — "1 queen bed" for one listing, "2 bedrooms" for the next — and converting one into the other would invent a number the host never stated. The rawbedTextis kept alongside.- A city search reaches past the city. An Austin search returns Pflugerville and Cedar Park; a Paris one returns Aubervilliers and Saint-Ouen.
listingCitysays which, so you can filter. - Prices are what Airbnb quotes for your dates and party size, not a historical average and not an occupancy figure.
- No amenities, host details or review text. Those live on the individual room page, which costs several hundred kilobytes each; this Actor stays on search results, which is what makes it cheap.
totalPricecomes from Airbnb's exact Total line where one exists, falling back to the rounded headline where it does not.propertyTypeandlistingCitycome from Airbnb's card title, which is absent on some responses. Null rather than parsed out of a host's marketing headline, and counted astypeUnknownon the summary.- Blocked markets, empty markets and duplicate rows are never charged.
Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Once per run |
| Market scraped | $0.006 | Per market paged and summarised |
| Stay scraped | $0.0008 | Per stay returned, after filters |
$0.80 per 1,000 stays. A 20-market weekly tracker at 180 stays each costs about $3.00 a run. AirDNA and Mashvisor start at $20–100 a month per market.
Tips
- Scrape the same dates weekly and diff on
listingId. Rising median rate with steady supply is a market tightening; rising supply with a flat rate is the opposite. - Watch
newListings. Unreviewed stays are supply that has just arrived — the leading indicator of a market getting more competitive. - Compare
nightlyRateagainsttotalPrice / nights. The gap is the fee load, and a market with a high one is a market where guests are quietly paying more than the headline. - Run one search per price band to get past the 270 ceiling and see how each tier moves separately.
- Pair with a for-sale price to turn a median nightly rate into a yield: 180 nights x median rate, against the purchase price.
