DoorDash Scraper - Restaurants, Menus & Store Data avatar

DoorDash Scraper - Restaurants, Menus & Store Data

Pricing

from $2.20 / 1,000 results

Go to Apify Store
DoorDash Scraper - Restaurants, Menus & Store Data

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

8

Total users

2

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

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: includeMenuItems is 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

FieldDescriptionExample
rowTypeEntity represented.store
idStable row identifier.1234567
storeIdDoorDash store identifier.1234567
nameStore name.Example Restaurant
urlStore link.https://www.doordash.com/store/1234567/
descriptionStore description, when supplied.Sandwiches and salads
verticalStore category, when supplied.restaurant
cuisinesAvailable cuisine labels.["American", "Sandwiches"]
priceRangeDisplayed price range.$$
aggregateRating.ratingValueStore rating, when available.4.7
aggregateRating.ratingCountRating count; rounded counts remain text."1k+"
aggregateRating.reviewCountReview count, when separately supplied.128
deliveryFeeDisplayed delivery fee, not the order total.$1.99
etaTextDelivery estimate or unavailable-store message.25 min
currencyStore currency, when supplied.USD
isCurrentlyAvailableWhether the store is currently available.true
offersDeliveryWhether delivery is offered, when known.true
offersPickupWhether pickup is offered, when known.true
menuItemCountItems found, not necessarily delivered.12
address.addressLocalityStore city.Houston
geoCoordinates when supplied.{"lat":29.76,"lng":-95.37}
phonesPublic phone entries.[]
emailsPublic email entries.[]
storeHoursOpening hours, when available.{"display":"10:00 AM–9:00 PM"}
leadAbsencesReasons contact fields are empty.{}
scrapedAtCollection 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.

FieldDescriptionExample
rowTypeSeparately billed menu item.menuItem
idStore-linked item identifier.1234567:98765
nameItem name.Grilled Chicken Sandwich
descriptionAvailable item description.Grilled chicken, lettuce and tomato on sourdough
pricePrice text; not guaranteed numeric.$12.50
currencyItem currency, when supplied.USD
priceValueNumeric price, when available.12.5
priceCurrencyCurrency associated with priceValue, when available.USD
sectionMenu section.Sandwiches
ratingItem rating text, not a store star rating.92% (25)
imageItem image link, when available.https://example.com/menu-item.jpg
storeIdParent store identifier.1234567
storeNameParent store name.Example Restaurant
storeUrlParent store link.https://www.doordash.com/store/1234567/
storeAddressParent 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

FieldDescriptionExample
rowTypeCity directory row.city
idStable identifier for the city entry.https://www.doordash.com/food-delivery/houston-tx-restaurants/
urlCity page address.https://www.doordash.com/food-delivery/houston-tx-restaurants/
countryDirectory market.us

Cuisine rows

FieldDescriptionExample
rowTypeCuisine directory row.cuisine
idStable identifier for the cuisine entry.https://www.doordash.com/food-delivery/houston-tx-restaurants/pizza/
urlCuisine page address.https://www.doordash.com/food-delivery/houston-tx-restaurants/pizza/
countrySelected 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

  1. Open DoorDash Scraper in Apify Console.
  2. Fill a target, such as citySlug, and select its country.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. 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.

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

FieldWhat to enterDefault
modeKeep automatic selection or choose a mode above.auto
citySlugDoorDash city path segment.Empty; sample houston-tx
countryus, ca, au or nz.us
queryStore search words.Empty
cuisineSlugCuisine name or path segment.Empty
categorySlugAlternative to cuisineSlug.Empty
storeUrlDoorDash store address.Empty
storeIdNumeric store identifier.Empty
startUrlsList of DoorDash store URLs.Empty
addressDelivery address or postal code.Empty
maxResultsRows per input, from 1 to 500.70; sample 3
includeMenuItemsAdd separately billed menu-item rows.false
localeAlternative to country.us
regionIdOptional region segment for a store URL.Empty
storeSlugOptional store name segment for a store URL.Empty
enrichDetailsRequest extra store details where supported.false
enrichLimitLimit extra-detail requests where supported.0
loadMoreRequest more visible listings where supported.false
useEnPrefixUse an English-language cuisine URL path.false
sitemapKindLegacy catalogue selection; currently returns stores.store
sitemapLocaleLegacy catalogue locale, such as en-US.Empty
sitemapShardUrlLegacy catalogue URL; leave empty.Empty
maxShardsLegacy 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 planStart eventPrice per rowPrice 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
  • maxResults applies 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 (maxTotalChargeUsd in 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 ApifyClient
client = 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

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

  • discoverCities is U.S.-only; other markets return unsupported_market.
  • discoverDishes, discoverProducts and sitemap currently 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.

More food delivery and grocery scrapers from the same publisher:

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.