# Grubhub Restaurant & Menu Scraper (`parseforge/grubhub-scraper`) Actor

Scrapes Grubhub restaurant listings and menus by location, cuisine, or direct URL. Returns restaurant details and optional full menu items with prices.

- **URL**: https://apify.com/parseforge/grubhub-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 29 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.99 / 1,000 result items

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?

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Grubhub Restaurant & Menu Scraper

**Scrape Grubhub restaurants and menus from any city, ZIP code, or restaurant URL, up to a million per run.** Every restaurant comes with its rating, delivery info, cuisine, and full menu items with prices when you enable menu scraping. No login or API key. Export to CSV, JSON, Excel, or XML.

Grubhub's official API needs a partner account and rate-limits you. This reads the public restaurant and menu pages directly, filtered by cuisine or order method, and returns each match in one fixed schema. Search by location or paste a restaurant URL to get that one restaurant's full menu.

| Who uses it | What they scrape Grubhub for |
|---|---|
| Market researchers | Which restaurants and cuisines are available in a given city or ZIP code |
| Food delivery analysts | How menus and prices differ across Grubhub markets |
| Restaurant owners | What competitors in their area charge and offer on Grubhub |
| App developers | Building a local restaurant discovery feature with live Grubhub data |
| Lead generation teams | Building a list of restaurants with delivery and contact details |

### What it does

This Actor collects Grubhub restaurant listings and their menu items by location, cuisine, or direct URL, and returns each restaurant as a flat row with optional nested menu data.

- 📍 **Location search:** enter a city, address, or ZIP code to get restaurants in that area.
- 🔗 **Direct URL:** paste a Grubhub restaurant URL to scrape that one restaurant, or a city listing URL to scrape all restaurants on that page.
- 🍽️ **Full menu scraping:** enable scrapeMenu to fetch every menu item with its price for each restaurant.
- 🍕 **Cuisine filter:** narrow results to pizza, chinese, sushi, or any cuisine type.
- 🛵 **Order method:** choose delivery or pickup to match the restaurants to the service you care about.
- ⚡ **Concurrency control:** set maxConcurrency from 1 to 20 to balance speed against rate limits.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with Grubhub data

**📊 Market research on restaurant supply.**

A food delivery analyst scrapes all restaurants in Chicago, IL with cuisine filter set to pizza to map the competitive landscape and identify gaps.

**💰 Price monitoring for menu items.**

A restaurant owner enables scrapeMenu on competitor URLs to track menu prices and item availability over time.

**📍 Lead generation for delivery services.**

A B2B sales team scrapes restaurants by ZIP code with orderMethod delivery to build a prospect list of restaurants that offer delivery.

**📱 App data for a local food discovery feature.**

An app developer scrapes a city listing URL to populate a map of restaurants with ratings and cuisine types for their users.

**🔍 Competitor analysis for a single restaurant.**

A restaurant consultant pastes a competitor's Grubhub URL with scrapeMenu true to get their full menu and pricing in one run.

### Why choose this scraper

| | What you get |
|---|---|
| **No API key** | Scrapes public Grubhub pages directly, no registration or OAuth. |
| **Fixed schema** | Every restaurant returns the same flat fields, with menu items nested when enabled. |
| **Scale** | Collect up to 1,000,000 restaurants per run. |
| **Flexible input** | Search by location or paste any Grubhub restaurant or city URL. |
| **Export anywhere** | Download as CSV, JSON, Excel, or XML, or push to any API. |

### How it compares

This Actor focuses on restaurant and menu data, while the competitors below either add reviews or offer similar restaurant scraping with different feature sets.

| Feature | ParseForge | Grubhub Restaurant Reviews Scraper | Grubhub Restaurant Scraper | Grubhub Restaurant Scraper 🍽️ |
|---|---|---|---|---|
| Scrape restaurant listings by location | Yes | Not listed | Yes | Yes |
| Scrape full menu with prices | Yes | Not listed | Yes | Yes |
| Filter by cuisine | Yes | Not listed | Not listed | Not listed |
| Filter by order method (delivery/pickup) | Yes | Not listed | Not listed | Not listed |
| Scrape customer reviews | No | Yes | Not listed | Not listed |
| Scrape a single restaurant by URL | Yes | Not listed | Yes | Yes |

### Configure the run

Drive the Actor from a location, a restaurant URL, or a city listing URL, and filters run as each restaurant is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
 "location": "Chicago, IL",
 "maxItems": 10,
 "scrapeMenu": true
}
```

A larger pull:

```json
{
 "location": "Chicago, IL",
 "maxItems": 200,
 "scrapeMenu": true
}
```

### Pricing

Pay-per-result: **$0.01599 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $1.60 |
| 1,000 results | $15.99 |
| 10,000 results | $159.90 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Grubhub Restaurant & Menu Scraper](https://apify.com/parseforge/grubhub-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Grubhub through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=parseforge/grubhub-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check your location string. Use a specific city and state, like 'Chicago, IL', or a valid ZIP code. If you used startUrl, make sure it is a Grubhub restaurant or city listing URL. Also check your cuisine filter: if you typed a cuisine that does not exist in that area, you will get zero results.

**Why is the run so slow?**

Scraping full menus for many restaurants takes time. Reduce maxItems, or set scrapeMenu to false if you only need restaurant details. You can also increase maxConcurrency up to 20, but be careful not to get rate-limited.

**Why am I getting rate-limited or blocked?**

Lower maxConcurrency to 1 or 2. Add a delay between requests if possible. Run during off-peak hours. If the problem persists, use Apify proxies.

**Why are some menu items missing?**

Grubhub sometimes loads menu items dynamically. The Actor waits for the page to load, but if items are still missing, try running again. Some restaurants may have incomplete menus on Grubhub itself.

**Can I scrape a restaurant URL that is not in the US?**

Grubhub URLs are US-based. If you have a URL from another country, it may not work. Use a US location or URL.

### FAQ

| Question | Answer |
|---|---|
| Do I need a Grubhub account or API key? | No. This Actor scrapes public Grubhub pages directly. You only need an Apify account to run it. |
| Can I scrape a single restaurant's full menu? | Yes. Paste the restaurant's Grubhub URL into startUrl and set scrapeMenu to true. The Actor will fetch that restaurant and all its menu items with prices. |
| How do I search by location? | Enter a city, address, or ZIP code in the location field. The Actor will search Grubhub for restaurants in that area. You can also paste a city listing URL into startUrl. |
| What does the cuisine filter do? | It filters restaurants by cuisine type, such as pizza, chinese, or sushi. Leave it empty to get all cuisines. |
| What is the difference between delivery and pickup? | The orderMethod field filters restaurants by the type of order they support. Choose delivery to get restaurants that deliver, or pickup for restaurants that offer pickup. |
| How many restaurants can I scrape in one run? | You can set maxItems up to 1,000,000. The default is 10. Note that scraping full menus for many restaurants will take longer. |
| Will I get rate-limited? | Grubhub may rate-limit aggressive scraping. Lower maxConcurrency to 1 or 2 if you see errors, and consider running during off-peak hours. |
| What format is the data in? | The Actor returns JSON by default. You can export to CSV, Excel, XML, or JSON from the Apify dataset. |
| Can I scrape restaurant reviews with this Actor? | No, this Actor scrapes restaurant listings and menus, not reviews. For reviews, use the Grubhub Restaurant Reviews Scraper. |
| Does this Actor work outside the US? | Grubhub operates primarily in the US. The Actor works for any location Grubhub serves, but coverage outside the US is limited. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Grubhub Holdings Inc. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `location` (type: `string`):

City, address, or ZIP code to search for restaurants (e.g. 'Chicago, IL' or '10001'). If not provided, uses startUrl to extract location.

## `startUrl` (type: `string`):

Grubhub restaurant URL or city listing URL. If provided with a restaurant URL, scrapes that restaurant directly. Overrides location filter.

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

How many restaurants to collect per run.

## `cuisine` (type: `string`):

Filter restaurants by cuisine type (e.g. 'pizza', 'chinese', 'sushi'). Leave empty to get all cuisines.

## `orderMethod` (type: `string`):

Type of order: delivery or pickup.

## `scrapeMenu` (type: `boolean`):

When enabled, fetches complete menu items with prices for each restaurant. Increases run time significantly.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel requests. Lower this if you get rate-limited.

## Actor input object example

```json
{
  "location": "Chicago, IL",
  "maxItems": 10,
  "orderMethod": "delivery",
  "scrapeMenu": true,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with all scraped items

# 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": "Chicago, IL",
    "maxItems": 10,
    "scrapeMenu": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/grubhub-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": "Chicago, IL",
    "maxItems": 10,
    "scrapeMenu": True,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/grubhub-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": "Chicago, IL",
  "maxItems": 10,
  "scrapeMenu": true
}' |
apify call parseforge/grubhub-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/grubhub-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/tMSrSvtQigS2rveoj/builds/NsRvPffJ2QQe44DSt/openapi.json
