Datasets API endpoint
Use Crawlora's Airbnb Markets Dataset Country API to search or inspect stored structured datasets as JSON. This page includes request parameters, cURL examples, response schema, validation behavior, credit cost, and a Playground link for testing before integration. Dataset endpoints read indexed records and do not apply proxy routing.
/datasets/airbnb-markets/items/{country}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. Developers commonly use this endpoint for repeatable dataset search, filtering, facets, local business enrichment, analytics, exports, and internal tools that need structured records beyond the limited manual refinement available in the Google Maps app. Authentication uses the x-api-key header, usage is metered with the credit cost shown on this page, and the request does not trigger live scraping or proxy routing.
Request parameters are generated from the active endpoint catalog. Dataset parameters filter, page, facet, or locate stored structured records; they do not configure a live scraper or proxy path.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| country (path) | string | Yes | ISO-3166-1 alpha-2 country code, e.g. FR | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/airbnb-markets/items/%3Ccountry%3E" \ -H "x-api-key: $CRAWLORA_API_KEY"
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
This endpoint reads stored indexed dataset records. It does not execute a live upstream Google Maps request, browser session, or proxy-routed scraping job.
Some targets require real browser execution because the data is loaded through JavaScript, dynamic rendering, or interaction-like browser behavior.
For supported endpoints, Crawlora can route requests through a managed browser cluster. This allows Crawlora to execute JavaScript, load dynamic content, apply browser-level request behavior, and normalize the rendered result into JSON.
You do not need to operate your own Playwright, Puppeteer, Chrome, proxy, queue, or retry infrastructure.
- `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). - Returns `404` with the standard error envelope when the country has no listings above the suppression floor. - Does not trigger live scraping. Example response: ```json { "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 } } } ```
Crawlora does not silently return invalid dataset search results when filters, pagination, coordinates, or stored record lookups cannot be satisfied.
| Status | Common failure case |
|---|---|
| 400 | Invalid input, missing required parameter, invalid enum, bad coordinate pair, or result window beyond the dataset limit |
| 404 | Requested stored dataset item is not present |
| 429 | Plan or endpoint rate limit exceeded |
| 500 | Internal dataset query or storage error |
When possible, Crawlora returns structured error context so your integration can adjust filters, page size, location inputs, or lookup identifiers.
| 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 |
{
"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 | ||||
| data.avg_rating | number | No | ||||
| data.avg_review_count | number | No | ||||
| data.bounds | es.AirbnbGeoBounds | No | ||||
| data.bounds.bottom_right | es.GeoPoint | No | ||||
| data.bounds.bottom_right.lat | number | No | ||||
| data.bounds.bottom_right.lon | number | No | ||||
| data.bounds.top_left | es.GeoPoint | No | ||||
| data.bounds.top_left.lat | number | No | ||||
| data.bounds.top_left.lon | number | No | ||||
| data.country | string | No | ||||
| data.currencies | array | No | ||||
| data.currencies[].currency | string | No | ||||
| data.currencies[].listings | integer | No | ||||
| data.currencies[].p25 | number | No | ||||
| data.currencies[].p50 | number | No | ||||
| data.currencies[].p75 | number | No | ||||
| data.distinct_hosts | integer | No | ||||
| data.enriched_listings | integer | No | ||||
| data.guest_favorite_listings | integer | No | ||||
| data.guest_favorite_pct | number | No | ||||
| data.guest_favorite_pct_enriched | number | No | ||||
| data.last_seen | string | No | ||||
| data.listings | integer | No | ||||
| data.listings_per_host | number | No | ||||
| data.metros | array | No | ||||
| data.metros[].avg_person_capacity | number | No | ||||
| data.metros[].avg_rating | number | No | ||||
| data.metros[].avg_review_count | number | No | ||||
| data.metros[].distinct_hosts | integer | No | ||||
| data.metros[].enriched_listings | integer | No | ||||
| data.metros[].guest_favorite_listings | integer | No | ||||
| data.metros[].guest_favorite_pct | number | No | ||||
| data.metros[].guest_favorite_pct_enriched | number | No | ||||
| data.metros[].key | string | No | ||||
| data.metros[].last_seen | string | No | ||||
| data.metros[].listings | integer | No | ||||
| data.metros[].listings_per_host | number | No | ||||
| data.metros[].median_price_usd | number | No | ||||
| data.metros[].rated_listings | integer | No | ||||
| data.metros[].superhost_listings | integer | No | ||||
| data.metros[].superhost_pct | number | No | ||||
| data.metros[].superhost_pct_enriched | number | No | ||||
| data.price_usd | unknown | 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.rated_listings | integer | No | ||||
| data.superhost_listings | integer | No | ||||
| data.superhost_pct | number | No | ||||
| data.superhost_pct_enriched | number | No | ||||
| msg | string | No | OK |
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/%3Ccountry%3E" \
-H "x-api-key: $CRAWLORA_API_KEY"Crawlora is designed for responsible structured public web data workflows. Customers are responsible for using Crawlora in compliance with applicable laws, third-party rights, target-platform rules, and Crawlora terms.
Read Crawlora terms