Datasets API endpoint
Searches the DoorDash merchant-location directory (dataset id `doordash-stores`). Identity and marketplace fields (name, marketplace tags, price range, ratings, DashPass eligibility) are available for each store; contact, address, and coordinates can be missing for a store that has not been fully processed yet. `display_status`, `display_asap_time`, `asap_available`, and `pickup_available` are a point-in-time observation of the PICKUP surface at crawl time, not a durable capability. Geographic coverage is best-effort. Supports full-text `q`, `country`/`state`/`city`/`tag` filters, `dash_pass_only`, `min_price`/`max_price`/`min_rating`, `lat`/`lon`/`radius_m` radius filtering, and `sort` (relevance, rating, distance, distance_asc). `sort=relevance` ranks by text-match score when `q` is supplied; without `q` it sorts by store name. Use `pagination=cursor` and the returned `next_cursor` to enumerate beyond the 10,000-result offset window against a point-in-time snapshot. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/doordash-stores/searchSearches the DoorDash store directory, built by grid-tiling the anonymous Explore feed around its hard 40-store cap and storing every discovered store in a search index. Every discovered store is then hydrated through the public store-detail lookup, so records carry a real address and coordinates even though Explore itself returns none.
Dataset id enum:
doordash-storesQuery parameters:
q: optional full-text search over store name, address, and marketplace tags, max 256 characters.country: optional ISO-3166-1 alpha-2 country filter, e.g. US, CA. Free-form: it is not drawn from a closed value set, so /facets?facet=country is the discovery source.state: optional state/region filter, e.g. CA.city: optional exact city filter.tag: optional single marketplace tag filter, e.g. Pizza, Grocery. Discover the live set with /facets?facet=tags.dash_pass_only: optional boolean; when true, keeps only stores DoorDash marks DashPass eligible.min_price, max_price: optional price-range tier bounds, inclusive. Tiers run from 1 (least expensive) to 4; a bound outside that scale is pulled to the nearest tier.min_rating: optional minimum aggregate rating, 0 through 5. Stores DoorDash reports with no rating are excluded when this is set.lat, lon: optional coordinate for radius filtering or distance sort; supply together.radius_m: optional radius in meters, 1 through 50000; requires lat and lon.sort: optional sort order. One of relevance, rating, distance, distance_asc. relevance sorts text matches by Elasticsearch score when q is supplied; with no q, it sorts by store name.pagination: optional mode, offset (default) or cursor.cursor: opaque continuation token returned as next_cursor. Send it with pagination=cursor and the same query, filters, sort, and page size. Cursor tokens expire after five minutes; start a new cursor traversal if one expires.page: 1-based offset page number, default 1. It is only used with pagination=offset; omit it when continuing with a cursor.page_size: default 20, max 100. Offset pagination is limited to the first 10000 results; cursor pagination can enumerate the full point-in-time result set.Notable response behavior:
display_status, display_asap_time, asap_available, and pickup_available are a point-in-time pickup observation captured during the crawl, not a durable statement that a merchant accepts pickup orders. Do not cache them as a capability.has_phone, has_website, address, latitude, and longitude may be absent on a store that has been discovered but not yet filled in; it is still a valid record.discovery_city, discovery_state, and discovery_country identify the GeoNames seed cell that found the store. They are provenance hints; city and state come from the hydrated merchant address when available.price_range is DoorDash's own tier, 1 through 4. DoorDash publishes a value outside that scale for a very small number of stores; those are returned with no price_range and never match a price filter.top_items is a bounded preview of the merchant's menu. It is not a full menu and changes frequently.total: 0), not an error.For a complete export, request pagination=cursor. When has_more is true, pass the response's next_cursor on the next request with the same filters and sort. Elasticsearch keeps a point-in-time snapshot open for up to five minutes between pages, so updates during traversal do not shift rows between pages. The final page has has_more: false and omits next_cursor.
1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| store_id | 20 | |
| name | 20 | |
| url | 20 | doordash.com |
| phone | 20 | |
| has_phone | 20 | true in 20 of 20 |
| has_website | 20 | true in 10 of 20 |
| address | 20 | |
| street | 20 | |
| city_region | 20 | |
| city | 20 | |
| state | 20 | |
| country | 20 | |
| discovery_city | 20 | |
| discovery_state | 20 | |
| discovery_country | 20 | |
| location | 20 | |
| latitude | 20 | |
| longitude | 20 | |
| price_range | 20 | 1 to 2, median 2 |
| average_rating | 19 | 4.1 to 4.8, median 4.5 |
| number_of_ratings | 19 | 44 to 17,749, median 1,224 |
| dash_pass_eligible | 20 | true in 17 of 20 |
| display_status | 20 | |
| display_asap_time | 20 | |
| asap_available | 20 | true in 15 of 20 |
| pickup_available | 20 | true in 15 of 20 |
| tags | 19 | median 3 entries |
| search_text | 20 | median 159 characters |
| top_items | 20 | median 22 entries |
| cover_image_url | 20 | img.cdn4dd.com |
| first_seen_at | 20 | 2026-10-02 to 2026-10-04 |
| last_seen_at | 20 | 2026-10-02 to 2026-10-05 |
| run_id | 20 | |
| crawled_at | 20 | 2026-10-02 to 2026-10-05 |
| schema_version | 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text search over store name, address, city, and marketplace tags, max 256 characters | ||
| country | string | No | ISO-3166-1 alpha-2 country filter, e.g. US, CA | ||
| state | string | No | State/region code filter, e.g. CA | ||
| city | string | No | Exact city filter | ||
| tag | string | No | Single marketplace tag filter, e.g. Pizza | ||
| dash_pass_only | boolean | No | Keep only DashPass-eligible stores | ||
| min_price | integer | No | Minimum price range tier, inclusive | ||
| max_price | integer | No | Maximum price range tier, inclusive | ||
| min_rating | number | No | Minimum aggregate rating, 0 through 5; excludes unrated stores | ||
| lat | number | No | Latitude for radius filtering or distance sort, requires lon | ||
| lon | number | No | Longitude for radius filtering or distance sort, requires lat | ||
| radius_m | integer | No | Radius in meters, 1 through 50000; requires lat and lon | ||
| sort | string | No | Sort enum: relevance, rating, distance, distance_asc Allowed values: relevance, rating, distance, distance_asc. | ||
| pagination | string | No | Pagination mode: offset or cursor. Cursor mode supports full enumeration beyond the offset result window. Allowed values: offset, cursor. | ||
| cursor | string | No | Opaque continuation token returned in next_cursor; use with pagination=cursor and the same filters and sort | ||
| page | integer | No | 1 | Offset page number, defaults to 1; ignored by cursor pagination except page=1 to start | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; the 10,000-result cap applies only to offset pagination | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/doordash-stores/search?q=coffee&country=us&dash_pass_only=true&sort=relevance&pagination=offset&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "doordash-stores",
"items": [
{
"id": "454089",
"store_id": "454089",
"name": "DoorDash - Hayes Valley",
"url": "https://www.doordash.com/store/454089",
"phone": "+14155550123",
"has_phone": true,
"address": "300 Hayes St, San Francisco, CA 94102",
"city": "San Francisco",
"state": "CA",
"country": "US",
"latitude": 37.77635,
"longitude": -122.4243,
"average_rating": 4.6,
"number_of_ratings": 231,
"dash_pass_eligible": true,
"display_status": "Open",
"asap_available": true,
"pickup_available": true,
"tags": [
"Pizza",
"Desserts"
],
"last_seen_at": "2026-10-01T04:12:09Z"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "relevance",
"pagination": "offset",
"has_more": false
}
}Request schema
No body schema
Response schema
#/definitions/datasets.doorDashStoresSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.DoorDashStoreSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.has_more | boolean | No | ||||
| data.items | array | No | DoorDashStoreDatasetItem record, 45 fields: address, asap_available, average_rating, city, city_region, country, cover_image_url, crawled_at, dash_pass_eligible, discovery_city, discovery_country, discovery_state and 27 more. Described under Nearby DoorDash stores API. | |||
| data.next_cursor | string | No | ||||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.pagination | string | No | ||||
| data.sort | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/doordash-stores/search?q=coffee&country=us&dash_pass_only=true&sort=relevance&pagination=offset&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"