Tony Wang5 min readOur Airbnb Occupancy Estimate Was Wrong in Two Directions That Canceled Out
A review-velocity occupancy model landed at 60% for Austin, near AirDNA's 54%. Not validation: a biased sample and an undercounting model canceled out.
Every occupancy estimate you've seen from a scraped Airbnb dataset — ours included, until now — has the same shape: infer how full a market is from how often listings get reviewed, because the booking calendar itself isn't public. We built exactly that model, ran it on Austin, and got an answer close enough to the industry-standard AirDNA number that it was tempting to call it validated. It wasn't. Here's why the near-match is the interesting finding, not the model's accuracy.
The number that looked like a win
80 search-ranked Austin listings
the paid-tier industry benchmark
~82 nights booked per year
A 6-point gap between a two-hour model and a paid, calendar-backed industry product looks like a quiet win. It isn't one, for a specific, checkable reason: our sample and our model are wrong in opposite directions, and they happened to partially cancel out.
Two separate mistakes, not one small one
Mistake one — the sample is busy on purpose. Airbnb's search endpoint returns relevance-ranked results: the listings people actually see are the ones with more bookings and more reviews, because that's what ranking algorithms reward. Half of our 80 sampled listings had racked up 60 reviews in 6-11 months — 5 to 10 reviews a month — which is genuinely a busy listing, and pushed straight into our model's 70% cap. AirDNA and Inside Airbnb compute over every listing in a market, including the thousands that barely get booked at all. A search-ranked sample of 80 will always read busier than the true market.
Mistake two — the review-based model undercounts on its own. Not every stay produces a public review (our model assumes roughly half do), and short/off-season stays are the ones most likely to go unreviewed. That pushes the review-inferred occupancy number down relative to what actually happened.
The check that doesn't have a lucky cancellation
If sampling and modeling were both accurate, the nightly-rate comparison should tell the same "close enough" story. It doesn't — because there's no offsetting error to save it:
median, from Airbnb's search field
~2.5x lower than our raw figure
That's the tell. When one metric (occupancy) looks validated and a closely related metric (price) is obviously off by the same modeling shortcut, the honest read is "we got lucky once," not "the method works."
What we did next
We've since shipped a backend fix that pulls the day-level availability Airbnb's own calendar endpoint already returns (it was being parsed down to a month-level stub before). That replaces the entire review-velocity guess with an actual per-day booked/available count — the same kind of fix AirDNA's whole business is built on, just via a structured API instead of a browser-automation pipeline. A follow-up post will run the same Austin sample through the real calendar and show exactly how far the review-based guess was, in both directions — the comparison this post couldn't honestly make yet.
Pull real Airbnb data — including day-level calendar availability
Search, room detail, reviews, and now real per-day calendar availability, as structured JSON — no browser automation, billed pay-on-success.
Frequently asked questions
How accurate is a review-based Airbnb occupancy estimate?
Ours landed at 60% mean occupancy for an 80-listing Austin sample, versus AirDNA's published 54% trailing-12-month figure — close, but not because the model is accurate. The search sample skews toward busy, heavily-reviewed listings (biasing occupancy up) while the review-based model undercounts stays that never get reviewed (biasing it down); the two errors partly canceled.
Why doesn't the nightly-rate comparison show the same 'close enough' result?
Because there's no offsetting error to save it. Our raw search-price figure came out at $657 median, versus AirDNA's $265 nightly ADR and Inside Airbnb's $454 advertised price — roughly 2.5x inflated, since Airbnb's search price field bundles fees and multi-night totals rather than returning a clean nightly rate.
Has this been fixed?
Yes — Crawlora's Airbnb API now returns real day-level calendar availability (shipped 2026-06-23), replacing the review-velocity guess with an actual per-day booked/available count, the same underlying signal AirDNA's own product is built on.