Datasets API endpoint
Use Crawlora's Airbnb Markets Dataset Search 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/searchReturns aggregate Airbnb short-term-rental market rollups from the dataset id enum value `airbnb-markets`. Aggregate-only: each row is a market cell, never an individual listing. Thin cells are suppressed. group_by enum: `country`, `market`, `admin1` (top subdivision), `locality` (settlement), `room_type` (`entire_place`/`private_room`/`hotel`/`shared_room`), `property_type` (Airbnb's canonical listing type from the detail page). `admin1`, `locality`, `room_type` and `property_type` are enrichment-derived and stay empty until their coverage is high enough to be reliable. Each cell also carries `median_price_usd`, the median nightly price converted to USD via an approximate dated FX snapshot, for cross-country comparison (combine with `group_by=room_type` for median price by room type); `guest_favorite_pct`, the share of listings carrying the Guest Favorite badge (an observed lower bound, like `superhost_pct`); and `avg_person_capacity`, the average guests a listing sleeps over the detail-page-enriched sample. Sort enum: `listings_desc`, `superhost_pct_desc`, `rating_desc`, `key_asc`. 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 |
|---|---|---|---|---|---|
| group_by | string | No | country | Aggregate cell dimension enum: country, market, admin1, locality, room_type, property_type. Defaults to country | |
| country | string | No | Exact ISO-3166-1 alpha-2 country filter, e.g. FR | ||
| market | string | No | Exact metro-market filter, e.g. Paris, max 128 characters | ||
| superhost | boolean | No | Count only Superhost listings | ||
| guest_favorite | boolean | No | Count only Guest Favorite listings (an observed lower bound; the badge under-counts) | ||
| min_rating | number | No | Minimum listing rating, from 0 through 5 | ||
| min_review_count | integer | No | Minimum listing review count, 0 or greater | ||
| active_since | string | No | Freshness filter, an ISO-8601 date (YYYY-MM-DD); only listings last seen on or after it are counted | ||
| min_listings | integer | No | Minimum listings per cell; raises the small-cell suppression floor (never lowered below the built-in minimum) | ||
| sort | string | No | Sort enum: listings_desc, superhost_pct_desc, rating_desc, key_asc | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/airbnb-markets/search?country=us&superhost=true&guest_favorite=true&page=1" \ -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.
- Grouping by `admin1`, `locality`, `room_type` or `property_type` returns enrichment-derived market cells (sub-country geography, or accommodation type). `admin1`/`locality` come from a reverse-geocode pass, `room_type` (`entire_place`, `private_room`, `hotel`, `shared_room`) is classified from each listing's search-card descriptor going forward, and `property_type` (Airbnb's finer canonical type) is read from the listing detail page. Because each covers a growing share of the census, these dimensions return an **empty `items` array until that coverage is high enough** for the cell counts to be reliable, then fill in on their own as coverage grows. `country` and `market` are always available. - `avg_person_capacity` is the average number of guests a listing sleeps, computed over the cell's detail-page-enriched sample; like the `*_enriched` fields it is reported only once that sample is large enough to be reliable. Combine it with `median_price_usd` for a rough price-per-guest read. - Pairing `group_by=room_type` with `median_price_usd` gives the median nightly USD price per accommodation type (e.g. entire homes vs private rooms), optionally filtered to one `country` or `market`. - `median_price_usd` is the cell's median nightly price converted to USD via an **approximate, dated FX snapshot**, so markets are price-comparable across countries despite Airbnb localizing the display currency. It is reported only for cells with enough USD-normalized priced listings and is a market-level approximation, not an exact conversion. - `avg_rating` is reported only for cells with enough rated listings, so a handful of reviews never swings a published market average; it is omitted otherwise. - `superhost_pct` is the Superhost share of the cell, from `0` through `100`. It is an **observed lower bound**: it counts listings seen carrying the Superhost badge on the search card, which renders inconsistently, so it under-counts. - `guest_favorite_pct` is the share of the cell's listings carrying the Guest Favorite badge, from `0` through `100`, with `guest_favorite_listings` the underlying count. 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, computed over a **random sample** of the cell's listings enriched from the listing detail page (enrichment draws a representative sample, so the rate is unbiased even at partial coverage). It, along with `enriched_listings` (the size of that enriched sample), `distinct_hosts` (the number of distinct operators among the enriched listings) and `listings_per_host` (`enriched_listings / distinct_hosts`, an operator-concentration signal), is reported **only once the enriched sample is large enough to be reliable**; all four are omitted until then. Detail-page enrichment covers a growing subset of the census, so these fields appear for more markets over time. `distinct_hosts` is an aggregate count only — no host identity is ever returned. - `guest_favorite_pct_enriched` is the **reliable** Guest Favorite share over that same detail-page-enriched sample (the listing detail page carries an authoritative Guest Favorite flag, unlike the inconsistent search-card badge behind `guest_favorite_pct`). It is reported under the same gate as `superhost_pct_enriched` and omitted until the enriched sample is large enough. - The `min_listings` field in the response echoes the effective suppression floor that was applied. - The maximum result window is `10000`; `page * page_size` must not exceed `10000`. - Invalid enum values return the standard invalid params envelope. - Returns an empty `items` array (not an error) when no cell clears the suppression floor. - Does not trigger live scraping. Example response: ```json { "code": 200, "msg": "OK", "data": { "dataset": "airbnb-markets", "group_by": "country", "items": [ { "key": "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, "median_price_usd": 148, "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" } ], "page": 1, "page_size": 20, "total": 1, "sort": "listings_desc", "min_listings": 50 } } ```
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 |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "airbnb-markets",
"group_by": "country",
"items": [
{
"key": "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,
"median_price_usd": 148,
"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"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "listings_desc",
"min_listings": 50
}
}Request schema
No body schema
Response schema
#/definitions/datasets.airbnbMarketsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.AirbnbMarketSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.group_by | string | No | ||||
| data.items | array | No | ||||
| data.items[].avg_person_capacity | number | No | ||||
| data.items[].avg_rating | number | No | ||||
| data.items[].avg_review_count | number | No | ||||
| data.items[].distinct_hosts | integer | No | ||||
| data.items[].enriched_listings | integer | No | ||||
| data.items[].guest_favorite_listings | integer | No | ||||
| data.items[].guest_favorite_pct | number | No | ||||
| data.items[].guest_favorite_pct_enriched | number | No | ||||
| data.items[].key | string | No | ||||
| data.items[].last_seen | string | No | ||||
| data.items[].listings | integer | No | ||||
| data.items[].listings_per_host | number | No | ||||
| data.items[].median_price_usd | number | No | ||||
| data.items[].rated_listings | integer | No | ||||
| data.items[].superhost_listings | integer | No | ||||
| data.items[].superhost_pct | number | No | ||||
| data.items[].superhost_pct_enriched | number | No | ||||
| data.min_listings | integer | No | ||||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.sort | string | No | ||||
| data.total | integer | 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/search?country=us&superhost=true&guest_favorite=true&page=1" \
-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