Restaurant Menu Scraper
Pricing
Pay per usage
Restaurant Menu Scraper
Scrape restaurant menus with items, prices, descriptions, and dietary tags from Grubhub.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Raghav Dua
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape restaurant menus with full item details, prices, descriptions, and dietary tags from Yelp. This Apify actor extracts structured menu data from Yelp restaurant menu pages, giving you clean, normalized JSON output ready for analysis or integration.
Whether you need competitive pricing intelligence, want to build a restaurant database, or need menu data for a food-related application, this scraper handles the heavy lifting. It runs on the Apify platform, giving you API access, scheduling, and integrations with tools like Google Sheets, Slack, and webhooks.
Why use Restaurant Menu Scraper?
- Structured menu data -- Clean JSON output with menu sections, item names, descriptions, prices, and dietary tags instead of messy HTML
- Dietary tag extraction -- Automatically identifies vegetarian, vegan, gluten-free, dairy-free, halal, kosher, and other dietary attributes from item descriptions
- Two input modes -- Provide direct Yelp menu URLs for targeted scraping, or search by location and cuisine to discover restaurants automatically
- Schema.org JSON-LD parsing -- Yelp embeds structured data (Menu > MenuSection > MenuItem) in every menu page. Clean, standardized, reliable extraction with HTML fallback
- No browser needed -- Uses lightweight HTTP requests with Cheerio parsing. No Playwright, no Puppeteer. Fast and cheap to run
- Massive coverage -- Yelp has menu data for hundreds of thousands of restaurants across the US and internationally
How to scrape restaurant menus
- Click Try for free to open the actor in the Apify Console
- Choose your input method:
- Direct URLs: Paste one or more Yelp menu page URLs (e.g.,
https://www.yelp.com/menu/restaurant-name) - Search: Enter a
searchLocation(e.g., "New York, NY") and optionally asearchCuisine(e.g., "italian")
- Direct URLs: Paste one or more Yelp menu page URLs (e.g.,
- Set
maxRestaurantsto control how many restaurants to scrape (default: 25) - Click Start and wait for the run to complete
- Download your data from the Dataset tab in JSON, CSV, Excel, or other formats
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
restaurantUrls | string[] | No | [] | Direct Yelp menu page URLs |
searchLocation | string | No | - | City or address to search for restaurants |
searchCuisine | string | No | - | Cuisine type filter (e.g., "italian", "chinese") |
maxRestaurants | integer | No | 25 | Maximum number of restaurants to scrape (1-500) |
platform | string | No | "yelp" | Source platform |
You must provide either restaurantUrls or searchLocation (or both). If both are provided, direct URLs are scraped first, then search results fill the remaining quota up to maxRestaurants.
Example input
{"restaurantUrls": ["https://www.yelp.com/menu/joes-pizza-new-york-5"],"searchLocation": "New York, NY","searchCuisine": "pizza","maxRestaurants": 10}
Output
Each restaurant produces one dataset item with full menu details.
Example output
{"restaurantName": "McDonald's Menu","address": "1560 Broadway, New York, NY 10036","phone": "(212) 944-6664","platform": "yelp","rating": 2.5,"reviewCount": 156,"priceRange": "$","cuisineTypes": ["Fast Food", "Burgers"],"menuSections": [{"sectionName": "Most Popular","items": [{"name": "Sausage McMuffin with Egg","description": "(530 Cal.)","price": 5.49,"currency": "USD","dietaryTags": [],"imageUrl": null},{"name": "Egg McMuffin","description": "(310 Cal.)","price": 5.29,"currency": "USD","dietaryTags": [],"imageUrl": null}]}],"totalMenuItems": 627,"url": "https://www.yelp.com/menu/mcdonalds-new-york-320","scrapedAt": "2026-04-06T17:00:00.000Z"}
Data fields
| Field | Type | Description |
|---|---|---|
restaurantName | string | Name of the restaurant |
address | string | Full street address |
phone | string | Phone number |
platform | string | Source platform ("yelp") |
rating | number | Average Yelp rating (1-5) |
reviewCount | number | Total number of Yelp reviews |
priceRange | string | Price level ("$", "$$", "$$$", "$$$$") |
cuisineTypes | string[] | Cuisine categories |
menuSections | object[] | Menu organized by sections |
menuSections[].sectionName | string | Section name (e.g., "Most Popular", "Appetizers") |
menuSections[].items | object[] | Items in the section |
menuSections[].items[].name | string | Item name |
menuSections[].items[].description | string | Item description and calorie info |
menuSections[].items[].price | number | Price in local currency |
menuSections[].items[].currency | string | Currency code (default: USD) |
menuSections[].items[].dietaryTags | string[] | Detected dietary attributes |
menuSections[].items[].imageUrl | string | Item image URL (if available) |
totalMenuItems | number | Total count of menu items across all sections |
url | string | Source URL |
scrapedAt | string | ISO 8601 timestamp |
How much does it cost?
This actor uses lightweight HTTP requests (no browser rendering), so it's very cost-effective. A single restaurant menu page typically costs less than $0.001 in Apify platform credits. Scraping 100 restaurants costs roughly $0.05-0.10.
The free Apify tier includes $5 of monthly platform credits, which is enough to scrape thousands of restaurant menus.
Tips and advanced usage
- Use direct menu URLs for best results -- Yelp menu pages follow the pattern
https://www.yelp.com/menu/restaurant-slug. Provide these directly for the most reliable extraction. - Not all restaurants have menus on Yelp -- Menu availability depends on whether the restaurant has published their menu on Yelp. Major chains and popular restaurants typically have full menus.
- Dietary tag detection -- The scraper searches item descriptions for keywords like "vegetarian", "vegan", "gluten-free", "gf", "dairy-free", "nut-free", "spicy", "halal", and "kosher". Tags are only detected when mentioned in the description text.
- Calorie data -- Many Yelp menu items include calorie counts in the description (e.g., "(530 Cal.)"). This is included in the description field as-is.
- Large menus -- Some restaurants have 500+ menu items across dozens of sections. All items are extracted regardless of menu size.
Limitations
- Yelp menu pages only -- This actor scrapes Yelp's menu pages specifically. Not all Yelp restaurant listings have a menu page.
- Search discovery -- Location-based search finds restaurants on Yelp, then converts to menu page URLs. Not all discovered restaurants will have menus available.
- Price accuracy -- Prices reflect what Yelp displays at scrape time and may differ from current in-restaurant prices.
- Anti-bot -- Yelp may rate-limit or block requests. The actor includes retry logic and delays between requests. For large-scale scraping (100+ restaurants), consider using Apify proxy.
FAQ
Is it legal to scrape Yelp? Web scraping publicly available data is generally legal in the United States under the hiQ Labs v. LinkedIn precedent. However, always review Yelp's Terms of Service and ensure your use case complies with applicable laws. This actor is provided as a technical tool — you are responsible for how you use the data.
I'm getting empty menus. Not all Yelp restaurant listings have a dedicated menu page. Check that your URL follows the pattern https://www.yelp.com/menu/restaurant-slug. If the restaurant doesn't have a menu on Yelp, no data will be returned.
Can I scrape menus from other platforms? Not yet in v1. The codebase is designed for extensibility — additional platforms may be added in future versions.
Need a custom solution? Open an issue in the Issues tab or reach out for a custom solution.