Datasets API endpoint
Returns stored DoorDash stores within a radius of a point, nearest first, from dataset id `doordash-stores`. lat, lon, and radius_m are required. Unlike the live /doordash/search endpoint (which is a proximity search capped at roughly five stores), this queries the stored directory, so it can return every discovered store in the radius. Coverage is best-effort rather than provably exhaustive: a store DoorDash never surfaced, or one not yet hydrated with coordinates, will not appear. Billing: this endpoint 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/nearbyQuery parameters:
lat: required. Center latitude, from -90 through 90.lon: required. Center longitude, from -180 through 180.radius_m: required. Search radius in meters, from 1 through 50000. Unlike /search, this is required rather than optional.country: optional ISO-3166-1 alpha-2 country filter.tag: optional single marketplace tag filter.dash_pass_only: optional boolean; when true, keeps only DashPass-eligible stores.pagination: optional mode, offset (default) or cursor.cursor: opaque continuation token returned as next_cursor. Send it with pagination=cursor and the same location, filters, and page size. Cursor tokens expire after five minutes; restart the 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:
distance_meters from the query point. There is no sort parameter, because distance ordering is the only meaningful order for a radius query.latitude and longitude; address and phone are populated whenever DoorDash's store card provides them.display_status, display_asap_time, asap_available, and pickup_available are a point-in-time pickup observation from the crawl, not a live ordering capability.terminal rather than silently re-crawled forever.total: 0), not an error.Use pagination=cursor when a radius can contain more than 10000 stores. Continue with the returned next_cursor until has_more is false, keeping the same location and filters on each request.
1 credit per record returned, minimum 2. A call 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 5 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 | 20 | 4.2 to 4.8, median 4.6 |
| number_of_ratings | 20 | 138 to 21,108, median 634 |
| dash_pass_eligible | 20 | true in 20 of 20 |
| display_status | 20 | |
| display_asap_time | 20 | |
| asap_available | 20 | true in 20 of 20 |
| pickup_available | 20 | true in 20 of 20 |
| tags | 19 | median 5 entries |
| search_text | 20 | median 161 characters |
| top_items | 20 | median 22 entries |
| cover_image_url | 20 | img.cdn4dd.com |
| first_seen_at | 20 | 2026-10-01 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 | |
| distance_meters | 20 | 39.93 to 524.94, median 294.95 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| lat | number | Yes | Center latitude, from -90 through 90 | 40.7484257 | |
| lon | number | Yes | Center longitude, from -180 through 180 | -73.98567 | |
| radius_m | integer | Yes | Search radius in meters, 1 through 50000 | 5000 | |
| country | string | No | ISO-3166-1 alpha-2 country filter | ||
| tag | string | No | Single marketplace tag filter | ||
| dash_pass_only | boolean | No | Keep only DashPass-eligible stores | ||
| 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 location and filters | ||
| 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/nearby?lat=40.7484257&lon=-73.98567&radius_m=5000&country=us&dash_pass_only=true&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",
"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,
"dash_pass_eligible": true,
"display_status": "Open",
"asap_available": true,
"pickup_available": true,
"distance_meters": 483,
"last_seen_at": "2026-10-01T04:12:09Z"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "distance_asc",
"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 | ||||
| data.items[].address | string | No | ||||
| data.items[].asap_available | boolean | No | ||||
| data.items[].average_rating | number | No | ||||
| data.items[].city | string | No | ||||
| data.items[].city_region | string | No | ||||
| data.items[].country | string | No | ||||
| data.items[].cover_image_url | string | No | ||||
| data.items[].crawled_at | string | No | ||||
| data.items[].dash_pass_eligible | boolean | No | ||||
| data.items[].discovery_city | string | No | Discovery geography identifies the GeoNames seed cell that produced this observation. It is not a claim that the store's postal city matches the seed city's name; hydrated City/State come from the store-info card. | |||
| data.items[].discovery_country | string | No | ||||
| data.items[].discovery_state | string | No | ||||
| data.items[].display_asap_time | string | No | ||||
| data.items[].display_status | string | No | ||||
| data.items[].distance_meters | number | No | ||||
| data.items[].first_seen_at | string | No | ||||
| data.items[].has_phone | boolean | No | ||||
| data.items[].has_website | boolean | No | ||||
| data.items[].id | string | No | ||||
| data.items[].last_seen_at | string | No | ||||
| data.items[].latitude | number | No | ||||
| data.items[].location | object | No | Location is a geo_point ([lon, lat] order in the GeoPoint helper). | |||
| data.items[].location.lat | number | No | Latitude in decimal degrees. | |||
| data.items[].location.lon | number | No | Longitude in decimal degrees. | |||
| data.items[].longitude | number | No | ||||
| data.items[].name | string | No | ||||
| data.items[].number_of_ratings | integer | No | ||||
| data.items[].phone | string | No | ||||
| data.items[].pickup_available | boolean | No | ||||
| data.items[].postal_code | string | No | ||||
| data.items[].price_range | integer | No | ||||
| data.items[].run_id | string | No | ||||
| data.items[].schema_version | integer | No | ||||
| data.items[].search_text | string | No | ||||
| data.items[].state | string | No | ||||
| data.items[].store_id | string | No | ||||
| data.items[].street | string | No | ||||
| data.items[].tags | array | No | Tags is the marketplace's own comma-split tag list, kept as a keyword so it can back a terms facet; SearchText is the free-text projection over name + address + tags. | |||
| data.items[].top_items | array | No | TopItems is a bounded preview of the merchant's menu, stored unindexed. | |||
| data.items[].top_items[].image_url | string | No | ||||
| data.items[].top_items[].item_id | string | No | ||||
| data.items[].top_items[].name | string | No | ||||
| data.items[].top_items[].price | string | No | ||||
| data.items[].url | string | No | ||||
| data.items[].website | string | No | ||||
| 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/nearby?lat=40.7484257&lon=-73.98567&radius_m=5000&country=us&dash_pass_only=true&pagination=offset&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"