Airbnb Daily Rate & Comp-Set Price Tracker
Pricing
$0.50 / 1,000 row saveds
Airbnb Daily Rate & Comp-Set Price Tracker
Track Airbnb nightly rates for any market or pinned comp set across many check-in dates and stay lengths. Every row carries the nightly and total price, discounts, promotions, ratings and the move since your last run, plus a median, quartile and spread summary for each date. No account needed.
Pricing
$0.50 / 1,000 row saveds
Rating
0.0
(0)
Developer
Hamza
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Watch what Airbnb is actually charging. Pick a market — "Paris, France", "Austin, Texas", a neighbourhood drawn on the map — choose how far ahead you want to look and how long a stay you want quoted, and every run comes back with one row per listing per date window: the nightly figure, the stay total, the discount and how big it is, the promotions and badges on the card, the rating and review count, and how the price moved since the last time you looked. Each date window also gets a market summary row with the median, quartile, minimum and maximum nightly figures, so you can see the whole distribution and not just your own neighbours. Pin a comp set of listings and you get a rate sheet for exactly those properties, every day, with the ones that sold out flagged instead of silently missing. No Airbnb account, no login, nothing to connect.
What you can do with it
- Price your own listing against its real comp set. Pin the ten properties you lose bookings to, run it every morning, and see the day they cut their nightly figure.
- Read the booking curve. Price the same market 7, 14, 30, 60 and 90 days out in one run and watch how far in advance rates firm up in your area.
- Catch discounts the day they start.
newlyDiscountedanddiscountEndedfire only on the run where the change happened, so a daily digest is short and readable. - Benchmark a whole market. The per-window summary gives you the median, the quartiles and the spread for every date you price, so you can say "we are 12 % over the median for late September" with a number behind it.
- Compare neighbourhoods. Add map areas and each one gets its own median for the same dates.
- Track weekend versus midweek pricing. Every row carries the check-in day of the week and the stay length, so a two-night Friday and a five-night Monday are separate, comparable series.
- Feed a pricing model or a dashboard. Schedule it, keep the tracker name stable, and each run appends a fresh, dated slice with the change already computed.
What you get
One row per listing per date window. Abridged example:
{"recordType": "priceRow","listingId": "1458002116719302934","listingUrl": "https://www.airbnb.com/rooms/1458002116719302934","listingName": "Central sunny studio- terrace","title": "Apartment in 2nd Arrondissement","roomTypeText": "Apartment","latitude": 48.86977,"longitude": 2.34259,"checkIn": "2026-09-10","checkOut": "2026-09-14","nights": 4,"quotedNights": 4,"leadTimeDays": 30,"dayOfWeekCheckIn": "Thursday","nightlyAmount": 196.57,"totalAmount": 787,"originalTotalAmount": null,"discountAmount": null,"discountPct": null,"priceLineType": "QualifiedDisplayPriceLine","priceLabel": "$787 for 4 nights","currency": "USD","promotions": [{ "type": "PAY_ZERO_UPFRONT_HIGHLIGHT", "text": "Pay $0 today" },{ "type": "FREE_CANCELLATION_HIGHLIGHT", "text": "Free cancellation" }],"badges": ["Guest favorite"],"isGuestFavorite": true,"freeCancellation": true,"ratingLocalized": "4.95 (42)","ratingValue": 4.95,"reviewCount": 42,"previousNightlyRate": 188.25,"priceChangePct": 4.42,"comparisonBasis": "sameLeadTime","newlyDiscounted": false,"discountEnded": false,"firstSeen": "2026-07-24T06:02:11.104Z","lastSeen": "2026-07-30T06:01:58.771Z","runsObserved": 7,"notFoundInWindow": false,"market": "Paris, France","priceBandUsed": "80-400","scrapedAt": "2026-07-30T06:01:58.771Z"}
And one summary row per date window:
{"recordType": "windowAggregate","market": "Paris, France","checkIn": "2026-09-10","checkOut": "2026-09-14","nights": 4,"leadTimeDays": 30,"listingsPriced": 187,"medianNightly": 300.05,"p25Nightly": 238.01,"p75Nightly": 340.36,"minNightly": 196.57,"maxNightly": 380.16,"discountingSharePct": 37.5,"medianDiscountPct": 12.98,"freeCancellationSharePct": 87.5,"currency": "USD","medianNightlyPreviousRun": 291.4,"medianChangePct": 2.97,"medianComparisonBasis": "sameLeadTime","scrapedAt": "2026-07-30T06:01:58.771Z"}
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
query | string | Paris, France | The market to price, written the way you would type it into Airbnb. Always used, including alongside map areas — without it the rows lose their property-type line and review counts. |
bboxes | list | empty | Optional map areas, each priced separately so a big city can be split into neighbourhoods. Give "neLat,neLng,swLat,swLng" or an object with those four keys. Up to 10. |
listingIds | list of strings | empty | Optional comp set: numeric listing ids or room addresses. Only these listings are written as rate rows, and one with no availability in a window is still written with notFoundInWindow set. Up to 500. |
leadTimeDays | list of integers | [7, 14, 30, 60, 90] | How far ahead of today each check-in sits. Up to 8 values, each 0–365. |
stayLengths | list of integers | [2, 5] | How many nights each quoted stay covers. Up to 4 values, each 1–28. |
adults | integer | 2 | Guest count the prices are quoted for. Keep it stable between runs or the series stops being comparable. |
priceMin / priceMax | integer | empty | Restrict the comp set to a nightly price band. Bands also let you see deeper into a busy market: run the same market once per band and merge. Up to 100,000. |
roomTypes | list | empty | Entire home or apartment, private room, shared room, hotel room. |
minBedrooms | integer | empty | Only price listings with at least this many bedrooms. Up to 20. |
maxListingsPerWindow | integer | 200 | How many listings to price for each check-in and stay length. Up to 1,000. |
stateKey | string | default | Names the price history this run compares against. Same name builds a series; a different name tracks a second market independently. |
minChangePctToFlag | integer | 1 | How far a nightly figure has to move before it counts as a change. Up to 100. |
emitUnchanged | boolean | true | On, every priced listing is written every run. Off, only listings whose price moved, whose discount started or ended, or that are newly seen — a much smaller daily digest. The per-window market summaries are written either way, so the medians never have a gap. |
maxRequests | integer | 400 | Safety cap on how much work one run may do, up to 4,000. Checked before anything starts: coverage inside each window is trimmed first, then the longest-lead dates are dropped, so the near-term dates always survive. |
| Date windows in parallel | integer | 4 | How many date windows are priced at the same time, up to 8. Higher is faster and heavier on the source site. |
currency | string | USD | Currency every price is quoted in. Pin it and keep it fixed. |
locale | string | en | Language for the text Airbnb returns. English is the tested option. |
proxyCountry | string | us | Country to appear to browse from. |
Output fields
| Field | Type | Description |
|---|---|---|
recordType | string | priceRow for a listing, windowAggregate for a market summary. |
listingId / listingUrl | string | Airbnb listing id and a direct link to it. |
listingName / title / roomTypeText | string | Listing name, Airbnb's property-and-area line, and the property type pulled out of it. |
latitude / longitude | number | Listing coordinates. |
checkIn / checkOut / nights / leadTimeDays / dayOfWeekCheckIn | date / number / string | The exact stay you asked to have priced, and how far ahead of the run it sat. nights always equals checkOut minus checkIn. |
quotedNights | number | The stay length Airbnb's own price line described. Normally identical to nights; when it differs, the figures on that card are for a different stay length than the one you asked for. |
nightlyAmount / totalAmount | number | Price per night and for the whole stay. |
originalTotalAmount / discountAmount / discountPct | number | Pre-discount total and the size of the discount, only when there genuinely is one. |
priceLineType / priceLabel | string | Which of Airbnb's two price presentations the row used, and the exact wording it showed. |
currency | string | Currency the figures are in. |
promotions | array | Promotion pills on the card, such as Pay $0 today or Free cancellation. |
badges / isGuestFavorite / freeCancellation | array / boolean | Badges shown on the card and the two flags most people filter on. |
ratingLocalized / ratingValue / reviewCount | string / number | Rating as Airbnb wrote it, and as numbers. A brand-new listing shows New and no numeric rating. |
previousNightlyRate / priceChangePct | number | What this listing cost on the previous run of the same tracker, and the percentage move. |
comparisonBasis | string | How that comparison was made: sameDates when the very same stay dates were priced before, sameLeadTime when the previous run looked the same distance ahead for the same stay length, and empty when there was nothing to compare against. |
newlyDiscounted / discountEnded | boolean | True only on the run where the discount started or stopped. |
firstSeen / lastSeen / runsObserved | date / number | When this listing-and-date pair first and last had a price, and how many runs have priced it. |
notFoundInWindow | boolean | True when a pinned listing had no availability for those dates. |
market / priceBandUsed | string | Which market or map area produced the row, and the price band it was collected under. |
listingsPriced | number | Summary rows: how many listings the distribution is based on. |
medianNightly / p25Nightly / p75Nightly / minNightly / maxNightly | number | Summary rows: the market distribution for that date window. |
discountingSharePct / medianDiscountPct / freeCancellationSharePct | number | Summary rows: how much of the market is discounting, by how much, and how much offers free cancellation. |
medianNightlyPreviousRun / medianChangePct / medianComparisonBasis | number / string | Summary rows: the market median on the previous run, the move, and which of the two comparisons above produced it. |
scrapedAt / actorRunId | date / string | When the row was collected, and which run produced it — so several days of output can be merged and still be told apart. |
Pricing
This actor is pay per event, and there is exactly one event: Row saved, at $0.0005 — $0.50 per 1,000 rows. It fires once for every row written to the dataset, whether that row is a priced listing, a pinned listing that had no availability, or a market summary. Nothing else is ever charged.
A 200-listing comp set across 10 date windows produces 2,000 rows and costs about $1.00. A daily digest with unchanged rows switched off costs a fraction of that, because only the listings that actually moved are written. A window where Airbnb has nothing to show writes nothing and therefore costs nothing.
Single-tier pricing is deliberate. Every row this actor produces arrives dozens at a time in the same batch, so a second, dearer charge would be a markup with no extra effort behind it. Change detection is free: comparing today's rate sheet with yesterday's costs nothing to do, so it is not billed.
Limits & what this actor cannot do
- Airbnb shows only a few hundred listings for any one search, and repeats itself past that point. A wide market is covered by splitting it into price bands and map areas and merging the results, which reduces but does not remove the ceiling. A run over a very large city is a large, well-distributed sample, not a census.
- Cleaning and service fees are not itemised. The nightly figure Airbnb publishes is already all-in for the stay it quotes, and taxes are not shown at all. There is no way to split it into a base rate plus fees from public information.
- A pinned listing with no availability for your dates will not appear in that
window's market results, and is written with
notFoundInWindowset instead. A blank there means "not bookable for these dates", not "no longer on Airbnb". - Change detection compares against the previous run of the same tracker name, so the first run reports no changes at all, and renaming the tracker starts a fresh history.
- Dates move with the run. You choose how many days ahead to look, so a tracker run again tomorrow is looking at stays one day later. When the very same dates have been priced before, the comparison is date-for-date; otherwise it is like-for-like — the same listing, the same distance ahead, the same stay length — which is the comparison a revenue manager actually wants. Every row says which of the two it used, so the two are never silently mixed.
- Prices are what Airbnb shows for the dates, guest count and currency you choose. Change any of those between runs and the series stops being comparable — which is why the guest count and the currency are pinned inputs.
- Airbnb's own results move between identical searches, so a market median is a snapshot of what was on offer at that moment, not an audited figure.
- English is the tested language. Other languages are accepted but the text Airbnb returns for them has not been verified.
- Speed depends on the size of the job and on Airbnb's own response times. No fixed throughput is promised.
- Airbnb's terms prohibit automated access. You are responsible for using the data lawfully and in line with the source site's terms, including how you store and share it.
FAQ
Do I need an Airbnb account? No. None, and there is nothing to connect.
Does it need a login or any personal details? No. Just run it — the only thing you supply is what you want priced.
Can I schedule it?
Yes, and that is where it is most useful. Keep stateKey the same between runs
and each run compares itself against the one before: previousNightlyRate,
priceChangePct, newlyDiscounted and discountEnded are filled in for you.
Because the dates you ask for are relative to the day of the run, a daily
tracker's comparison is normally like-for-like — the same listing at the same
number of days ahead for the same stay length — and it switches to a
date-for-date comparison whenever those exact dates have been priced before.
comparisonBasis tells you which happened on every row. Switch emitUnchanged
off and a daily run writes only what moved, plus the market summary for each date
so your medians stay unbroken.
Is the data complete? For a pinned comp set, yes — those listings are looked for in every window you ask for, and one that is missing is reported as missing. For a whole market, no: Airbnb shows only a few hundred listings per search, so a market run is a large sample, widened by price bands and map areas. Every row says which market or map area and which price band produced it, so you always know what the numbers cover.
Why does a listing sometimes show no discount when Airbnb shows a crossed-out price? A discount is only reported when the pre-discount total is genuinely higher than what is being charged. Equal figures are not a discount, so nothing is reported rather than a misleading 0 %.
Can I track more than one market or comp set?
Yes. Give each one its own stateKey and their histories stay separate, even
running on the same schedule.