# Grubhub Scraper API - Restaurants, Menus & Delivery Fees (`sweet_stickball/grubhub-scraper`) Actor

Grubhub scraper and API alternative: extract restaurants delivering to any US address or city with name, cuisines, rating, review count, price level, delivery fee, minimum order, delivery time, address, coordinates, phone, open status and optional full menu with prices. No login.

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

## Pricing

from $2.10 / 1,000 restaurants

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

## Grubhub Scraper - Restaurants, Menus & Delivery Fees

Scrapes Grubhub for restaurants that deliver to a US address, ZIP code or city, optionally filtered by a cuisine, dish or restaurant name. Returns one flat record per restaurant with its rating, price level, delivery fee, minimum order, delivery time window, address, coordinates, phone and open status. Optionally adds the restaurant's menu with item prices.

### What it does

- Resolves the `location` with Grubhub's own geocoder and runs the same delivery search as grubhub.com, in Grubhub's default ranking order.
- One dataset item per restaurant, de-duplicated by `restaurantId`. Delivery fee, minimum order and delivery time are the values Grubhub shows for that delivery location at run time.
- With `includeMenu: true`, each restaurant record gets a `menu` array of the currently available items (name, description, category, price in USD). Still one item (and one charge) per restaurant.
- Uses Grubhub's public web JSON API with an anonymous session (no login, no account).

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `location` | string | Yes | — | US delivery address, ZIP code or city, e.g. `New York, NY`, `350 5th Ave, New York, NY 10118` |
| `query` | string | No | — | Cuisine, dish or restaurant name, e.g. `pizza`, `sushi`. Empty = all restaurants delivering there |
| `maxItems` | integer | No | 20 | Maximum number of restaurants to return |
| `includeMenu` | boolean | No | false | Add the menu (items and prices) to each restaurant |

Example:

```json
{ "location": "Chicago, IL", "query": "pizza", "maxItems": 10, "includeMenu": true }
```

### Output

Real item from the input above (menu shortened to 2 of its 82 items):

```json
{
    "restaurantId": "13229592",
    "name": "Giordano's",
    "url": "https://www.grubhub.com/restaurant/giordanos-223-w-jackson-blvd-chicago/13229592",
    "cuisines": ["Pizza", "Italian", "Calzones", "Dessert", "Pasta", "Salads"],
    "rating": 4.55,
    "ratingCount": 55,
    "priceRating": 3,
    "deliveryFee": 4.0,
    "minimumOrder": 0.0,
    "currency": "USD",
    "deliveryTimeMin": 55,
    "deliveryTimeMax": 65,
    "address": "223 W Jackson Blvd, Chicago, IL 60606",
    "city": "Chicago",
    "state": "IL",
    "postalCode": "60606",
    "latitude": 41.87792587,
    "longitude": -87.634758,
    "phone": "+1 3125839400",
    "distanceMiles": 0.39,
    "isOpen": true,
    "offersDelivery": true,
    "offersPickup": true,
    "logoUrl": "https://media-cdn.grubhub.com/image/upload/v1760640334/dun2otbejqbcjlypzsxa.png",
    "searchLocation": "Chicago, IL",
    "searchQuery": "pizza",
    "scrapedAt": "2026-10-23T22:00:11.003276+00:00",
    "menu": [
        {
            "itemId": "361584040296",
            "name": "Italian Combo - Tavern Style",
            "description": "Italian beef and sausage pizza with choice of sweet peppers, spicy giardiniera, or both.",
            "category": "Tavern Style Pizza",
            "price": 33.49
        },
        {
            "itemId": "318399397456",
            "name": "Make Your Own - Tavern Style",
            "description": "Add your own favorite ingredients.",
            "category": "Tavern Style Pizza",
            "price": 18.99
        }
    ]
}
```

Field notes:

- `rating` is the average out of 5 (2 decimals); `null` when the restaurant has no ratings yet.
- `priceRating` is Grubhub's price level, 1 (cheap) to 4 (expensive).
- `deliveryFee` and `minimumOrder` are in USD; `0.0` means no fee / no minimum.
- `deliveryTimeMin` / `deliveryTimeMax` are the estimated delivery window in minutes.
- `menu` is absent unless `includeMenu` is enabled; it is `null` if the menu could not be fetched. Items whose base price is 0 because a size or option must be chosen get the cheapest option price.

### Pricing

Pay-per-event, **no start fee**: **$3.50 per 1,000 restaurants** on the Apify Free plan, with lower prices on paid plans. Each restaurant pushed to the dataset is one event; its menu (`includeMenu`) is included at no extra charge.

| Event | Free | Starter | Scale | Business | Enterprise |
|-------|------|---------|-------|----------|------------|
| Restaurant (`RESTAURANT`) | $3.50 | $3.00 | $2.60 | $2.10 | $2.10 |

Prices in USD per 1,000 events.

#### Cost examples (Free plan)

| Scenario | Restaurants | Cost |
|----------|-------------|------|
| Quick look | 20 | $0.07 |
| One city | 500 | $1.75 |
| Several cities | 5,000 | $17.50 |

### Limitations

- United States only: Grubhub does not operate elsewhere, and non-US locations fail with a clear message.
- Grubhub returns at most about 500 restaurants per search; use several addresses or queries to cover a large city.
- Results depend on the time of the run: restaurants that are closed or not delivering at that moment may be missing or listed as closed, and fees and delivery times change through the day.
- Customer reviews (texts) are not included, only the aggregate rating and count.

### Related Actors

- [Yelp Scraper - Business Reviews & Ratings](https://apify.com/sweet_stickball/yelp-scraper) — Scrape Yelp reviews for a business URL or a search (e.g.
- [Booking.com Scraper - Hotel Prices, Ratings & Availability](https://apify.com/sweet_stickball/booking-scraper) — Scrape Booking.com hotel search results for any city: hotel name, total and nightly price, rating, review count, stars, district, coordinates and free cancellation, for your dates and currency.
- [Airbnb Scraper - Listings, Prices & Ratings](https://apify.com/sweet_stickball/airbnb-scraper) — Scrape Airbnb search results for any location: listing name, price per night, total price, rating, review count, room type, beds, badges and coordinates, with optional dates and currency.

# Actor input Schema

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

US delivery address, ZIP code or city (e.g. "New York, NY", "350 5th Ave, New York, NY 10118", "60611"). Grubhub only operates in the United States.

## `query` (type: `string`):

Optional search term, as typed in the Grubhub search box (e.g. "pizza", "sushi", "tacos", a restaurant name). Leave empty to list all restaurants delivering to the location.

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

Maximum number of restaurants to return. Grubhub returns at most about 500 restaurants per search.

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

When enabled, adds the restaurant's available menu items (name, description, category, price in USD) to each restaurant record. One extra request per restaurant, so runs are slower.

## Actor input object example

```json
{
  "location": "Chicago, IL",
  "query": "pizza",
  "maxItems": 10,
  "includeMenu": false
}
```

# Actor output Schema

## `restaurants` (type: `string`):

Restaurants shown with the 'restaurants' view.

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

// Run the Actor and wait for it to finish
const run = await client.actor("sweet_stickball/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": "New York, NY",
    "maxItems": 10,
}

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

```

## MCP server setup

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