data·vault_
← Catalog

Airbnb occupancy data: what a listings snapshot can and cannot tell you

Published 2026-09-10. Source: Inside Airbnb, CC BY 4.0. Data Vault is not affiliated with Airbnb or Inside Airbnb. This page documents the data; it is not investment advice.

Most people searching for Airbnb occupancy data want one number per city: what share of nights got booked. That number does not exist in scraped listings, including ours. The Airbnb Listings, 6 US Cities pack carries 90,169 rows in the Inside Airbnb summary schema, and no column in it records booked nights, an occupancy rate, or anything derived from bookings. Airbnb publishes no booking data, so every occupancy figure you have ever seen attributed to a scrape was an estimate built from proxies.

This page does the honest version of that search. It lists the exact availability fields the snapshot does contain, explains why occupancy resists measurement from public data, and separates the questions a snapshot answers from the ones it cannot.

The availability and calendar fields, verified

Each of the six city files keeps the same 12 columns: id, name, neighbourhood, latitude, longitude, room_type, price, minimum_nights, availability_365, number_of_reviews, reviews_per_month, last_review. Verified against the shipped headers and the column-by-column data guide. The fields that matter for occupancy work:

FieldWhat it recordsIn the pack?
availability_365Bookable days for the 365 days after the snapshot dateYes, all six cities
reviews_per_monthReview rate, the standard demand proxyYes, all six cities
number_of_reviews, last_reviewCumulative review count and most recent review dateYes, all six cities
availability_30, availability_60, availability_90Bookable days over shorter forward windowsNo
has_availabilityBoolean for any bookable dayNo
Nightly calendarBooked or open status per specific future dateNo
estimated_occupancyInside Airbnb's modeled occupancy, from their full detailed filesNo

The third column is the whole point. One forward-looking counter (availability_365) and three review fields are what a summary snapshot gives you. Anything more granular lives in Inside Airbnb's detailed files, which run several gigabytes per city and include a per-night calendar. This pack normalizes the summary schema instead, which is what makes six cities comparable in one query.

Why real occupancy is so hard to get

Occupancy is booked nights divided by available nights. Getting it requires knowing which nights a listing actually sold, and that data lives inside Airbnb's systems. Three public routes exist, each with a catch:

So a single snapshot is stuck by construction. It was taken on one day, it sees forward availability, and it cannot distinguish a booked night from a blocked one. Treat anyone quoting a precise occupancy percentage from one scrape with suspicion.

What each city snapshot contains

Rows and snapshot dates from cities-index.csv, the per-city index that ships free with the sample files.

CitySnapshot dateRowsAvailability fieldsReview fields
Austin, TX2026-06-2211,295availability_365number_of_reviews, reviews_per_month, last_review
Nashville, TN2026-06-2610,242availability_365number_of_reviews, reviews_per_month, last_review
Denver, CO2026-06-304,939availability_365number_of_reviews, reviews_per_month, last_review
New York City, NY2026-08-1030,234availability_365number_of_reviews, reviews_per_month, last_review
Las Vegas (Clark County), NV2026-06-2720,234availability_365number_of_reviews, reviews_per_month, last_review
San Diego, CA2026-06-2713,225availability_365number_of_reviews, reviews_per_month, last_review

One more thing the table cannot say: row counts per snapshot are market size, not occupancy. Austin going from 11,295 rows on one date to a different count three months later tells you about supply churn, entries and exits, and registration effects. It says nothing about how full the surviving listings were.

Proxies that do work with this data

Three honest approximations, each answering a different slice of the occupancy question:

Supply tightness at the snapshot. The share of listings with availability_365 at or below 30 days shows how much inventory is effectively out of circulation, whether through bookings, host blocks, or regulation. It is a relative measure, meant for comparing neighborhoods or cities against each other, not for stating a market-wide rate.

Demand ranking by review velocity. reviews_per_month is the input Inside Airbnb's own model starts from. You can rank ZIP areas or room types by review rate as a demand signal without committing to their booking-per-review multiplier. Higher review velocity means more stays, however you scale it.

Availability consumption across snapshots. Take two snapshots of the same city a month apart and diff the availability_365 values per listing ID. A listing that dropped 25 bookable days had those days consumed by bookings, blocks, or a window shift. That diff is the closest a public dataset gets to observed occupancy, and even it cannot label the reason.

import csv
rows = list(csv.DictReader(open("airbnb-austin.csv")))
n = len(rows)
tight = sum(1 for r in rows if int(r["availability_365"]) <= 30)
print(round(100 * tight / n, 1), "% of listings at 30 bookable days or fewer")

Run that against any city file in the pack for the first proxy. The free 20-row sample CSV carries the same 12 columns if you want to test the pipeline first, and Airbnb data by city shows per-city query examples over MCP.

What this snapshot cannot answer

Being concrete about the limits: no true occupancy percentage per city, no booked-nights count for any listing, no seasonal occupancy curve, no weekend versus weekday split, and no revenue-per-listing figure. A snapshot taken on 2026-06-22 sees the world of 2026-06-22 plus 365 forward-looking bookable days that any number of things can change.

Two cases show why interpretation needs care. A listing with 10 bookable days and 75 reviews has likely converted demand into bookings, but a host could also be blocking the calendar. A listing with 89 bookable days, a 30-night minimum, and zero reviews reads as regulated or seasonal rather than booked out. In markets like New York City, where 42 percent of rows are private rooms after the city's registration rules, regulation explains low availability more than demand does.

If you need modeled occupancy percentages, Inside Airbnb publishes its own estimates per city with the methodology attached, and the next step up is commercial trackers. This pack's job is the reproducible layer underneath: one clean schema, per-city files, verified snapshot dates, and enough structure to build your own proxy on top.

Get the snapshot data

Full pack: 90,169 rows, one CSV per city, data dictionary, methodology, source checksums. The availability fields above ship in every file.

More from the catalog

FAQ

Does this Airbnb dataset include occupancy data?

No. The 6-city pack ships the Inside Airbnb summary schema, 12 columns per listing, and none of them records booked nights or an occupancy rate. The one calendar field is availability_365, the number of bookable days for the next 365 days from the snapshot date. Occupancy has to be inferred from proxies or measured with repeated snapshots.

Can I estimate Airbnb occupancy from availability_365?

Only partly. A listing showing 10 bookable days out of 365 is either booked most nights, blocked by the host, or held back by rules like a 30-night minimum. One snapshot cannot separate those cases. What works: compute the share of listings with availability_365 at or below a threshold as a supply-tightness signal, and compare the same listing IDs across two snapshots of the same city to see availability actually being consumed.

How does Inside Airbnb estimate occupancy?

With a reviews-based model, documented on insideairbnb.com. Bookings leave reviews at an assumed rate, so they scale review counts up by a booking-per-review factor, weight by each city's typical stay length, and cap the result. Those assumptions are the model's weak point: the published occupancy figures carry real error bars and get revised when the assumptions change. This pack ships their summary schema without those estimates.