# DoorDash Scraper - Stores, Menus, Reviews & Leads (`haketa/doordash-scraper`) Actor

Scrape DoorDash restaurants by US city: store leads (name, rating, cuisines, delivery fee, address, ETA), full menus with item prices, and customer reviews. No login or API key.

- **URL**: https://apify.com/haketa/doordash-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## DoorDash Scraper — Stores, Menus, Reviews & Restaurant Leads

Scrape **restaurants, menus and reviews from [DoorDash](https://www.doordash.com/)** — the #1 US food‑delivery marketplace. Enter one or more US cities and get a clean list of stores (restaurant **leads** with ratings, cuisines, delivery fees, ETA and full address), and optionally pull each store's **full menu with item prices** and its **customer reviews**.

No login, no API key, no browser extension. Give it a city, press **Start**, and download results as **JSON, CSV, Excel, HTML or XML** or via the API.

***

### Why scrape DoorDash?

- **Restaurant lead generation** — build lists of restaurants in any US metro with name, full address, profile URL, rating, review count, cuisines and price tier for sales/outreach.
- **Menu & price intelligence** — collect menu items and prices across restaurants for competitive pricing, menu research or catalog building.
- **Market & delivery research** — delivery fees, ETAs, price tiers, cuisine mix and ratings by city.
- **Review / reputation analysis** — recent customer reviews (text, star rating, date) per store.
- **Aggregators & food‑tech** — enrich your own restaurant database with DoorDash coverage, ratings and menus.

***

### Features

- 🏪 **Store leads by city** — ~50 restaurants per US city with name, rating, # ratings, cuisines, price tier, delivery fee, ETA, distance, **full address + coordinates**, logo, popular items and sponsored/pickup flags.
- 📋 **Full menus (optional)** — item name, description and price for every menu item.
- ⭐ **Reviews (optional)** — recent customer reviews with reviewer, star rating, date and text.
- 🎯 **Direct store URLs** — paste specific DoorDash store URLs to scrape exactly the stores you want.
- 🌎 **Any US city** — just enter `City, ST`.
- 🧾 **Clean, analysis‑ready output** — one row per store; numeric prices; deduped.

***

### Input

| Field | Type | Description |
|-------|------|-------------|
| `location` | array of strings | US cities as `City, ST` (e.g. `New York, NY`). ~50 stores each. |
| `storeUrls` | array of strings | Optional. Specific DoorDash store URLs to scrape directly. |
| `includeMenu` | boolean | Also scrape each store's full menu (item names + prices). Default `false`. |
| `includeReviews` | boolean | Also scrape each store's customer reviews. Default `false`. |
| `maxStores` | integer | Max stores to save across all cities (default 50). |
| `proxyConfiguration` | object | **US residential proxy required** (DoorDash is US‑only + Cloudflare‑protected). Defaults to Apify Residential US. |

#### Example input

```json
{
  "location": ["New York, NY", "Los Angeles, CA"],
  "includeMenu": true,
  "includeReviews": true,
  "maxStores": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

> **Tip:** Start with menus/reviews off to grab store leads for a whole city fast and cheap. Turn them on for a shortlist — each adds one page fetch per store.

***

### Output

One row per store. Menu and reviews are included only when enabled.

#### Example record

```json
{
  "storeId": "39641643",
  "name": "Big Wong Restaurant",
  "url": "https://www.doordash.com/store/big-wong-restaurant-new-york-39641643/",
  "averageRating": 4.6,
  "numRatings": 337,
  "cuisines": ["Cantonese", "Chinese"],
  "priceTier": 1,
  "deliveryFee": "$0 delivery fee",
  "etaMinutes": 22,
  "distance": "0.3 mi",
  "address": "67 Mott St, New York, NY 10013, USA",
  "streetAddress": "67 Mott St",
  "city": "New York",
  "state": "NY",
  "zipCode": "10013",
  "latitude": 40.716186,
  "longitude": -73.998245,
  "logo": "https://img.cdn4dd.com/.../header.png",
  "isSponsored": false,
  "offersPickup": false,
  "popularItems": ["Combination of any 2 items over rice", "Pork & Shrimp Shu Mai"],
  "menu": [
    { "id": "41262867532", "name": "Fried Homemade Wonton (10pcs)", "description": "Crispy wontons with shrimp & pork…", "price": 10.95, "priceDisplay": "2 for $10.95" },
    { "id": "…", "name": "Sliced Peking Duck (half)", "description": "Served with pancakes and scallions…", "price": 39.95, "priceDisplay": "$39.95" }
  ],
  "reviews": [
    { "reviewer": "Amy L", "rating": 5, "date": "2026-06-19T14:47:08.482Z", "text": "The quality of the duck got a lot better…" }
  ],
  "searchLocation": "New York, NY",
  "scrapedAt": "2026-10-13T13:06:00.000Z"
}
```

#### Field reference

**Store (always):** `storeId`, `name`, `url`, `averageRating`, `numRatings`, `numRatingsDisplay`, `cuisines[]`, `priceTier` (1–4 = $–$$$$), `deliveryFee`, `etaMinutes`, `distance`, `address`, `streetAddress`, `city`, `state`, `zipCode`, `latitude`, `longitude`, `logo`, `isSponsored`, `offersPickup`, `tags[]`, `popularItems[]`, `searchLocation`, `scrapedAt`.

**Menu (when `includeMenu`):** `menu[]` of `{ id, name, description, price, priceDisplay }`.

**Reviews (when `includeReviews`):** `reviews[]` of `{ reviewer, rating, date, text }` — the recent reviews DoorDash shows on the store page.

> **Coverage notes.** Each city page lists ~50 restaurants. DoorDash shows a handful of recent reviews per store page. Prices are the store's current displayed prices (some shown as "2 for $X" — `price` is the dollar amount, `priceDisplay` keeps the original text).

***

### How it works

DoorDash is US‑only and protected by a Cloudflare challenge. The actor passes it for you: it opens DoorDash once with a stealth browser over a US residential IP to obtain a verified session, then reuses that session over fast HTTP to read each page's embedded data. No setup needed beyond a US residential proxy (the default).

***

### Proxy

A **US residential proxy is required** — DoorDash blocks non‑US and datacenter traffic. The browser and all requests share one sticky US session so the Cloudflare clearance stays valid. The actor defaults to Apify Residential (US).

***

### FAQ

**Do I need an account or API key?** No. Enter a city and run.

**How many restaurants per city?** About 50 from each city's DoorDash page. Add more cities or store URLs for more.

**Can I get menus and reviews?** Yes — toggle `includeMenu` and/or `includeReviews`. Both come from the same store page, so enabling both costs the same as one.

**Why only a few reviews per store?** DoorDash displays a handful of recent reviews on each store page; the actor returns those.

**Can I scrape specific restaurants?** Yes — paste their DoorDash URLs into `storeUrls`.

***

### Related actors

Also check out scrapers for Grubhub, Uber Eats, Just Eat and Yelp, plus Google Maps business leads, on the Apify Store.

***

### Legal & ethical use

This actor collects **publicly available** restaurant, menu and review information. Use it responsibly and in line with DoorDash's Terms of Service and applicable laws (including privacy/CCPA and anti‑spam rules when contacting businesses). You are responsible for how you use the output.

# Actor input Schema

## `location` (type: `array`):

One or more US locations as <b>City, ST</b> — e.g. <b>New York, NY</b>, <b>Los Angeles, CA</b>, <b>Chicago, IL</b>. Each returns up to ~50 restaurants. Leave empty (and no store URLs) to run a small demo for New York, NY.

## `storeUrls` (type: `array`):

Optional. Paste specific DoorDash store URLs (e.g. https://www.doordash.com/store/big-wong-restaurant-new-york-39641643/) to scrape those stores directly. Works with or without the city list.

## `includeMenu` (type: `boolean`):

For each store, open its page and extract the full menu — item names, descriptions and prices. One extra request per store.

## `includeReviews` (type: `boolean`):

For each store, extract its customer reviews (reviewer, star rating, date, text). DoorDash shows a handful of recent reviews per store page. One extra request per store (shared with menus if both are on).

## `maxStores` (type: `integer`):

Maximum number of stores to save across all cities. Each city page lists ~50 restaurants.

## `proxyConfiguration` (type: `object`):

DoorDash is US-only and protected by Cloudflare — a US residential proxy is required (the actor solves the challenge once with a stealth browser, then reuses that US session over fast HTTP).

## Actor input object example

```json
{
  "location": [
    "New York, NY"
  ],
  "storeUrls": [],
  "includeMenu": false,
  "includeReviews": false,
  "maxStores": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted DoorDash stores (with menus/reviews when enabled) for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table view of the scraped stores.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": [
        "New York, NY"
    ],
    "maxStores": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/doordash-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": ["New York, NY"],
    "maxStores": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/doordash-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": [
    "New York, NY"
  ],
  "maxStores": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call haketa/doordash-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/doordash-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/whZYU8QNQh2V18FMc/builds/7Godhe7ofYaiFqolP/openapi.json
