Restaurant Menu Scraper avatar

Restaurant Menu Scraper

Pricing

from $80.00 / 1,000 medium cache extractions

Go to Apify Store
Restaurant Menu Scraper

Restaurant Menu Scraper

Extract structured menu data from restaurant websites. Returns items, prices, descriptions, and categories. Handles direct sites, Toast, Square, Popmenu, and PDFs. Search by name + location or provide a URL. AI-powered completeness grading. ~70% success rate.

Pricing

from $80.00 / 1,000 medium cache extractions

Rating

0.0

(0)

Developer

Geoffrey

Geoffrey

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

2 days ago

Last modified

Share

Extract structured menu data from independent and local restaurant websites. Returns clean JSON with categories, items, prices, and descriptions.

Works best with independent restaurants, local chains, and fine dining establishments that publish their own menus online.

Two Ways to Use

URL Mode (default)

Give it a restaurant URL and get back a structured menu. The scraper finds the menu on the site — whether it's an HTML page, a PDF, or listed on a third-party platform like Yelp or DoorDash — and extracts everything into clean JSON.

Search Mode

Tell it a cuisine and a city, and it discovers restaurants in that area via Google Places, then scrapes each one. Results appear in the dataset one at a time as each restaurant completes.

Input

URL Mode

FieldTypeRequiredDescription
modeenumNoSet to "url" (this is the default)
urlstringYesRestaurant website URL (e.g. https://franklinbbq.com)
locationstringNoFor multi-location restaurants, specify which location (e.g. "San Diego")
freshnessenumNoHow fresh the data should be (default: med_cache)

Search Mode

FieldTypeRequiredDescription
modeenumYesSet to "search"
querystringYesCuisine or restaurant type (e.g. "sushi", "Mexican", "Italian", "BBQ")
locationstringYesCity or area to search (e.g. "Pasadena, CA", "Austin, TX")
freshnessenumNoHow fresh the data should be (default: med_cache)

The word "restaurants" is automatically added to your search query, so just enter the cuisine type.

Freshness Tiers

Controls how recently the menu data was scraped. Cached data is faster and cheaper.

TierMax AgeCost
long_cache180 days$0.02/request
med_cache60 days$0.03/request
short_cache14 days$0.04/request
fresh1 day$0.05/request

Billing

You only pay for successful, quality extractions. Failed scrapes and low-quality results are free in both URL and Search modes.

  • Successful extraction with complete or mostly-complete menu → billed
  • Failed extraction (site blocked, no menu found, etc.) → free
  • Low-quality extraction (missing core menu sections, e.g. only drinks for a BBQ restaurant) → free

Each dataset row includes a billable field (true or false) for full transparency.

What It Extracts

Each restaurant produces a structured menu with:

  • Categories — Appetizers, Entrées, Desserts, Drinks, etc.
  • Menu items — Name, description, and price for each dish
  • Extraction confidencehigh, medium, or low so you know how complete the data is
  • Completeness grade — AI-verified assessment of whether the menu is complete (see below)
  • Restaurant name — The official business name as shown on the website

The scraper handles HTML menus, PDF menus, and third-party platforms (Yelp, DoorDash, etc.), automatically choosing the best source.

Completeness Grading

Every successful extraction is evaluated by AI to determine whether the menu is complete for the restaurant type. The grade appears in menu.completeness:

GradeMeaning
completeFull menu with all expected sections (30+ items, 4+ categories)
likely_completeLooks complete, minor uncertainty (20+ items, 3+ categories)
partial_core_questionableSome food items but feels thin or incomplete
partial_core_missingMissing primary food offering (e.g., only drinks for a BBQ restaurant)
minimalFewer than 5 items or too vague to be useful
not_a_menuExtracted content is not menu data

The completeness object also includes reasoning (why it got that grade), restaurant_type (detected cuisine), and missing_sections (what appears to be absent).

Important Limitations

  • Fast food chains are excluded from search results. National fast food chains (McDonald's, Subway, Taco Bell, Chick-fil-A, etc.) are automatically filtered out. These large multi-location chains frequently use dynamic menu systems that don't scrape reliably, and their menus are widely available through other channels.
  • Best results come from independent restaurants that publish their own menu on their website or as a PDF. Regional and fine dining chains with individual location pages also work well.
  • Some restaurants will fail — not every website has a scrapeable menu. The dataset will include both successes and failures so you can see exactly what worked.

Output Examples

URL Mode

Input:

{
"url": "https://franklinbbq.com"
}

Dataset row:

{
"success": true,
"url": "https://franklinbbq.com",
"restaurantName": "Franklin Barbecue",
"itemCount": 45,
"confidence": "high",
"extractionConfidence": {
"confidence": "high",
"item_count": 45,
"has_prices": true,
"has_descriptions": true,
"price_coverage": 0.89
},
"menu": {
"categories": [
{
"name": "Barbecue",
"items": [
{
"name": "Brisket",
"price": "$28.00/lb",
"description": "Oak-smoked for 18 hours"
}
]
}
]
}
}

Search Mode

Input:

{
"mode": "search",
"query": "sushi",
"location": "Pasadena, CA"
}

Dataset rows (one per restaurant, streamed as each completes):

{
"success": true,
"url": "https://sushigen.com",
"restaurantName": "Sushi Gen",
"searchQuery": "sushi",
"searchLocation": "Pasadena, CA",
"serperTitle": "Sushi Gen",
"serperAddress": "123 Main St, Pasadena, CA 91101",
"itemCount": 62,
"confidence": "high",
"extractionConfidence": {
"confidence": "high",
"item_count": 62,
"has_prices": true,
"has_descriptions": true,
"price_coverage": 0.95
},
"menu": {
"categories": [
{
"name": "Nigiri",
"items": [
{
"name": "Salmon",
"price": "$6.50",
"description": "Two pieces, fresh Atlantic salmon"
}
]
}
]
}
}

Failed restaurants also appear in the dataset:

{
"success": false,
"url": "https://example-restaurant.com",
"restaurantName": "Example Restaurant",
"searchQuery": "sushi",
"searchLocation": "Pasadena, CA",
"error": "all_sources_failed",
"errorMessage": "Could not extract menu from any available source"
}

Run summary (available in the OUTPUT key-value store after completion):

{
"mode": "search",
"query": "sushi",
"location": "Pasadena, CA",
"totalFound": 20,
"excludedFastFood": 2,
"skippedNoWebsite": 3,
"totalScraped": 15,
"successful": 12,
"failed": 3
}

Use Cases

  • Restaurant aggregators — Build menu databases for a city or region
  • Food delivery apps — Import menus from local restaurants automatically
  • Market research — Compare pricing across restaurants by cuisine and area
  • Price monitoring — Track how menu prices change over time
  • Location intelligence — Map restaurant offerings by geography