Datasets API endpoint
Use Crawlora's Search vehicle listings 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/vehicle-listings/searchSearches the crawled used-vehicle listings index. source enum: `carmax`, `autotrader`, `carsdotcom`. CarMax's own national inventory is fully enumerable (re-crawled on a standing schedule); Autotrader/Cars.com coverage is a best-effort zip-code sweep, not exhaustive, and their rows approximate city/state from the searched area rather than the seller's exact location. seller_type enum: `retailer`, `dealer`, `private` (not populated for every row -- see the dataset markdown). Sort enum: `relevance`, `recently_updated`, `newly_listed`, `price_asc`, `price_desc`, `mileage_asc`, `mileage_desc`, `year_desc`, `year_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 make, model and trim, max 256 characters | ||
| source | string | No | Exact source marketplace filter: carmax, autotrader, carsdotcom Allowed values: carmax, autotrader, carsdotcom | ||
| make | string | No | Exact make filter (e.g. Honda, Toyota), max 128 characters | ||
| model | string | No | Exact model filter (e.g. Civic), max 128 characters | ||
| trim | string | No | Exact trim filter, max 128 characters | ||
| body_style | string | No | Exact body style filter (e.g. Sedan, SUV), max 128 characters | ||
| transmission | string | No | Exact transmission filter, max 128 characters | ||
| drive_type | string | No | Exact drivetrain filter, max 128 characters | ||
| fuel_type | string | No | Exact fuel type filter (e.g. Gas, Hybrid, Electric), max 128 characters | ||
| seller_type | string | No | Exact seller type filter: retailer, dealer, private Allowed values: retailer, dealer, private | ||
| state | string | No | Exact US state abbreviation filter (e.g. CA), max 8 characters | ||
| vin | string | No | Exact VIN filter. Best-effort: not guaranteed on every listing | ||
| run_id | string | No | Exact crawl run-id filter, max 128 characters | ||
| is_price_reduced | boolean | No | Filter for listings currently marked down from a previous price | ||
| min_year | integer | No | Minimum model year | ||
| max_year | integer | No | Maximum model year | ||
| min_price | number | No | Minimum price in US dollars | ||
| max_price | number | No | Maximum price in US dollars | ||
| max_mileage | integer | No | Maximum odometer mileage | ||
| sort | string | No | Sort enum: relevance, recently_updated, newly_listed, price_asc, price_desc, mileage_asc, mileage_desc, year_desc, year_asc Allowed values: relevance, recently_updated, newly_listed, price_asc, price_desc, mileage_asc, mileage_desc, year_desc, year_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/vehicle-listings/search?q=coffee&source=carmax&seller_type=retailer&is_price_reduced=true&sort=relevance&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.
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": "vehicle-listings",
"items": [
{
"id": "carmax:28187774",
"source": "carmax",
"source_listing_id": "28187774",
"vin": "1FMJK1K89REA27006",
"year": 2024,
"make": "Ford",
"model": "Expedition Max",
"trim": "Limited",
"body_style": "4D Sport Utility",
"mileage": 41406,
"exterior_color": "Black",
"transmission": "Automatic",
"drive_type": "Rear Wheel Drive",
"fuel_type": "Gas",
"price": 45998,
"is_price_reduced": false,
"seller_type": "retailer",
"seller_name": "Canoga Park",
"city": "Los Angeles",
"state": "CA",
"url": "https://www.carmax.com/car/28187774",
"accident_count": 0,
"owner_count": 1,
"first_seen_at": "2026-08-20T00:00:00Z",
"last_seen_at": "2026-08-20T00:00:00Z",
"schema_version": 1
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "recently_updated"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.vehicleListingsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.VehicleListingSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | ||||
| data.items[].accident_count | integer | No | AccidentCount/OwnerCount come from a source's vehicle-history detail (CarMax's own /vehicle/{stock_number} History block as of 2026-08-20; reserved for other sources with an equivalent field). Pointers, not plain ints: 0 is a real, safety-relevant claim ("confirmed zero accidents") distinct from "we haven't enriched this listing yet". Populated only for a bounded number of newly-discovered listings per crawl pass, not backfilled for the whole catalog at once. | |||
| data.items[].body_style | string | No | ||||
| data.items[].city | string | No | ||||
| data.items[].crawled_at | string | No | ||||
| data.items[].drive_type | string | No | ||||
| data.items[].engine | string | No | ||||
| data.items[].exterior_color | string | No | ||||
| data.items[].first_seen_at | string | No | FirstSeenAt/LastSeenAt are our own crawl-observed dates, not upstream fields -- see the type doc comment. Both are RFC3339. | |||
| data.items[].fuel_type | string | No | ||||
| data.items[].id | string | No | ||||
| data.items[].image_url | string | No | ||||
| data.items[].interior_color | string | No | ||||
| data.items[].is_price_reduced | boolean | No | ||||
| data.items[].last_seen_at | string | No | ||||
| data.items[].latitude | number | No | ||||
| data.items[].longitude | number | No | ||||
| data.items[].make | string | No | ||||
| data.items[].mileage | integer | No | ||||
| data.items[].model | string | No | ||||
| data.items[].owner_count | integer | No | ||||
| data.items[].previous_price | number | No | ||||
| data.items[].price | number | No | ||||
| data.items[].run_id | string | No | ||||
| data.items[].schema_version | integer | No | ||||
| data.items[].seller_name | string | No | ||||
| data.items[].seller_type | string | No | SellerType is "retailer" for CarMax (its own inventory, not a dealer network) and reserved "dealer"/"private" values for future sources that aggregate third-party sellers (Autotrader, Cars.com). | |||
| data.items[].source | string | No | ||||
| data.items[].source_listing_id | string | No | ||||
| data.items[].state | string | No | ||||
| data.items[].transmission | string | No | ||||
| data.items[].trim | string | No | ||||
| data.items[].url | string | No | ||||
| data.items[].vin | string | No | ||||
| data.items[].year | 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/vehicle-listings/search?q=coffee&source=carmax&seller_type=retailer&is_price_reduced=true&sort=relevance&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