Restaurant Menu Scraper avatar

Restaurant Menu Scraper

Pricing

Pay per usage

Go to Apify Store
Restaurant Menu Scraper

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

Raghav Dua

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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

  1. Click Try for free to open the actor in the Apify Console
  2. 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 a searchCuisine (e.g., "italian")
  3. Set maxRestaurants to control how many restaurants to scrape (default: 25)
  4. Click Start and wait for the run to complete
  5. Download your data from the Dataset tab in JSON, CSV, Excel, or other formats

Input

FieldTypeRequiredDefaultDescription
restaurantUrlsstring[]No[]Direct Yelp menu page URLs
searchLocationstringNo-City or address to search for restaurants
searchCuisinestringNo-Cuisine type filter (e.g., "italian", "chinese")
maxRestaurantsintegerNo25Maximum number of restaurants to scrape (1-500)
platformstringNo"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

FieldTypeDescription
restaurantNamestringName of the restaurant
addressstringFull street address
phonestringPhone number
platformstringSource platform ("yelp")
ratingnumberAverage Yelp rating (1-5)
reviewCountnumberTotal number of Yelp reviews
priceRangestringPrice level ("$", "$$", "$$$", "$$$$")
cuisineTypesstring[]Cuisine categories
menuSectionsobject[]Menu organized by sections
menuSections[].sectionNamestringSection name (e.g., "Most Popular", "Appetizers")
menuSections[].itemsobject[]Items in the section
menuSections[].items[].namestringItem name
menuSections[].items[].descriptionstringItem description and calorie info
menuSections[].items[].pricenumberPrice in local currency
menuSections[].items[].currencystringCurrency code (default: USD)
menuSections[].items[].dietaryTagsstring[]Detected dietary attributes
menuSections[].items[].imageUrlstringItem image URL (if available)
totalMenuItemsnumberTotal count of menu items across all sections
urlstringSource URL
scrapedAtstringISO 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.