# DoorDash Store Details Scraper (`w3crawler/doordash-store-details-scraper`) Actor

Extract bounded public store details from explicit DoorDash store pages, including identity, address, rating, menu metadata, and public structured-data reviews.

- **URL**: https://apify.com/w3crawler/doordash-store-details-scraper.md
- **Developed by:** [w3crawler](https://apify.com/w3crawler) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 store details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DoorDash Store Details Scraper

This Actor extracts bounded public store details from explicit DoorDash `/store/` pages. It uses a consistent desktop-navigation header profile for direct HTTPS requests to official DoorDash hosts only, caps each response, follows a small number of same-host redirects, and never logs in, solves CAPTCHAs, or bypasses security controls. When DoorDash blocks an unlocalized `/store/` route, the Actor retries the equivalent official `/en/store/` route, which exposes the same public page data without requiring a session.

### Input

Pass `urls` or `startUrls` as an array of `{ "url": "https://www.doordash.com/store/..." }` objects. `url` is accepted as a single-target alias. `maxItems`, `timeoutMs`, `maxRequestRetries`, `requestDelayMs`, `maxBytes`, and `userAgent` are bounded request controls. `proxyConfiguration` accepts the standard Apify Proxy object and defaults to direct access. Unknown fields, credentials, non-HTTPS URLs, off-domain URLs, and non-store paths are retained only as explicit invalid-input diagnostics.

If no target is supplied, the Actor uses one checked-in public DoorDash store URL as a bounded live example. Test fixtures are used only by the automated parser tests and cannot be selected through Actor input.

### Output

Successful rows have `recordType: "doordash-public-store-details"` and include the public store ID/slug, name, location, address, phone, rating, review count, price range, cuisine, opening hours, menu metadata, bounded structured-data reviews, page metadata, extraction provenance, and timestamps when exposed. Blocked, failed, oversized, unsupported, or invalid targets are retained as diagnostics with exactly `url`, `error`, `errorCode`, and `scrapedAt`. The canonical `OUTPUT_SUMMARY` key-value record contains requested, successful, diagnostic, menu-item, review, transport, request, status, and completion metrics; `OUTPUT` remains as a backward-compatible copy. Operational request details stay out of normal dataset rows.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Run summary

`OUTPUT_SUMMARY` is the source of truth for run qualification. `successfulTargetCount` and `diagnosticTargetCount` reconcile with normal and diagnostic dataset rows; `menuItemCount` and `reviewCount` count bounded structured child records; `transportCounts` reports direct, Apify Proxy, and fixture target routes; and `completedAt` records completion. A `blocked` status means the public page returned a source boundary such as HTTP 403/429 or a security-verification page, while `empty` means no usable public store identity was exposed without a known boundary.

### Usage and cost

Start with one official store URL, `maxItems: 1`, low retries, and a respectful request delay. Runtime cost grows with target count, response size, retries, and any Apify Proxy traffic. Review `OUTPUT_SUMMARY` before increasing limits.

### FAQ

**Does this Actor log in or bypass a challenge?** No. It only requests the public DoorDash store page and reports access boundaries as diagnostics.

**Can I use fixture data for production verification?** No. Fixtures are restricted to local deterministic QA; Cloud qualification requires a live public page and a normal record whose `sourceTransport` is `direct` or `apify_proxy`.

### Local QA

From this Actor directory:

```text
npm ci --ignore-scripts --no-audit --no-fund
apify validate-schema
APIFY_LOCAL_STORAGE_DIR=./qa-storage apify run --purge --input-file test/inputs/default.json
APIFY_LOCAL_STORAGE_DIR=./qa-storage npm run validate
```

Use `test/inputs/live.json` with a public DoorDash store URL for a live boundary check. If direct access is blocked, a bounded cloud validation can set `proxyConfiguration.useApifyProxy` to `true`; proxy credentials are supplied by Apify and are never stored in input or output. A source-side HTTP 403/429 or security-verification page is reported explicitly as a diagnostic; it is not treated as successful extraction.

# Actor input Schema

## `urls` (type: `array`):

Public HTTPS DoorDash /store/ URLs to inspect.

## `startUrls` (type: `array`):

Compatibility alias for public HTTPS DoorDash /store/ URLs.

## `start_urls` (type: `array`):

Legacy compatibility alias for public HTTPS DoorDash /store/ URLs.

## `url` (type: `string`):

Optional single public HTTPS DoorDash /store/ URL alias.

## `maxItems` (type: `integer`):

Maximum number of targets processed in one local run.

## `timeoutMs` (type: `integer`):

Maximum time allowed for each direct public request.

## `maxRequestRetries` (type: `integer`):

Bounded retries for transient public request failures.

## `requestDelayMs` (type: `integer`):

Bounded delay between transient retries.

## `maxBytes` (type: `integer`):

Maximum UTF-8 response size retained from a public page.

## `fixtureFile` (type: `string`):

Repository-only fixture path under test/fixtures/.

## `fixtureHtml` (type: `string`):

Repository-only inline HTML for deterministic checks.

## `userAgent` (type: `string`):

Optional transparent HTTP user-agent string without control characters.

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

Optional standard Apify Proxy configuration. Direct access remains the default.

## Actor input object example

```json
{
  "urls": [],
  "startUrls": [],
  "start_urls": [],
  "maxItems": 10,
  "timeoutMs": 30000,
  "maxRequestRetries": 2,
  "requestDelayMs": 0,
  "maxBytes": 5000000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `legacySummary` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/doordash-store-details-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/doordash-store-details-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 '{}' |
apify call w3crawler/doordash-store-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,w3crawler/doordash-store-details-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/JIhPqzXviTDdqPnjH/builds/docBmdQbsYs5T2CjW/openapi.json
