Restaurant Menu Scraper
Pricing
from $80.00 / 1,000 medium cache extractions
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
Actor stats
0
Bookmarked
3
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
| Field | Type | Required | Description |
|---|---|---|---|
mode | enum | No | Set to "url" (this is the default) |
url | string | Yes | Restaurant website URL (e.g. https://franklinbbq.com) |
location | string | No | For multi-location restaurants, specify which location (e.g. "San Diego") |
freshness | enum | No | How fresh the data should be (default: med_cache) |
Search Mode
| Field | Type | Required | Description |
|---|---|---|---|
mode | enum | Yes | Set to "search" |
query | string | Yes | Cuisine or restaurant type (e.g. "sushi", "Mexican", "Italian", "BBQ") |
location | string | Yes | City or area to search (e.g. "Pasadena, CA", "Austin, TX") |
freshness | enum | No | How 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.
| Tier | Max Age | Cost |
|---|---|---|
long_cache | 180 days | $0.02/request |
med_cache | 60 days | $0.03/request |
short_cache | 14 days | $0.04/request |
fresh | 1 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 confidence —
high,medium, orlowso 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:
| Grade | Meaning |
|---|---|
complete | Full menu with all expected sections (30+ items, 4+ categories) |
likely_complete | Looks complete, minor uncertainty (20+ items, 3+ categories) |
partial_core_questionable | Some food items but feels thin or incomplete |
partial_core_missing | Missing primary food offering (e.g., only drinks for a BBQ restaurant) |
minimal | Fewer than 5 items or too vague to be useful |
not_a_menu | Extracted 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