Evidence layer
Dataset Definition: 2026 Airbnb Pricing Benchmark
- Dataset identifier:
airbnb-pricing-benchmark-2026-lead-time - Publisher: Revande
- Measurement window: 2026-01-01 to 2026-09-05
- Compiled: 2026-09-06
- Formats: CSV at /data/airbnb-pricing-benchmark-2026-lead-time.csv, JSON at /data/airbnb-pricing-benchmark-2026-lead-time.json
- Rows: 8
- Columns: 6, all ratios or averages
- API: https://pooekwiihfhdctdoevpn.supabase.co/functions/v1/market-benchmark, read only, no key required
- License: free to use with attribution to Revande and a link to this page.
What one row is
One row is one lead time bucket. It is not one listing, not one night, and not one reservation. A row answers the question: across everything we observed at this distance from arrival, what did prices do and when did guests book?
The eight rows partition the whole measurement window with no gaps and no overlaps. Every observation and every reservation falls into exactly one row. The shares therefore sum to 100 percent, which is asserted by an automated test rather than assumed.
The two underlying record types
A row aggregates two different kinds of source record, and the row carries columns from both.
A price observation is one capture of one listing's asking price for one future stay date at one moment in time. The same listing and stay date is observed many times as the date approaches, which is what makes a lead time curve possible at all. Uniqueness is (listing, stay date, capture time). There is no channel dimension on this record, which is why channel price differences cannot be derived from it.
A reservation is one confirmed booking with a creation timestamp, an arrival date, and a night count. Its lead time is the whole number of days between creation and arrival.
Population and boundaries
- The price series is drawn from professionally managed listings priced through a revenue management system, denominated in a single currency, captured over a rolling forward window.
- The booking series is drawn from confirmed reservations created inside the measurement window on the same managed portfolio.
- The priced cohort is a strict subset of the booked cohort: every listing in the price series also appears in the booking series. The two cohorts are different sizes, so a column drawn from one series must never be read as if it came from the other.
- The dataset describes one professionally managed portfolio. It is not a census of Airbnb and must not be read as a market average.
Bucket boundaries
Buckets are closed on both ends and expressed in whole days before arrival.
| Bucket | Days before arrival |
|---|---|
| 0-3 | 0, 1, 2, 3 |
| 4-7 | 4 through 7 |
| 8-14 | 8 through 14 |
| 15-21 | 15 through 21 |
| 22-35 | 22 through 35 |
| 36-60 | 36 through 60 |
| 61-90 | 61 through 90 |
| 90+ | 91 and above |
The 90+ bucket is the baseline for every price comparison.
What is deliberately absent
- No listing identifier, account identifier, internal code, or property name.
- No absolute price in any currency. Every price figure is a dimensionless ratio.
- No absolute counts of listings, reservations, nights, or observations. Those describe the size of a managed portfolio rather than the behaviour being measured, and the finding does not rest on them.
- No channel breakdown. The source record carries no channel dimension.
- No geographic or per market breakdown.
Provenance
Emitted from stored counts and sums by the pipeline that produced the measurement. Percentages are computed at build time and never stored, so adding a group later cannot silently restate a published share. See the methodology for the currency normalization rule, the cohort matching, the publication gate, and the stated limitations.
Querying it directly
The same aggregate is served as JSON, read only and without a key, at:
https://pooekwiihfhdctdoevpn.supabase.co/functions/v1/market-benchmark
It answers GET with application/json, permissive read only CORS, and a one hour cache hint. The payload carries the eight rows, the headline totals, links back to this page and the methodology, the licence, and the stated limits, so a consumer that never loads a page still receives the scope conditions along with the numbers.
That address is the endpoint. A shorter /api/ path on this domain is not available: the site is served as a static single page app with no server side route layer, so any such path returns the application shell with a 200 status rather than JSON. Publishing it would hand a machine a false success, which is worse than having no short path at all.