# Grubhub Restaurant Scraper 🍽️ (`easyapi/grubhub-restaurant-scraper`) Actor

Scrape restaurant data from Grubhub including menus, prices, ratings, and delivery information. Extract detailed business information and menu items for market research, price monitoring, or competitor analysis.

- **URL**: https://apify.com/easyapi/grubhub-restaurant-scraper.md
- **Developed by:** [EasyApi](https://apify.com/easyapi) (community)
- **Categories:** E-commerce, Integrations, Other
- **Stats:** 54 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 1.00 out of 5 stars

## Pricing

from $2.99 / 1,000 results

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

## Grubhub Restaurant Scraper 🍽️

Powerful scraper for extracting detailed restaurant and menu data from Grubhub. Get comprehensive information about restaurants, their menus, prices, ratings, and delivery options.

### Features ✨

- Extract detailed restaurant information including:
  - Basic details (name, ID, description, logo)
  - Location data (address, coordinates)
  - Contact information
  - Rating and review counts
  - Cuisine types
  - Operating hours
  - Price rating

- Comprehensive menu data:
  - Menu item names and descriptions
  - Prices and categories
  - Item availability
  - Food images (when available)

- Delivery information:
  - Delivery availability
  - Minimum order amounts
  - Delivery fees
  - Estimated delivery times

### Use Cases 💡

- Market research and competitor analysis
- Menu and price monitoring
- Food delivery service optimization
- Restaurant database building
- Local business intelligence

### Input Parameters 📝

The actor accepts the following inputs:

- `searchUrls`: Array of Grubhub search URLs to scrape
- `maxItems`: Maximum number of items to scrape (optional)
- `proxyConfiguration`: Proxy settings (optional)

### Output 📊

Results are stored in JSON format with detailed restaurant and menu information. Each record contains:

- Complete restaurant profile
- Detailed menu items with prices
- Delivery options and fees
- Location and contact details
- Ratings and reviews data

### Tips 💪

- Use specific location-based search URLs for better results
- Adjust `maxItems` based on your needs
- Consider using proxies for large-scale scraping

#### Input Example

A full explanation of an input example in JSON.

```json
{
    "searchUrls": [
        "https://www.grubhub.com/search?orderMethod=delivery&locationMode=DELIVERY&facetSet=umamiV6&pageSize=36&hideHateos=true&searchMetrics=true&queryText=noodles&latitude=34.05490875&longitude=-118.24264527&geohash=9q5ctrd24xj7&includeOffers=true&featureControl=fastTagBadges%3Atrue&sortSetId=umamiv3&sponsoredSize=3&countOmittingTimes=true"
    ],
    "maxItems": 50
}
```

#### Output sample

The results will be wrapped into a dataset which you can always find in the **Storage** tab. Here's an excerpt from the data you'd get if you apply the input parameters above:

And here is the same data but in JSON. You can choose in which format to download your data: JSON, JSONL, Excel spreadsheet, HTML table, CSV, or XML.

```json
[
    {
        "searchUrl": "https://www.grubhub.com/search?orderMethod=delivery&locationMode=DELIVERY&facetSet=umamiV6&pageSize=36&hideHateos=true&searchMetrics=true&queryText=noodles&latitude=34.05490875&longitude=-118.24264527&geohash=9q5ctrd24xj7&includeOffers=true&featureControl=fastTagBadges%3Atrue&sortSetId=umamiv3&sponsoredSize=3&countOmittingTimes=true",
        "restaurant": {
            "id": "2249885",
            "merchant_id": "vZ2t8LtAEeqw3FFH06yU0w",
            "url": "https://www.grubhub.com/restaurant/noodle-world-1935-s-atlantic-blvd-monterey-park/2249885",
            "name": "Noodle World",
            "logo": "https://res.cloudinary.com/grubhub/image/upload/v1505314786/xvtxngssf4xlwy2e9tbm.png",
            "description": null,
            "rating": {
                "count": 428,
                "value": "4",
                "actual_value": 4.8937529313265244
            },
            "cuisines": [
                "Noodles",
                "Bubble Tea",
                "Coffee and Tea",
                "Ramen",
                "Salads",
                "Thai"
            ],
            "address": {
                "street": "1935 S Atlantic Blvd",
                "city": "Monterey Park",
                "state": "CA",
                "postal_code": "91754",
                "latitude": "34.04156112",
                "longitude": "-118.14218903"
            },
            "phone": "3238819898",
            "delivery": {
                "available": true,
                "minimum": 0,
                "fee": 0,
                "time_estimate": {
                    "min": 35,
                    "max": 50
                }
            },
            "price_rating": 3,
            "is_open": true,
            "next_closed_at": "2025-02-23T05:15:00.000Z"
        },
        "menu_items": [
            {
                "id": "20522860837",
                "name": "46. Noodle & Soup.",
                "description": "",
                "price": 9.99,
                "category": "Vietnamese Noodle Soup.",
                "available": true,
                "image": null
            },
            {
                "id": "20522860500",
                "name": "40. Noodle World Pho.",
                "description": "Rare slices of steak, well done flank, beef balls, tendon, tripe, onions, cilantro, green onions, and rice stick noodles. Soup flavored with lime juice, peanuts, and chili.",
                "price": 14.99,
                "category": "Vietnamese Noodle Soup.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/wvi4xqrisdmlfwqrwiw1.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860425",
                "name": "79. Noodle World Spaghetti.",
                "description": "Shrimp, squid mussels, imitation crab meat and spaghetti sautéed with garlic, vegetables, Thai Basil and chili.",
                "price": 16.99,
                "category": "Wok Noodles.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/vbdrl4tgsfbph3frmxqg.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860763",
                "name": "85. Singapore Noodles.",
                "description": "Shrimp and BBQ Pork wok fried with onions, green onions, eggs, curry powder, bean sprouts and rice vermicelli.",
                "price": 16.49,
                "category": "Wok Noodles.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/eyrpmetcoa7qhrwor1zk.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860891",
                "name": "84. Garlic Noodles.",
                "description": "Chicken, Japanese egg noodles, white mushrooms, shiitake mushrooms, corn, peas, butter, garlic, parmesan cheese.",
                "price": 15.49,
                "category": "Wok Noodles.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/c9rrvukj662xvoyfjsjl.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860482",
                "name": "79. Noodle World Spaghetti.",
                "description": "Shrimp, squid mussels, imitation crab meat and spaghetti sautéed with garlic, vegetables, Thai Basil and chili.",
                "price": 16.99,
                "category": "Wok Noodles.|72. RAD NAH|73. PAD SEE YOU|75. DRUNKEN NOODLE|77. CHOW MEIN|80. SPAGHETTI",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/vbdrl4tgsfbph3frmxqg.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860886",
                "name": "17. Noodle World Salad.",
                "description": "Boneless Thai BBQ chicken, mixed greens, cucumber, carrots, onion and tofu, tossed with sesame ginger dressing. ",
                "price": 14.29,
                "category": "Salads.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/vs9gkmhdtvqyknyokhou.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "20522860407",
                "name": "20. Noodle World Tom Yum.",
                "description": "Chicken, shrimp, ground pork, fish ball, fish cake, green onions, cilantro, and rice stick noodles in spicy tom yum soup flavored with lime juice, crushed peanuts, and chili flakes.",
                "price": 14.99,
                "category": "Thai Noodle Soups.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/xqcbunfupyc9zaxmrjvd.jpg",
                    "format": "jpg"
                }
            },
            {
                "id": "22771615871",
                "name": "30. House Noodles.",
                "description": "Chicken, shrimp, ground pork, fish ball, and fish cakes. Served with bean sprouts, green onions, and cilantro with egg noodles.",
                "price": 14.29,
                "category": "Chinese Noodle Soup.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/acey0ewn6lmnwswvniv6.png",
                    "format": "png"
                }
            },
            {
                "id": "20522860412",
                "name": "35. Chicken Noodles.",
                "description": "Chicken slices, bean sprouts, green onions, and cilantro",
                "price": 13.99,
                "category": "Chinese Noodle Soup.",
                "available": true,
                "image": {
                    "url": "https://media-cdn.grubhub.com/image/upload/w1xgiu6laln0fedm5fbk.jpg",
                    "format": "jpg"
                }
            }
        ]
    },
    ...
]
```

### Related Actors

- 🍽️ [Grubhub Restaurant Reviews Scraper](https://apify.com/easyapi/grubhub-restaurant-reviews-scraper) - Extract comprehensive customer reviews, ratings and order details from Grubhub restaurants
- 🍽️ [Uber Eats Store Search Scraper](https://apify.com/easyapi/uber-eats-store-search-scraper) - Extract detailed restaurant data from Uber Eats search results
- 🍽️ [Zomato Restaurant Reviews Scraper](https://apify.com/easyapi/zomato-restaurant-reviews-scraper) - Scrape restaurant reviews with ratings, review text and user information
- 🛍️ [Myntra Reviews Scraper](https://apify.com/easyapi/myntra-reviews-scraper) - Extract detailed review data including ratings, comments and user info
- 🛍️ [Flipkart Review Scraper](https://apify.com/easyapi/flipkart-review-scraper) - Scrape detailed product reviews including ratings, comments and user info
- 🛍️ [Noon.com Reviews Scraper](https://apify.com/easyapi/noon-com-reviews-scraper) - Extract detailed customer feedback, ratings and review images
- 🏨 [Hotels.com Review Scraper](https://apify.com/easyapi/hotels-com-review-scraper) - Scrape detailed hotel reviews including ratings and management responses
- 🏨 [TripAdvisor Reviews Scraper](https://apify.com/easyapi/tripadvisor-reviews-scraper) - Extract detailed hotel reviews with ratings and user information
- 🏨 [Booking Reviews Scraper](https://apify.com/easyapi/booking-reviews-scraper) - Extract guest reviews, ratings and booking information from hotels
- 🛍️ [Etsy Reviews Scraper](https://apify.com/easyapi/etsy-reviews-scraper) - Scrape product reviews with ratings, text and reviewer info
- 🛍️ [AppStore Reviews Scraper](https://apify.com/easyapi/app-store-reviews-scraper) - Collect and analyze user reviews from the App Store
- 🎮 [Steam Reviews Scraper](https://apify.com/easyapi/steam-reviews-scraper) - Extract comprehensive review data including helpfulness and play time
- 🛍️ [Meesho Reviews Scraper](https://apify.com/easyapi/meesho-reviews-scraper) - Extract product reviews including ratings, comments and review images
- 🏨 [Hostelworld Reviews Scraper](https://apify.com/easyapi/hostelworld-reviews-scraper) - Get comprehensive insights into traveler experiences and ratings
- 🎬 [IMDB Reviews Scraper](https://apify.com/easyapi/imdb-reviews-scraper) - Extract detailed user reviews, ratings and engagement metrics

# Actor input Schema

## `searchUrls` (type: `array`):

List of Grubhub search URLs to scrape

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

Maximum number of items to scrape (default: 100)

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

Proxy settings for the scraper

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.grubhub.com/search?orderMethod=delivery&locationMode=DELIVERY&facetSet=umamiV6&pageSize=36&hideHateos=true&searchMetrics=true&queryText=noodles&latitude=34.05490875&longitude=-118.24264527&geohash=9q5ctrd24xj7&includeOffers=true&featureControl=fastTagBadges%3Atrue&sortSetId=umamiv3&sponsoredSize=3&countOmittingTimes=true"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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("easyapi/grubhub-restaurant-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("easyapi/grubhub-restaurant-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 easyapi/grubhub-restaurant-scraper --silent --output-dataset

```

## MCP server setup

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