Grubhub Restaurant Menus Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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 group | Examples |
|---|---|
| Restaurant identity | restaurant ID, merchant ID, name, Grubhub URL |
| Location | address, city, state, postal code, coordinates |
| Food taxonomy | cuisines, menu category |
| Reputation | rating, rating count |
| Operations | delivery, pickup, open status, ETA, distance |
| Fees | delivery fee, delivery minimum |
| Menu item | item ID, name, description, price, currency, image URL |
| Run context | search 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
- Open the actor on Apify.
- Enter one or more US locations with latitude and longitude.
- Optionally add cuisine or keyword filters such as
pizza,sushi, ortacos. - Set the maximum number of restaurants.
- Choose whether to include menu items.
- Run the actor.
- Export the dataset as JSON, CSV, Excel, or via API.
Input options
locations
Array of US delivery locations.
Each location accepts:
namelatitudelongitude
searchTerms
Optional Grubhub search terms.
Examples:
pizzasushiveganburgerstacos
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.
Menu intelligence
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 ApifyClientclient = 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().itemsprint(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.
Related scrapers
- https://apify.com/automation-lab/google-maps-reviews-scraper
- https://apify.com/automation-lab/yelp-reviews-scraper
- https://apify.com/automation-lab/booking-scraper
- https://apify.com/automation-lab/tripadvisor-reviews-scraper
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.