DoorDash Scraper - Restaurants, Menus & Store Data
Pricing
from $2.20 / 1,000 results
DoorDash Scraper - Restaurants, Menus & Store Data
Extract DoorDash store details, restaurant listings and optional menu-item rows in the US, Canada, Australia and New Zealand. Pay per delivered row plus a start fee; discovery coverage varies by mode.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
8
Total users
2
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
DoorDash Scraper
Extract DoorDash restaurant listings, store details and optional menu-item rows for the United States, Canada, Australia and New Zealand.
- Store identifiers, addresses, ratings, review counts and delivery estimates when available.
- City, cuisine and keyword searches with a row limit for each input.
- Optional menu-item rows with names, descriptions and prices, linked to their store.
- Exportable city and store-link discovery rows, with coverage limits below.
- Pay $3 per 1,000 rows on the Free plan, plus a $0.005 start event.
What does DoorDash Scraper do?
DoorDash Scraper collects publicly available restaurant and retail information from DoorDash. Use it to compare store coverage, build restaurant directories or inspect a store's menu. It is unofficial and is not affiliated with DoorDash.
- Listings: choose a city, cuisine, category, keyword or delivery location.
- Store details: supply a store URL or ID; convenience stores use a separate mode.
- Discovery: list U.S. cities, cuisine links or store links. Dish and product discovery currently return store links, not individual dishes or products.
- Menu items:
includeMenuItemsis off by default. Each added row costs the same as a store row and shares that input's row limit.
What data can you extract from DoorDash?
Fields depend on the selected mode and what DoorDash shows. Missing contact details stay empty; their absence does not mean a store has no phone or email.
Store rows
| Field | Description | Example |
|---|---|---|
rowType | Entity represented. | store |
id | Stable row identifier. | 1234567 |
storeId | DoorDash store identifier. | 1234567 |
name | Store name. | Example Restaurant |
url | Store link. | https://www.doordash.com/store/1234567/ |
description | Store description, when supplied. | Sandwiches and salads |
vertical | Store category, when supplied. | restaurant |
cuisines | Available cuisine labels. | ["American", "Sandwiches"] |
priceRange | Displayed price range. | $$ |
aggregateRating.ratingValue | Store rating, when available. | 4.7 |
aggregateRating.ratingCount | Rating count; rounded counts remain text. | "1k+" |
aggregateRating.reviewCount | Review count, when separately supplied. | 128 |
deliveryFee | Displayed delivery fee, not the order total. | $1.99 |
etaText | Delivery estimate or unavailable-store message. | 25 min |
currency | Store currency, when supplied. | USD |
isCurrentlyAvailable | Whether the store is currently available. | true |
offersDelivery | Whether delivery is offered, when known. | true |
offersPickup | Whether pickup is offered, when known. | true |
menuItemCount | Items found, not necessarily delivered. | 12 |
address.addressLocality | Store city. | Houston |
geo | Coordinates when supplied. | {"lat":29.76,"lng":-95.37} |
phones | Public phone entries. | [] |
emails | Public email entries. | [] |
storeHours | Opening hours, when available. | {"display":"10:00 AM–9:00 PM"} |
leadAbsences | Reasons contact fields are empty. | {} |
scrapedAt | Collection timestamp. | 2026-10-24T00:00:00+00:00 |
Ratings and review counts are different measures; neither promises written reviews. Fees and estimates depend on location and availability. Fields can be absent, empty or null.
Menu-item rows
| Field | Description | Example |
|---|---|---|
rowType | Separately billed menu item. | menuItem |
id | Store-linked item identifier. | 1234567:98765 |
name | Item name. | Grilled Chicken Sandwich |
description | Available item description. | Grilled chicken, lettuce and tomato on sourdough |
price | Price text; not guaranteed numeric. | $12.50 |
currency | Item currency, when supplied. | USD |
priceValue | Numeric price, when available. | 12.5 |
priceCurrency | Currency associated with priceValue, when available. | USD |
section | Menu section. | Sandwiches |
rating | Item rating text, not a store star rating. | 92% (25) |
image | Item image link, when available. | https://example.com/menu-item.jpg |
storeId | Parent store identifier. | 1234567 |
storeName | Parent store name. | Example Restaurant |
storeUrl | Parent store link. | https://www.doordash.com/store/1234567/ |
storeAddress | Parent address, when available. | {"addressLocality":"Houston"} |
Price fields vary by row: priceValue and priceCurrency may be absent even when price is present. currency is not guaranteed; do not infer it from a dollar sign alone.
City rows
| Field | Description | Example |
|---|---|---|
rowType | City directory row. | city |
id | Stable identifier for the city entry. | https://www.doordash.com/food-delivery/houston-tx-restaurants/ |
url | City page address. | https://www.doordash.com/food-delivery/houston-tx-restaurants/ |
country | Directory market. | us |
Cuisine rows
| Field | Description | Example |
|---|---|---|
rowType | Cuisine directory row. | cuisine |
id | Stable identifier for the cuisine entry. | https://www.doordash.com/food-delivery/houston-tx-restaurants/pizza/ |
url | Cuisine page address. | https://www.doordash.com/food-delivery/houston-tx-restaurants/pizza/ |
country | Selected market. | us |
Discovery can return store rows instead of cuisine rows when cuisine tags are unavailable. Check rowType before combining exports.
How to scrape DoorDash
- Open DoorDash Scraper in Apify Console.
- Fill a target, such as
citySlug, and select itscountry. - Set
maxResultsto 3 for a small first run. - Click Start and wait for completion.
- Download the dataset or read it through the API.
Empty input starts the Houston example, with at most 3 rows. Example rows are charged normally, including the start event. Filling one target lets mode: "auto" select a compatible mode. When an explicit mode lacks its required target, the Actor may select another mode from the fields supplied; INPUT_REPORT explains the choice.
City
Set citySlug, such as houston-tx, for local store listings. Match country to the city.
Cuisine
Combine citySlug with cuisineSlug, such as pizza, for cuisine search results.
Category
Use categorySlug with a city. It is an alternative name for cuisineSlug.
Catering
Select catering and a city. This mode is available, but a complete catering-only inventory is not guaranteed.
Store
Provide storeUrl or a numeric storeId. Enable includeMenuItems for separate menu rows; allow room for the store row too.
Convenience
Select convenience with a store ID or URL. Available store details do not imply a complete grocery catalogue.
Nearby stores
Use nearMe with address, including a postal code, or a city. Results depend on the resolved delivery location.
Search
Enter query and a city for free-text store search. A cuisine term can also supply the search term.
Sitemap
Select sitemap for store-link discovery. It currently returns store inventory, regardless of the older catalogue-selection options.
Discover cities
Select discoverCities with country: "us". Other countries return unsupported_market; this is not worldwide city enumeration.
Discover cuisines
Select discoverCuisines and a city. Results may be store links when cuisine tags are missing; the run summary notes this substitution.
Discover dishes
discoverDishes currently returns store links with a warning, not dish-level rows.
Discover products
discoverProducts currently returns store links with a warning, not product-level rows.
Start URLs
Select startUrls explicitly for a list of store URLs containing numeric store IDs. With automatic mode, start URLs follow the city-compatible route; do not assume every page type is supported.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | Keep automatic selection or choose a mode above. | auto |
citySlug | DoorDash city path segment. | Empty; sample houston-tx |
country | us, ca, au or nz. | us |
query | Store search words. | Empty |
cuisineSlug | Cuisine name or path segment. | Empty |
categorySlug | Alternative to cuisineSlug. | Empty |
storeUrl | DoorDash store address. | Empty |
storeId | Numeric store identifier. | Empty |
startUrls | List of DoorDash store URLs. | Empty |
address | Delivery address or postal code. | Empty |
maxResults | Rows per input, from 1 to 500. | 70; sample 3 |
includeMenuItems | Add separately billed menu-item rows. | false |
locale | Alternative to country. | us |
regionId | Optional region segment for a store URL. | Empty |
storeSlug | Optional store name segment for a store URL. | Empty |
enrichDetails | Request extra store details where supported. | false |
enrichLimit | Limit extra-detail requests where supported. | 0 |
loadMore | Request more visible listings where supported. | false |
useEnPrefix | Use an English-language cuisine URL path. | false |
sitemapKind | Legacy catalogue selection; currently returns stores. | store |
sitemapLocale | Legacy catalogue locale, such as en-US. | Empty |
sitemapShardUrl | Legacy catalogue URL; leave empty. | Empty |
maxShards | Legacy catalogue-part limit; leave unchanged. | 1 |
The extra-detail and legacy catalogue options do not guarantee more rows. Use store mode when you need a particular store's details.
Automatic selection:
{"citySlug":"houston-tx","maxResults":3}
City:
{"mode":"city","citySlug":"houston-tx","country":"us","maxResults":3}
Cuisine:
{"mode":"cuisine","citySlug":"houston-tx","cuisineSlug":"pizza","maxResults":3}
Category:
{"mode":"category","citySlug":"houston-tx","categorySlug":"pizza","maxResults":3}
Catering:
{"mode":"catering","citySlug":"houston-tx","maxResults":3}
Store and menu items:
{"mode":"store","storeId":"55229","includeMenuItems":true,"maxResults":5}
Convenience:
{"mode":"convenience","storeId":"1234567","maxResults":1}
Replace the illustrative convenience ID with a real DoorDash store ID.
Nearby stores:
{"mode":"nearMe","address":"95814","country":"us","maxResults":3}
Search:
{"mode":"search","query":"sushi","citySlug":"houston-tx","maxResults":3}
Sitemap:
{"mode":"sitemap","citySlug":"houston-tx","maxResults":3}
Cities:
{"mode":"discoverCities","country":"us","maxResults":3}
Cuisines:
{"mode":"discoverCuisines","citySlug":"houston-tx","maxResults":3}
Dishes:
{"mode":"discoverDishes","citySlug":"houston-tx","maxResults":3}
Products:
{"mode":"discoverProducts","citySlug":"houston-tx","maxResults":3}
Start URLs:
{"mode":"startUrls","startUrls":["https://www.doordash.com/store/55229/"],"maxResults":1}
maxItems and limit are accepted as aliases of maxResults. Unknown fields do not fail the run: close misspellings are corrected, and others are ignored with a note. Invalid country filters fall back to the default. Invalid targets stop immediately with INVALID_INPUT: <field> — <how to fix>, before any row charge. Each run writes its interpreted input, corrections and ignored fields to INPUT_REPORT in the default key-value store.
Output example
Illustrative store row; values and field availability vary by store:
{"rowType": "store","id": "1234567","storeId": "1234567","name": "Example Restaurant","title": "Example Restaurant","url": "https://www.doordash.com/store/1234567/","vertical": "restaurant","description": "Sandwiches and salads","aggregateRating": {"ratingValue": 4.7, "ratingCount": 1240, "reviewCount": 128},"deliveryFee": "$1.99","etaText": "25 min","currency": "USD","menuItemCount": 12,"address": {"addressLocality": "Houston", "addressRegion": "TX"},"phones": [],"emails": [],"scrapedAt": "2026-10-24T00:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY contains counts and warnings; ERROR_SUMMARY describes terminal failures when available. Menu-item rows are separate from store rows, not embedded menu lists.
Why use this DoorDash scraper?
- Pay for delivered rows. Unsuccessful collection attempts do not count as rows; the start event still applies.
- Keep partial results. Rows delivered before a stop remain in the dataset. Rows returned when the run reaches its time limit can also be delivered; abrupt termination may prevent final delivery.
- Understand errors. Input errors name the field and expected format.
- Keep missing values honest. Unavailable fields stay empty rather than being invented.
- Use several inputs. Supply several store URLs through
startUrls. - Skip proxy setup. You do not need to set up proxies.
How much does it cost to scrape DoorDash?
Pricing is per delivered row plus an Actor start event. The start event is $0.005 per GB of Actor memory, with at least one event. At the configured 1,024 MB default, the start fee is $0.005. Platform usage is included in these prices.
| Apify plan | Start event | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
maxResultsapplies to each input. The default is 70; larger requests are collected in parts of 70, up to the schema limit of 500 per input.- Store and menu-item rows share that limit. A limit of 5 can mean one store and four menu items, not five stores plus menus.
- Free-plan users are limited to 200 rows per run and 10 runs of this Actor. These are publisher limits.
- Maximum cost per run (
maxTotalChargeUsdin the API) caps the whole run's charges and may stop delivery before the requested row count.
Example: a Free-plan run delivering 5 rows costs 5 × $0.003 + $0.005 = $0.020 at the default memory setting. The empty-input example can deliver 3 rows and cost $0.014; it is not a free preview.
What happens when the run timeout is too short
When an accepted collection needs more time, the run can pause rather than fail. Its status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It appears as ABORTED temporarily.
When results are ready, the same run resumes, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped, so they are not delivered or charged twice. No manual restart is needed for this pause.
- The configured resume policy allows up to 3 attempts. Keep the default timeout of 3600 seconds to reduce pauses.
- Synchronous API endpoints (
run-sync,run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset during a pause. For longer jobs, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Claude, ChatGPT, Cursor and VS Code clients with remote MCP support can add:
https://mcp.apify.com?tools=lentic_clockss/doordash-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read the rows with get-dataset-items. For clients without remote support, run npx @apify/actors-mcp-server --tools lentic_clockss/doordash-scraper with APIFY_TOKEN set.
Example prompt: "Find 3 DoorDash restaurants in Houston using citySlug houston-tx and return their names and store URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/doordash-scraper").call(run_input={"citySlug": "houston-tx", "maxResults": 3})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/doordash-scraper').call({citySlug: 'houston-tx', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~doordash-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. Read results through GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Use the Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape DoorDash?
This Actor collects public data. You are responsible for checking DoorDash's terms and applicable data-protection law for your use. Personal data requires a lawful basis; public availability alone does not settle that question.
Why did my run end as ABORTED?
A temporary automatic pause can show ABORTED before the same run resumes. Check the status message. A manual abort or another failure is not necessarily part of that process.
How many results can I get?
Request up to 500 rows per input. Availability, shared menu-item limits, your cost cap and free-plan caps can reduce delivery. A requested limit is not a guaranteed count.
Why are some fields empty?
DoorDash does not expose every field for every store or location. List rows can have less detail than store rows; empty contact fields are expected.
Can I collect a complete store menu?
Enable includeMenuItems and choose store mode. Only available items within your row limit are delivered. A store row alone does not include an embedded full menu.
Are product and dish discovery actual product lists?
No. They currently return store links with a warning. Do not treat those rows as individual products, dishes or complete grocery inventories.
Can I discover Canadian, Australian or New Zealand cities?
Not with discoverCities, which supports the U.S. catalogue only. Other store and search modes accept those markets, with location-dependent availability.
Is this an official DoorDash API?
No. This is an independent Actor, not a DoorDash product or partnership.
Limitations
discoverCitiesis U.S.-only; other markets returnunsupported_market.discoverDishes,discoverProductsandsitemapcurrently provide store links. Cuisine discovery can also return stores.- Store URL lists need identifiable store IDs; arbitrary product or other page URLs are not guaranteed to work.
- Delivery location affects listings. Unresolvable locations can fail instead of returning another city's stores.
- Full written-review histories, complete menus and complete retail inventories are not guaranteed.
Related scrapers
More food delivery and grocery scrapers from the same publisher:
- Grab Scraper
- iFood Scraper
- PedidosYa Scraper
- Uber Eats Scraper
- Deliveroo Scraper
- Foodora Scraper
- Foodpanda Scraper
- Rappi Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.