Airbnb Occupancy & Revenue Estimator
Pricing
from $0.60 / 1,000 result rows
Airbnb Occupancy & Revenue Estimator
Score any Airbnb market or your own listings on a full year of availability: 30/60/90-day and 12-month occupancy, minimum-stay rules, first free night, plus estimated revenue, ADR and RevPAR from nightly rates observed for the dates you pick. Per-month breakdowns and market medians included.
Pricing
from $0.60 / 1,000 result rows
Rating
0.0
(0)
Developer
Hamza
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
Turn any Airbnb market — or your own list of listings — into a spreadsheet of occupancy and earning power. For every listing you get a full year of availability condensed into one row: how booked up it is over the next 30, 60 and 90 days and across twelve months, its minimum-stay rules, its first free night, its longest open gap, and an estimated revenue figure built from the nightly rate that listing was actually advertising for the dates you choose. Built for short-let investors, property managers, revenue managers and analysts who need to know what a street, a neighbourhood or a competitor is really earning.
What you can do with it
- Underwrite a purchase. Pull every comparable listing in a postcode and read median occupancy, median nightly rate and implied RevPAR before you commit.
- Benchmark your own listings. Drop your portfolio in and see, listing by listing, whether you are more or less booked than the market around you.
- Find the soft months. The per-month breakdown shows exactly where a property empties out, so you can move pricing or minimum stays before it does.
- Size a market. Market rollups give you occupancy and rate medians split by month, by bedroom count and by map area, without any spreadsheet work.
- Spot the professional operators. Long minimum stays, year-round saturation and no gaps look very different from an occasional host renting out a spare room.
- Track a market over time. Schedule it weekly and keep a history of how occupancy and rates move in the areas you care about.
What you get
One row per listing. Abridged, with real values:
{"recordType": "listing","listingId": "1458002116719302934","listingUrl": "https://www.airbnb.com/rooms/1458002116719302934","listingName": "Central sunny studio- terrace","title": "Apartment in 2nd Arrondissement","neighbourhood": "2nd Arrondissement","latitude": 48.86977,"longitude": 2.34123,"roomType": "Entire home/apt","propertyType": "Entire rental unit","personCapacity": 4,"bedrooms": 1,"beds": 1,"bathrooms": 1,"ratingLocalized": "4.95 (42)","ratingValue": 4.95,"reviewCount": 42,"isGuestFavorite": true,"badges": ["Guest favorite"],"nightlyRate": 196.57,"currency": "USD","rateSource": "datedSearch","rateObservedForCheckIn": "2026-09-10","rateObservedForCheckOut": "2026-09-14","totalForRateWindow": 787,"originalTotalForRateWindow": null,"discountPct": null,"promotions": [],"calendarStart": "2026-08-01","calendarEnd": "2027-07-31","nightsObserved": 365,"nightsElapsedSkipped": 0,"availableNights": 112,"unavailableNights": 253,"occupancyRate": 0.6932,"occupancyNext30": 0.4,"occupancyNext60": 0.45,"occupancyNext90": 0.4556,"firstAvailableDate": "2026-08-01","longestAvailableRunNights": 76,"medianMinNights": 3,"modalMinNights": 3,"minNightsDistribution": [{ "minNights": 1, "nights": 12 },{ "minNights": 2, "nights": 15 },{ "minNights": 3, "nights": 338 }],"maxNightsObserved": 45,"closedToArrivalNights": 0,"closedToDepartureNights": 0,"calendarNightsWithPublishedPrice": 0,"monthly": [{"month": "2026-08","nightsObserved": 31,"availableNights": 19,"unavailableNights": 12,"occupancyRate": 0.3871,"estimatedRevenue": 2358.84}],"estimatedRevenue12mo": 49732.21,"estimatedRevenueNext30": 2358.84,"estimatedRevenueNext90": 8059.37,"estimatedAdr": 196.57,"estimatedRevPar": 136.25,"revenueIsEstimate": true,"revenueMethod": "unavailableNights × observed nightly rate","bookedVsBlockedSeparable": false,"market": "Paris, France","bboxUsed": null,"scrapedAt": "2026-07-30T09:14:22.108Z"}
Alongside the listing rows, every run also writes market rollup rows
(recordType: "marketRollup") holding median occupancy, median nightly rate,
implied RevPAR and listing counts — for the whole market, for each month, for
each bedroom count and for each map area you covered. Turning on
includeNightRows adds one row per listing-night (recordType: "night") with
that night's availability, check-in and check-out eligibility and stay limits.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
query | string | Paris, France | The market to study — a city, neighbourhood, region or postcode, written the way you would type it into the site. Always used, including alongside a map area. |
bbox | object | — | A map area to restrict the study to, as neLat, neLng, swLat, swLng. |
listingUrls | array | [] | Study a fixed set of listings instead of a market. Accepts room addresses. Up to 2,000. |
listingIds | array | [] | The same, as plain numeric listing ids. Up to 2,000. |
rateCheckIn | date | today + 30 days | The check-in date the nightly rate is observed for. Left blank it rolls forward automatically, so a scheduled run never goes stale. |
rateStayLength | integer | 4 | Length of the stay the rate is observed for, in nights. Max 28. |
adults | integer | 2 | Guest count the rate is quoted for. Max 16. |
horizonMonths | integer | 12 | How many months of availability to read, up to a year. |
calendarStartMonth | string | current month | First month of the availability window, as YYYY-MM. |
priceMin / priceMax | integer | — | Restrict the study to a nightly price window. Also used to divide a large market into slices. Max 100,000. |
roomTypes | array | [] | Restrict to particular room types. Entire home/apt is the confirmed value; others are passed through as given. |
minBedrooms | integer | — | Only listings with at least this many bedrooms. Max 20. |
maxListings | integer | 200 | How many listings to score. Max 2,000. |
includeMonthlyBreakdown | boolean | true | Nest the month-by-month occupancy and revenue inside each listing row. Costs nothing extra. |
includeNightRows | boolean | false | Also write one row per listing-night. This multiplies your row count by up to 365 per listing — leave it off unless you need night-level detail. |
includePdpDetails | boolean | false | Also read each listing's own summary for guest capacity, property type, bedrooms, beds and bathrooms. Adds work per listing. |
maxRequests | integer | 1200 | Upper limit on how much work a single run may do, as a safety net. Max 12,000. |
| Parallel listings | integer | 4 | How many listings are worked on at the same time. Max 8. |
currency | string | USD | Currency all prices are reported in. |
locale | string | en | Language for listing names and labels. |
proxyCountry | string | — | Country to appear to browse from. |
Output fields
| Field | Type | Description |
|---|---|---|
recordType | string | listing, marketRollup or night |
listingId / listingUrl / listingName / title | string | Identity, address and the listing's own headline and room-type line |
latitude / longitude / neighbourhood | number / string | Location |
roomType / propertyType / personCapacity | string / number | Category and guest capacity |
bedrooms / beds / bathrooms | number | Layout, from the listing's own summary line |
ratingLocalized / ratingValue / reviewCount | string / number | Rating as shown, as a number, and the review count |
isGuestFavorite / badges | boolean / array | Recognition the listing carries |
nightlyRate / currency | number / string | The nightly rate observed for your chosen dates |
rateSource | string | Where the rate came from; blank when none was observed |
rateObservedForCheckIn / rateObservedForCheckOut | date | The exact window the rate was observed in |
totalForRateWindow / originalTotalForRateWindow / discountPct | number | Stay total, the pre-discount total where one was shown, and the saving |
promotions | array | Any promotion wording shown on the listing |
calendarStart / calendarEnd / nightsObserved | date / number | The availability window actually measured, counted forward from the day the run starts |
nightsElapsedSkipped | number | Nights the published window contained that had already passed when the run began, and were therefore left out |
availableNights / unavailableNights | number | Open nights and nights not open to the public |
occupancyRate | number | unavailableNights over nightsObserved, 0–1 |
occupancyNext30 / occupancyNext60 / occupancyNext90 | number | The same over the next 30, 60 and 90 nights, counted from the day the run starts. Blank if the window you chose is shorter than that, rather than a shorter figure under a longer name |
firstAvailableDate / longestAvailableRunNights | date / number | First free night and the longest unbroken open stretch |
medianMinNights / modalMinNights / minNightsDistribution / maxNightsObserved | number / array | Minimum-stay profile across the year |
closedToArrivalNights / closedToDepartureNights | number | Nights that accept no arrival or no departure |
calendarNightsWithPublishedPrice | number | How many nights carried a published price — reported so you can see it for yourself rather than take our word for it |
monthly | array | Per-month nights, occupancy and estimated revenue |
estimatedRevenue12mo / estimatedRevenueNext30 / estimatedRevenueNext90 | number | Estimated revenue over each window |
estimatedAdr / estimatedRevPar | number | Estimated average daily rate and revenue per available night |
revenueIsEstimate / revenueMethod | boolean / string | Always set, and always states how the figure was reached |
bookedVsBlockedSeparable | boolean | Always false — see the limits below |
market / bboxUsed / scrapedAt | string / date | What was studied and when |
scope / scopeValue / listingCount / medianOccupancyRate / medianAdr / impliedRevPar | string / number | Market rollup rows only |
Pricing
This actor is pay-per-event, so you pay for output rather than for run time.
| What you pay for | Price |
|---|---|
| Each row written — listing scorecards, market rollups and, if you enable them, per-night rows | $0.0006 ($0.60 per 1,000 rows) |
| Each listing whose full year of availability was retrieved and turned into an occupancy scorecard | $0.012 |
The second charge applies once per listing, and only when a full year of availability was genuinely retrieved for it. A listing that could not be read is never charged for it.
Worked example. Scoring 200 listings with a full year each costs about $2.52 — $0.12 of rows plus $2.40 of full-year scorecards.
The row price is kept deliberately low because includeNightRows can multiply
your row count by up to 365 per listing. The year-of-availability charge sits
where the real work is: one occupancy scorecard replaces a year of manually
checking a calendar, and it costs many times more to produce than an ordinary row.
Limits & what this actor cannot do
Read this section before you rely on the numbers.
- Revenue and ADR are estimates, not booked revenue. Airbnb's availability
calendar does not publish nightly prices. The nightly rate on every row is read
from live market results for the dates you choose, and combined with the
availability calendar. Every row carries
revenueIsEstimateandrevenueMethodso the basis is never in doubt. Change the dates and the estimate changes. - Unavailable nights cannot be split into "booked" and "blocked by the host".
A night the host closed off looks exactly like a night a guest reserved, and
nothing public tells the two apart. That is why the field is
unavailableNightsand neverbookedNights, and why every row reportsbookedVsBlockedSeparable: false. Treat occupancy as an upper bound. - A listing that is not on the market for your dates gets no rate. Its
occupancy is still measured, but
nightlyRateand every revenue field are blank rather than guessed at. - Occupancy always looks forward from the day the run starts. Airbnb publishes availability a whole month at a time, so nights earlier in the current month are left out of every figure instead of being counted as taken — a night that has already gone is not a night somebody booked. Each row reports how many nights were left out for this reason.
- Availability reaches twelve months ahead and no further. That is as far as Airbnb publishes, so a longer horizon is not available at any price.
- A market sweep is not exhaustive. Airbnb shows only a few hundred listings for any single search and repeats itself past that point, so the actor covers a market by slicing it into price bands and map areas and merging the results. For guaranteed coverage of specific properties, supply them explicitly by address or id; for a full city inventory, use a dedicated city census actor.
- Bedroom and bathroom counts come from the listing's own summary line and
are missing for some listings. Turning on
includePdpDetailsfills in more of them, but not all. - Ratings and review counts are as the listing displays them. A brand-new listing shows no rating at all, and that is reported as a new listing rather than as a zero score.
- Speed depends on the size of the job and on how quickly the source site responds. No fixed throughput is promised.
- Airbnb's terms prohibit automated access. You are responsible for using this data lawfully and in line with the source site's terms, and for any onward use of it.
FAQ
Do I need an Airbnb account? No. None at all.
Does it need a login, or any personal details? No. There is nothing to connect and nothing to sign in to — set your market and run it.
Can I schedule it?
Yes. Leave rateCheckIn blank and the rate window rolls forward automatically
with each run, so a weekly schedule keeps producing a comparable series instead of
drifting into the past. Each run writes a fresh set of rows, so you build a
history you can chart occupancy and rate movement against.
Is the data complete? For a list of listings you supply, yes — every one you name is scored. For a market, no, and no tool can honestly claim otherwise: Airbnb shows only a few hundred listings per search, so the actor slices the market into price bands and map areas to see past that, and the result is a large, representative sample rather than a proven-complete inventory.
Why is the revenue figure an estimate? Because the only nightly price Airbnb publishes is the one it quotes for specific dates, and the availability calendar carries no prices at all. So the actor reads a real advertised rate for the dates you pick and combines it with real availability. That is an honest estimate of earning power, not a report of money actually taken.
Can I get night-by-night detail?
Yes — turn on includeNightRows. Be aware it adds up to 365 rows per listing, so
a 200-listing run becomes a 73,000-row dataset.
Which currency are the prices in?
Whichever you set in currency. It is applied consistently across the whole run,
so figures stay comparable.
