Datasets API endpoint
Returns one country's full aggregate Airbnb market profile from dataset id enum value `airbnb-markets` — headline supply, Superhost share, Guest Favorite share (`guest_favorite_pct`, an observed lower bound), `avg_person_capacity` (average guests a listing sleeps over the detail-page-enriched sample), ratings, its top metros, bounding box, per-currency nightly-price percentiles, and a USD-normalized `price_usd` percentile block (converted via an approximate dated FX snapshot) for cross-country comparison. Aggregate-only. Returns 404 for a country below the suppression floor.
/datasets/airbnb-markets/items/{country}Returns one country's full aggregate Airbnb market profile: headline supply, Superhost share, ratings, its top metros, its geographic bounding box, and per-currency nightly-price percentiles. It is aggregate-only — no individual listings or hosts. Nightly prices are reported per-currency only, because the displayed currency is localized to where a listing was collected and a bare number is not comparable across countries.
Dataset id enum:
airbnb-marketsPath parameters:
country: required ISO-3166-1 alpha-2 country code, e.g. FR.Response behavior:
avg_rating is included only when the country has enough rated listings.superhost_pct is an observed lower bound — it counts listings seen carrying the search-card Superhost badge, which renders inconsistently and under-counts.guest_favorite_pct (with guest_favorite_listings) is the share of the country's listings carrying the Guest Favorite badge. Like superhost_pct it is an observed lower bound — the badge renders inconsistently on the search card, so it under-counts.superhost_pct_enriched is the reliable Superhost share over a random sample of the country's listings enriched from the listing detail page (the sample is representative, so the rate is unbiased at partial coverage); enriched_listings (the sample size), distinct_hosts (distinct operators among the enriched listings) and listings_per_host (enriched_listings / distinct_hosts, an operator-concentration signal) accompany it. All four appear only once the enriched sample is large enough to be reliable, and are omitted otherwise; they populate for more countries over time as enrichment coverage grows. distinct_hosts is an aggregate count only — no host identity is returned.guest_favorite_pct_enriched is the reliable Guest Favorite share over that same detail-page-enriched sample (the detail page carries an authoritative Guest Favorite flag, unlike the inconsistent search-card badge behind guest_favorite_pct), reported under the same gate as superhost_pct_enriched and omitted until the sample is large enough.avg_person_capacity is the average number of guests a listing sleeps, over that same detail-page-enriched sample; reported under the same gate and omitted otherwise. Combine with price_usd/currencies medians for a rough price-per-guest read.currencies prices are per-currency medians; most listings are priced in USD, so those are broadly comparable across countries.currencies reports the 25th/50th/75th nightly-price percentiles for each currency with enough priced listings.price_usd reports the country-wide 25th/50th/75th nightly-price percentiles normalized to USD via an approximate, dated FX snapshot — the cross-country-comparable complement to the per-currency currencies block. It is a market-level approximation (rates drift), not an exact conversion, and is present only when enough listings carry a USD-normalized price.metros lists the country's largest metro markets that clear the suppression floor; each metro also carries median_price_usd, its median nightly price in USD (same approximate FX snapshot).404 with the standard error envelope when the country has no listings above the suppression floor.| Field | Filled in, of 24 checked | Values in the sample |
|---|---|---|
| key | 24 | |
| listings | 24 | 67 to 68,183, median 1,552 |
| superhost_listings | 24 | 7 to 9,955, median 236 |
| superhost_pct | 24 | 6.6 to 20.1, median 13 |
| guest_favorite_listings | 24 | 4 to 2,523, median 58 |
| guest_favorite_pct | 24 | 1.7 to 8.3, median 3.5 |
| rated_listings | 24 | 59 to 59,083, median 1,258 |
| avg_rating | 24 | 4.02 to 4.74, median 4.37 |
| avg_review_count | 24 | 23.4 to 62.9, median 40.9 |
| median_price_usd | 20 | 88.46 to 306.98, median 148.83 |
| enriched_listings | 24 | 21 to 17,216, median 427 |
| superhost_pct_enriched | 7 | 15.4 to 30.5, median 26.8 |
| guest_favorite_pct_enriched | 7 | 6.8 to 14.7, median 10.6 |
| avg_person_capacity | 7 | 3.19 to 4.02, median 3.58 |
| distinct_hosts | 7 | 829 to 13,506, median 898 |
| listings_per_host | 7 | 1.19 to 1.41, median 1.28 |
| last_seen | 24 | 2026-07-04 to 2026-07-06 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| country (path) | string | Yes | ISO-3166-1 alpha-2 country code, e.g. FR | FR | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/airbnb-markets/items/FR" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"country": "US",
"listings": 1212294,
"superhost_listings": 303073,
"superhost_pct": 25,
"guest_favorite_listings": 121229,
"guest_favorite_pct": 10,
"rated_listings": 776000,
"avg_rating": 4.72,
"avg_review_count": 31.5,
"enriched_listings": 280000,
"superhost_pct_enriched": 29.4,
"guest_favorite_pct_enriched": 18.7,
"avg_person_capacity": 4.2,
"distinct_hosts": 214500,
"listings_per_host": 1.31,
"last_seen": "2026-07-03T00:00:00Z",
"bounds": {
"top_left": {
"lat": 71.4,
"lon": -177.1
},
"bottom_right": {
"lat": 18.9,
"lon": -66.9
}
},
"metros": [
{
"key": "Austin",
"listings": 12040,
"superhost_listings": 6020,
"superhost_pct": 50,
"guest_favorite_listings": 3010,
"guest_favorite_pct": 25,
"rated_listings": 9800,
"avg_rating": 4.9,
"median_price_usd": 205
}
],
"currencies": [
{
"currency": "USD",
"listings": 512000,
"p25": 95,
"p50": 150,
"p75": 260
}
],
"price_usd": {
"listings": 534000,
"p25": 96,
"p50": 152,
"p75": 265
}
}
}Request schema
No body schema
Response schema
#/definitions/datasets.airbnbMarketResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | es.AirbnbMarketDetail | No | ||||
| data.avg_person_capacity | number | No | Average number of guests a listing sleeps, over the sampled listings. Omitted until the sample is large enough. | |||
| data.avg_rating | number | No | Average listing rating across rated listings. Omitted when the country has too few rated listings. | |||
| data.avg_review_count | number | No | Average number of reviews per listing. | |||
| data.bounds | object | No | Box that encloses the country's listings. | |||
| data.bounds.bottom_right | object | No | South-east corner of the box that encloses the market's listings. | |||
| data.bounds.bottom_right.lat | number | No | Latitude in decimal degrees. | |||
| data.bounds.bottom_right.lon | number | No | Longitude in decimal degrees. | |||
| data.bounds.top_left | object | No | North-west corner of the box that encloses the market's listings. | |||
| data.bounds.top_left.lat | number | No | Latitude in decimal degrees. | |||
| data.bounds.top_left.lon | number | No | Longitude in decimal degrees. | |||
| data.country | string | No | ISO 3166-1 alpha-2 code of the country this profile covers. | |||
| data.currencies | array | No | Nightly price percentiles for each currency that has enough priced listings. | |||
| data.currencies[].currency | string | No | ISO currency code of the nightly prices. | |||
| data.currencies[].listings | integer | No | Number of priced listings in this currency. | |||
| data.currencies[].p25 | number | No | 25th percentile of the nightly price, in `currency`. | |||
| data.currencies[].p50 | number | No | Median nightly price, in `currency`. | |||
| data.currencies[].p75 | number | No | 75th percentile of the nightly price, in `currency`. | |||
| data.distinct_hosts | integer | No | Number of distinct hosts among the sampled listings. Omitted until the sample is large enough. | |||
| data.enriched_listings | integer | No | Number of listings in the detail-page sample behind the reliable rates. Omitted when no listing has been sampled. | |||
| data.guest_favorite_listings | integer | No | Number of listings seen with the Guest Favorite badge. | |||
| data.guest_favorite_pct | number | No | Share of listings seen with the Guest Favorite badge, from 0 to 100. A lower bound, because the badge does not always show. | |||
| data.guest_favorite_pct_enriched | number | No | Share of sampled listings that are Guest Favorites, from 0 to 100, taken from listing detail pages. Omitted until the sample is large enough. | |||
| data.last_seen | string | No | Most recent time a listing in the country was seen, in UTC (RFC 3339). | |||
| data.listings | integer | No | Number of listings in the country. | |||
| data.listings_per_host | number | No | Sampled listings divided by distinct hosts, a sign of how concentrated hosting is. Omitted until the sample is large enough. | |||
| data.metros | array | No | Largest metro markets in the country, each with the same figures as a market row. | |||
| data.metros[].avg_person_capacity | number | No | Average number of guests a listing sleeps, over the sampled listings. Omitted until the sample is large enough. | |||
| data.metros[].avg_rating | number | No | Average listing rating across rated listings. Omitted when the market has too few rated listings. | |||
| data.metros[].avg_review_count | number | No | Average number of reviews per listing. | |||
| data.metros[].distinct_hosts | integer | No | Number of distinct hosts among the sampled listings. Omitted until the sample is large enough. | |||
| data.metros[].enriched_listings | integer | No | Number of listings in the detail-page sample behind the reliable rates. Omitted when no listing has been sampled. | |||
| data.metros[].guest_favorite_listings | integer | No | Number of listings seen with the Guest Favorite badge. | |||
| data.metros[].guest_favorite_pct | number | No | Share of listings seen with the Guest Favorite badge, from 0 to 100. A lower bound, because the badge does not always show. | |||
| data.metros[].guest_favorite_pct_enriched | number | No | Share of sampled listings that are Guest Favorites, from 0 to 100, taken from listing detail pages. Omitted until the sample is large enough. | |||
| data.metros[].key | string | No | Market this row covers: a country code, metro name or other value of the chosen `group_by` dimension. | |||
| data.metros[].last_seen | string | No | Most recent time a listing in this market was seen, in UTC (RFC 3339). | |||
| data.metros[].listings | integer | No | Number of listings in the market. | |||
| data.metros[].listings_per_host | number | No | Sampled listings divided by distinct hosts, a sign of how concentrated hosting is. Omitted until the sample is large enough. | |||
| data.metros[].median_price_usd | number | No | Median nightly price in US dollars, converted with an approximate dated exchange rate. Omitted when too few listings have a price. | |||
| data.metros[].rated_listings | integer | No | Number of listings that have a rating. | |||
| data.metros[].superhost_listings | integer | No | Number of listings seen with the Superhost badge on the search card. | |||
| data.metros[].superhost_pct | number | No | Share of listings seen with the Superhost badge, from 0 to 100. A lower bound, because the badge does not always show. | |||
| data.metros[].superhost_pct_enriched | number | No | Share of sampled listings that are Superhosts, from 0 to 100, taken from listing detail pages. Omitted until the sample is large enough. | |||
| data.price_usd | object | No | PriceUSD is the country-wide nightly-price distribution normalized to USD (approximate, dated FX snapshot) — the cross-country-comparable complement to the per-currency Currencies medians. Present only when enough listings carry a USD-normalized price. | |||
| data.price_usd.listings | integer | No | Number of listings with a price converted to US dollars. | |||
| data.price_usd.p25 | number | No | 25th percentile of the nightly price, in US dollars at an approximate dated exchange rate. | |||
| data.price_usd.p50 | number | No | Median nightly price, in US dollars at an approximate dated exchange rate. | |||
| data.price_usd.p75 | number | No | 75th percentile of the nightly price, in US dollars at an approximate dated exchange rate. | |||
| data.rated_listings | integer | No | Number of listings that have a rating. | |||
| data.superhost_listings | integer | No | Number of listings seen with the Superhost badge on the search card. | |||
| data.superhost_pct | number | No | Share of listings seen with the Superhost badge, from 0 to 100. A lower bound, because the badge does not always show. | |||
| data.superhost_pct_enriched | number | No | Share of sampled listings that are Superhosts, from 0 to 100, taken from listing detail pages. Omitted until the sample is large enough. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/airbnb-markets/items/FR" \
-H "x-api-key: $CRAWLORA_API_KEY"