Grubhub Restaurant Menus Scraper avatar

Grubhub Restaurant Menus Scraper

Pricing

Pay per event

Go to Apify Store
Grubhub Restaurant Menus Scraper

Grubhub Restaurant Menus Scraper

πŸ” Extract Grubhub restaurants, menus, prices, ratings, delivery availability, fees, and ETAs from US delivery markets.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Extract Grubhub restaurant listings, delivery availability, menu categories, menu item names, descriptions, prices, ratings, fees, and source URLs from US delivery markets.

What does Grubhub Restaurant Menus Scraper do?

Grubhub Restaurant Menus Scraper turns Grubhub public restaurant and menu data into structured datasets you can export, analyze, and integrate.

It searches Grubhub by US latitude/longitude and optional cuisine or restaurant keywords, opens each matching restaurant through Grubhub's public web API, and saves menu-item rows with restaurant context.

You can also provide known Grubhub restaurant IDs when you already have a tracked competitor list.

Who is it for?

  • πŸ• Restaurant operators monitoring competitor menu prices
  • πŸ“ Local SEO teams tracking food delivery coverage by city
  • 🚚 Delivery aggregators comparing market availability
  • πŸ“Š Foodservice analysts building menu and pricing benchmarks
  • πŸͺ Multi-location brands checking local Grubhub listings
  • 🧾 Revenue teams auditing delivery fees and order minimums

Why use this Grubhub scraper?

Manual menu checks are slow, inconsistent, and hard to repeat.

This actor gives you repeatable exports with the same fields every run.

You can schedule daily or weekly runs, compare prices over time, and connect results to BI tools or alerts.

Data you can extract

Field groupExamples
Restaurant identityrestaurant ID, merchant ID, name, Grubhub URL
Locationaddress, city, state, postal code, coordinates
Food taxonomycuisines, menu category
Reputationrating, rating count
Operationsdelivery, pickup, open status, ETA, distance
Feesdelivery fee, delivery minimum
Menu itemitem ID, name, description, price, currency, image URL
Run contextsearch location, search term, scraped timestamp

How much does it cost to scrape Grubhub menus?

This actor uses pay-per-event pricing.

You pay a small start fee for each run and a per-item fee for each dataset row saved.

Use maxRestaurants and maxMenuItemsPerRestaurant to control volume and cost.

For small tests, keep the default prefill values.

For market monitoring, increase the caps after confirming your location and search term return useful restaurants.

How to use it

  1. Open the actor on Apify.
  2. Enter one or more US locations with latitude and longitude.
  3. Optionally add cuisine or keyword filters such as pizza, sushi, or tacos.
  4. Set the maximum number of restaurants.
  5. Choose whether to include menu items.
  6. Run the actor.
  7. Export the dataset as JSON, CSV, Excel, or via API.

Input options

locations

Array of US delivery locations.

Each location accepts:

  • name
  • latitude
  • longitude

searchTerms

Optional Grubhub search terms.

Examples:

  • pizza
  • sushi
  • vegan
  • burgers
  • tacos

Leave empty for broad local delivery listings.

restaurantIds

Optional Grubhub restaurant IDs.

Use this when you already know the restaurants you want to monitor.

maxRestaurants

Caps unique restaurants across all locations and search terms.

includeMenuItems

When enabled, the actor saves menu item rows with restaurant context.

When disabled, it saves one row per restaurant.

maxMenuItemsPerRestaurant

Caps the number of menu rows saved per restaurant.

proxyConfiguration

Grubhub is US-only.

The actor defaults to Apify SHADER proxy in the US.

Switch to residential only if your run is blocked.

Example input

{
"locations": [
{ "name": "New York, NY", "latitude": 40.7128, "longitude": -74.006 }
],
"searchTerms": ["pizza"],
"maxRestaurants": 25,
"includeMenuItems": true,
"maxMenuItemsPerRestaurant": 40,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["SHADER"],
"apifyProxyCountry": "US"
}
}

Output example

{
"type": "menu_item",
"searchLocation": "New York, NY",
"searchTerm": "pizza",
"restaurantId": "321166",
"restaurantName": "Little Italy Pizza - Fulton St",
"cuisines": ["Italian", "Pizza"],
"rating": 4.5,
"deliveryAvailable": true,
"deliveryFee": 0,
"deliveryMinimum": 10,
"deliveryEstimateMinutes": 25,
"categoryName": "Drinks",
"itemName": "Orange juice",
"itemPrice": 3,
"itemCurrency": "USD",
"scrapedAt": "2026-07-10T07:42:38.949Z"
}

Tips for best results

  • βœ… Use precise latitude and longitude for the neighborhood you care about.
  • βœ… Start with one city and one keyword before scaling.
  • βœ… Keep menu caps low for monitoring many restaurants.
  • βœ… Use restaurant IDs for stable competitor lists.
  • βœ… Export CSV for spreadsheet price comparisons.

Common workflows

Competitor price monitoring

Run the actor weekly for your cuisine and city.

Compare item names and prices across runs.

Delivery market coverage

Run broad searches across multiple locations.

Track which restaurants are available for delivery or pickup.

Local SEO checks

Confirm restaurant names, ratings, cuisine tags, and URLs visible on Grubhub.

Collect category and item-level menu data for pricing analysis.

Integrations

Use the dataset with:

  • Google Sheets for menu price reviews
  • BigQuery or Snowflake for market analytics
  • Slack alerts for new competitor items
  • CRM enrichment for restaurant prospecting
  • BI dashboards for city-by-city delivery coverage

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/grubhub-restaurant-menus-scraper').call({
locations: [{ name: 'New York, NY', latitude: 40.7128, longitude: -74.006 }],
searchTerms: ['pizza'],
maxRestaurants: 25,
includeMenuItems: true,
maxMenuItemsPerRestaurant: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/grubhub-restaurant-menus-scraper').call(run_input={
'locations': [{'name': 'New York, NY', 'latitude': 40.7128, 'longitude': -74.006}],
'searchTerms': ['pizza'],
'maxRestaurants': 25,
'includeMenuItems': True,
'maxMenuItemsPerRestaurant': 40,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

API usage with cURL

curl "https://api.apify.com/v2/acts/automation-lab~grubhub-restaurant-menus-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"locations":[{"name":"New York, NY","latitude":40.7128,"longitude":-74.006}],"searchTerms":["pizza"],"maxRestaurants":25,"includeMenuItems":true,"maxMenuItemsPerRestaurant":40}'

MCP integration

Use this actor from Apify MCP with Claude Desktop or Claude Code.

MCP tool URL:

https://mcp.apify.com/?tools=automation-lab/grubhub-restaurant-menus-scraper

Add the actor to Claude Code:

$claude mcp add apify-grubhub-menus https://mcp.apify.com/?tools=automation-lab/grubhub-restaurant-menus-scraper

Claude Desktop MCP server configuration:

{
"mcpServers": {
"apify-grubhub-menus": {
"url": "https://mcp.apify.com/?tools=automation-lab/grubhub-restaurant-menus-scraper"
}
}
}

Example prompts:

  • "Scrape pizza menus on Grubhub around New York and summarize average entrΓ©e prices."
  • "Find Grubhub restaurants near Chicago for tacos and return delivery fees."
  • "Compare menu item prices for these Grubhub restaurant IDs."

Scheduling

You can schedule this actor in Apify to run daily, weekly, or monthly.

Scheduled runs are useful for competitor menu monitoring and delivery coverage tracking.

FAQ

Why did I get zero restaurants?

Try a different US latitude/longitude or remove the search term.

Some neighborhoods and keywords have limited Grubhub coverage.

Why is a restaurant missing menu items?

Some listings expose limited data or have unavailable menu sections at the time of the run.

Try restaurant-only mode or a different time window.

Why does the actor use a proxy?

Grubhub blocks non-US access.

A US proxy is required for reliable public data access from cloud infrastructure.

Limitations

  • Grubhub is US-focused; non-US locations may not return results.
  • Menu availability and prices can change frequently.
  • Some restaurants may expose limited or temporarily unavailable menu data.
  • The actor does not place orders or access private user accounts.

Legality

This actor extracts publicly available Grubhub restaurant and menu information.

You are responsible for using the data in accordance with applicable laws, Grubhub terms, and your use case.

Do not use scraped data for spam, fraud, or unlawful competitive conduct.

Support

If a run fails, include the run ID, input, and a short description of what you expected.

For best support, start with a small input that reproduces the issue.

Changelog

See .actor/CHANGELOG.md for release notes.