Datasets API endpoint
Use Crawlora's Search the Steam games dataset 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/steam-games/searchSearches enriched public Steam catalog records stored in a search index. price_tier enum: `free`, `under5`, `5to15`, `15to30`, `30to60`, `over60`. review_tier enum: `overwhelmingly_positive`, `very_positive`, `positive`, `mixed`, `negative`, `insufficient`. Sort enum: `relevance`, `owners_desc`, `reviews_desc`, `review_score_desc`, `ccu_desc`, `metacritic_desc`, `price_asc`, `price_desc`, `release_desc`, `release_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 |
|---|---|---|---|---|---|
| q | string | No | Full-text query over name, developer and publisher, max 256 characters | ||
| type | string | No | Exact storefront type filter (e.g. game, dlc, demo), max 128 characters | ||
| developer | string | No | Exact developer filter, max 128 characters | ||
| publisher | string | No | Exact publisher filter, max 128 characters | ||
| genre | string | No | Exact genre filter (e.g. Action, Indie), max 128 characters | ||
| category | string | No | Exact store category filter (e.g. Single-player), max 128 characters | ||
| tag | string | No | Exact community-tag filter (e.g. Roguelike, Metroidvania, Cozy), max 128 characters | ||
| price_tier | string | No | Price-tier enum: free, under5, 5to15, 15to30, 30to60, over60 | ||
| review_tier | string | No | Review-tier enum: overwhelmingly_positive, very_positive, positive, mixed, negative, insufficient | ||
| owners_bucket | string | No | Exact SteamSpy owners-range bucket filter, max 128 characters | ||
| run_id | string | No | Exact crawl run-id filter, max 128 characters | ||
| is_free | boolean | No | Filter by free-to-play flag | ||
| windows | boolean | No | Filter by Windows support | ||
| mac | boolean | No | Filter by macOS support | ||
| linux | boolean | No | Filter by Linux support | ||
| on_sale | boolean | No | Filter by titles currently discounted (discount_pct > 0) | ||
| min_price_cents | integer | No | Minimum current price in cents | ||
| max_price_cents | integer | No | Maximum current price in cents | ||
| min_owners | integer | No | Minimum estimated owners (SteamSpy owners midpoint) | ||
| min_positive | integer | No | Minimum positive review count | ||
| min_total_reviews | integer | No | Minimum total review count | ||
| min_review_score | number | No | Minimum positive-review ratio, 0 through 1 | ||
| min_metacritic | integer | No | Minimum Metacritic score, 0 through 100 | ||
| min_ccu | integer | No | Minimum peak concurrent users yesterday | ||
| min_release_year | integer | No | Minimum release year | ||
| max_release_year | integer | No | Maximum release year | ||
| sort | string | No | Sort enum: relevance, owners_desc, reviews_desc, review_score_desc, ccu_desc, metacritic_desc, price_asc, price_desc, release_desc, release_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/steam-games/search?q=coffee&is_free=true&windows=true&mac=true&linux=true&on_sale=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.
- Owner counts are SteamSpy public estimates, kept as `owners_min` / `owners_max` / `owners_midpoint`; `min_owners` filters on the midpoint. - `review_score` is the positive-review ratio (0 through 1); `review_tier` applies Steam's bands with a minimum-volume floor. - Prices are integer cents. `is_free` is set when the storefront marks the title free or the price is 0. - Defaults to `relevance` sort when `q` is supplied, otherwise `owners_desc`. - `min_price_cents` must not exceed `max_price_cents`; `min_release_year` must not exceed `max_release_year`. - 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 the dataset has no matches yet. - Does not trigger live scraping. Example response: ```json { "code": 200, "msg": "OK", "data": { "dataset": "steam-games", "items": [ { "appid": 570, "name": "Dota 2", "developer": "Valve", "publisher": "Valve", "type": "game", "is_free": true, "price_cents": 0, "price_tier": "free", "owners_midpoint": 150000000, "owners_bucket": "100,000,000 .. 200,000,000", "ccu": 600000, "total_reviews": 1750000, "review_score": 0.9714, "review_tier": "overwhelmingly_positive", "genres": ["Action", "Free to Play"], "metacritic": 90, "release_year": 2013, "platform_windows": true, "platform_mac": true, "platform_linux": true } ], "page": 1, "page_size": 20, "total": 1, "sort": "owners_desc" } } ```
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": "steam-games",
"items": [
{
"appid": 570,
"name": "Dota 2",
"developer": "Valve",
"publisher": "Valve",
"type": "game",
"is_free": true,
"price_cents": 0,
"price_tier": "free",
"owners_midpoint": 150000000,
"owners_bucket": "100,000,000 .. 200,000,000",
"ccu": 600000,
"total_reviews": 1750000,
"review_score": 0.9714,
"review_tier": "overwhelmingly_positive",
"genres": [
"Action",
"Free to Play"
],
"metacritic": 90,
"release_year": 2013,
"platform_windows": true,
"platform_mac": true,
"platform_linux": true
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "owners_desc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.steamGamesSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.SteamSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | ||||
| data.items[].achievements_count | integer | No | ||||
| data.items[].appid | integer | No | ||||
| data.items[].available | boolean | No | Available is false when the storefront returned no appdetails on the most recent crawl (delisted, region-locked, or a fetch miss). The record is kept regardless. | |||
| data.items[].average_2weeks_min | integer | No | ||||
| data.items[].average_forever_min | integer | No | ||||
| data.items[].background | string | No | ||||
| data.items[].categories | array | No | ||||
| data.items[].ccu | integer | No | ||||
| data.items[].coming_soon | boolean | No | ||||
| data.items[].content_descriptor_ids | array | No | ||||
| data.items[].controller_support | string | No | ||||
| data.items[].crawled_at | string | No | ||||
| data.items[].developer | string | No | ||||
| data.items[].developers | array | No | ||||
| data.items[].discount_pct | integer | No | ||||
| data.items[].dlc_count | integer | No | ||||
| data.items[].genres | array | No | ||||
| data.items[].has_owner_estimate | boolean | No | HasOwnerEstimate is false for the floor bucket ("0 .. 20,000") / no SteamSpy estimate — i.e. the deep tail past the owner-differentiated head. Callers must not treat floor-bucket owners as a real count. | |||
| data.items[].header_image | string | No | ||||
| data.items[].initial_price_cents | integer | No | ||||
| data.items[].is_free | boolean | No | ||||
| data.items[].language_count | integer | No | ||||
| data.items[].languages | array | No | ||||
| data.items[].median_2weeks_min | integer | No | ||||
| data.items[].median_forever_min | integer | No | ||||
| data.items[].metacritic | integer | No | ||||
| data.items[].movie_count | integer | No | ||||
| data.items[].name | string | No | ||||
| data.items[].negative | integer | No | ||||
| data.items[].owners_bucket | string | No | ||||
| data.items[].owners_max | integer | No | ||||
| data.items[].owners_midpoint | integer | No | ||||
| data.items[].owners_min | integer | No | ||||
| data.items[].package_count | integer | No | ||||
| data.items[].platform_linux | boolean | No | ||||
| data.items[].platform_mac | boolean | No | ||||
| data.items[].platform_windows | boolean | No | ||||
| data.items[].positive | integer | No | ||||
| data.items[].price_cents | integer | No | ||||
| data.items[].price_tier | string | No | ||||
| data.items[].primary_tag | string | No | ||||
| data.items[].publisher | string | No | ||||
| data.items[].publishers | array | No | ||||
| data.items[].recommendations | integer | No | ||||
| data.items[].release_date | string | No | ||||
| data.items[].release_year | integer | No | ||||
| data.items[].required_age | integer | No | ||||
| data.items[].review_score | number | No | ||||
| data.items[].review_tier | string | No | ||||
| data.items[].run_id | string | No | ||||
| data.items[].schema_version | integer | No | ||||
| data.items[].screenshot_count | integer | No | ||||
| data.items[].seed_rank | integer | No | ||||
| data.items[].short_description | string | No | v3 richer-record fields (expanded appFilters). Descriptions/creators/media counts/languages/content flags from the full storefront appdetails set. | |||
| data.items[].tag_ids | array | No | ||||
| data.items[].tag_schema_version | integer | No | ||||
| data.items[].tags | array | No | Tags is the weighted community-tag taxonomy (Roguelike/Metroidvania/Cozy...), ordered most-weighted first — the crowd tags appdetails genres omit. Populated by the separate tag-enrichment pass (workers/steamdb tag mode via IStoreBrowseService), not the main crawl. TagIDs is the parallel raw id list; PrimaryTag is Tags[0]. | |||
| data.items[].tags_enriched_at | string | No | ||||
| data.items[].total_reviews | integer | No | ||||
| data.items[].type | string | No | ||||
| data.items[].website | string | 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/steam-games/search?q=coffee&is_free=true&windows=true&mac=true&linux=true&on_sale=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