Airbnb Occupancy & Revenue Estimator avatar

Airbnb Occupancy & Revenue Estimator

Pricing

from $0.60 / 1,000 result rows

Go to Apify Store
Airbnb Occupancy & Revenue Estimator

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

Hamza

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

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

FieldTypeDefaultDescription
querystringParis, FranceThe 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.
bboxobjectA map area to restrict the study to, as neLat, neLng, swLat, swLng.
listingUrlsarray[]Study a fixed set of listings instead of a market. Accepts room addresses. Up to 2,000.
listingIdsarray[]The same, as plain numeric listing ids. Up to 2,000.
rateCheckIndatetoday + 30 daysThe check-in date the nightly rate is observed for. Left blank it rolls forward automatically, so a scheduled run never goes stale.
rateStayLengthinteger4Length of the stay the rate is observed for, in nights. Max 28.
adultsinteger2Guest count the rate is quoted for. Max 16.
horizonMonthsinteger12How many months of availability to read, up to a year.
calendarStartMonthstringcurrent monthFirst month of the availability window, as YYYY-MM.
priceMin / priceMaxintegerRestrict the study to a nightly price window. Also used to divide a large market into slices. Max 100,000.
roomTypesarray[]Restrict to particular room types. Entire home/apt is the confirmed value; others are passed through as given.
minBedroomsintegerOnly listings with at least this many bedrooms. Max 20.
maxListingsinteger200How many listings to score. Max 2,000.
includeMonthlyBreakdownbooleantrueNest the month-by-month occupancy and revenue inside each listing row. Costs nothing extra.
includeNightRowsbooleanfalseAlso 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.
includePdpDetailsbooleanfalseAlso read each listing's own summary for guest capacity, property type, bedrooms, beds and bathrooms. Adds work per listing.
maxRequestsinteger1200Upper limit on how much work a single run may do, as a safety net. Max 12,000.
Parallel listingsinteger4How many listings are worked on at the same time. Max 8.
currencystringUSDCurrency all prices are reported in.
localestringenLanguage for listing names and labels.
proxyCountrystringCountry to appear to browse from.

Output fields

FieldTypeDescription
recordTypestringlisting, marketRollup or night
listingId / listingUrl / listingName / titlestringIdentity, address and the listing's own headline and room-type line
latitude / longitude / neighbourhoodnumber / stringLocation
roomType / propertyType / personCapacitystring / numberCategory and guest capacity
bedrooms / beds / bathroomsnumberLayout, from the listing's own summary line
ratingLocalized / ratingValue / reviewCountstring / numberRating as shown, as a number, and the review count
isGuestFavorite / badgesboolean / arrayRecognition the listing carries
nightlyRate / currencynumber / stringThe nightly rate observed for your chosen dates
rateSourcestringWhere the rate came from; blank when none was observed
rateObservedForCheckIn / rateObservedForCheckOutdateThe exact window the rate was observed in
totalForRateWindow / originalTotalForRateWindow / discountPctnumberStay total, the pre-discount total where one was shown, and the saving
promotionsarrayAny promotion wording shown on the listing
calendarStart / calendarEnd / nightsObserveddate / numberThe availability window actually measured, counted forward from the day the run starts
nightsElapsedSkippednumberNights the published window contained that had already passed when the run began, and were therefore left out
availableNights / unavailableNightsnumberOpen nights and nights not open to the public
occupancyRatenumberunavailableNights over nightsObserved, 0–1
occupancyNext30 / occupancyNext60 / occupancyNext90numberThe 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 / longestAvailableRunNightsdate / numberFirst free night and the longest unbroken open stretch
medianMinNights / modalMinNights / minNightsDistribution / maxNightsObservednumber / arrayMinimum-stay profile across the year
closedToArrivalNights / closedToDepartureNightsnumberNights that accept no arrival or no departure
calendarNightsWithPublishedPricenumberHow many nights carried a published price — reported so you can see it for yourself rather than take our word for it
monthlyarrayPer-month nights, occupancy and estimated revenue
estimatedRevenue12mo / estimatedRevenueNext30 / estimatedRevenueNext90numberEstimated revenue over each window
estimatedAdr / estimatedRevParnumberEstimated average daily rate and revenue per available night
revenueIsEstimate / revenueMethodboolean / stringAlways set, and always states how the figure was reached
bookedVsBlockedSeparablebooleanAlways false — see the limits below
market / bboxUsed / scrapedAtstring / dateWhat was studied and when
scope / scopeValue / listingCount / medianOccupancyRate / medianAdr / impliedRevParstring / numberMarket rollup rows only

Pricing

This actor is pay-per-event, so you pay for output rather than for run time.

What you pay forPrice
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 revenueIsEstimate and revenueMethod so 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 unavailableNights and never bookedNights, and why every row reports bookedVsBlockedSeparable: 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 nightlyRate and 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 includePdpDetails fills 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.