Google Maps Menu Scraper
Pricing
from $0.90 / 1,000 menu items
Google Maps Menu Scraper
AI-based structured extraction of restaurant menu data from Google Maps — item names, descriptions, prices, categories, and languages from menu photos at scale. Built for food delivery platforms, price intelligence, competitor menu research, dietary databases, and hospitality data pipelines.
Pricing
from $0.90 / 1,000 menu items
Rating
5.0
(1)
Developer
rainminer
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
13
Monthly active users
2.7 hours
Issues response
4 days ago
Last modified
Categories
Share
The Google Maps Menu Scraper is an Apify Actor that extracts structured menu data from restaurant and café listings on Google Maps. Provide place URLs, Place IDs, or search queries — get back item names, descriptions, prices, and categories in a flat dataset.
Important — AI output is not production-ready as-is.
This Actor uses AI vision to read menu photos. Results can include misread names, wrong prices, invented or missing items, and inconsistent formatting. Treat the dataset as raw input for your own data cleaning / QA pipeline (confidence filters, validation against source photos, human review, etc.) before any production use.
Key Features
- Menu photo extraction: Reads uploaded menu photos when no structured menu tab is available.
- Text search: Find places by keyword (e.g.
"brunch austin") — no manual URL collection required. - Language detection: Each item carries an ISO 639-1 language code detected from the item text itself.
- Source metadata: Each item records the source menu photo URL and when it was uploaded.
- Deduplication: Items appearing across multiple menu photos are merged, keeping the most recent version.
- Multilingual: Preserves original item names and descriptions in any language.
Why Scrape Google Maps Menus?
Google Maps is the most comprehensive public source of restaurant information, but menu data is typically locked in uploaded images. This Actor unlocks that data for:
- Food delivery and aggregator platforms building comprehensive menu databases.
- Price intelligence tracking menu price changes over time across competitors.
- Restaurant research comparing offerings across similar establishments in a city.
- Dietary and allergy databases that need structured item names and descriptions.
- Travel and tourism apps showing visitors what to expect before dining.
Who Is It For?
- Food-tech startups that need affordable, scalable menu data.
- Restaurant chains auditing competitor menus across locations.
- Market researchers studying pricing trends in the hospitality sector.
- Developers building culinary discovery apps or dining recommendation systems.
Input Schema
{"startUrls": [{ "url": "https://www.google.com/maps/place/Mercanti+Pizzeria+%26+So./..." }],"placeIds": ["ChIJZ2rw6ac5qBQRKgoWMAqIY3E"],"textQueries": ["brunch austin", "pizza in New York"],"maxMenuImages": 1,"maxItems": 100,"maxPlacesPerQuery": 5,"menuLanguage": "en"}
At least one of startUrls, placeIds, or textQueries must be provided.
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | Array | — | Google Maps place page URLs or maps.app.goo.gl short links |
placeIds | Array of strings | — | Google Maps Place IDs starting with ChIJ |
textQueries | Array of strings | — | Free-text search queries (e.g. "brunch austin") |
maxPlacesPerQuery | Integer | 5 | Max places to scrape per text query (up to 60) |
maxMenuImages | Integer | 1 | Max menu photos to process per place |
maxItems | Integer | 100 | Max unique menu items to output per place after deduplication |
menuLanguage | String | "en" | ISO 639-1 language code for menu extraction (e.g. en, es, bg, fr, de, it). |
Output Schema
Each dataset item represents one unique menu item extracted from a place:
{"placeId": "ChIJN1t2JNayGGARRwe9bMh9diY","placeName": "Mercanti Pizzeria & So.","placeUrl": "https://www.google.com/maps/place/Mercanti+Pizzeria+%26+So./...","category": "Pizzas","name": "Margherita","description": "Tomato sauce, fior di latte mozzarella, fresh basil","price": 14,"currency": "USD","priceText": "$14.00","language": "en","confidence": 0.92,"menuImageUrl": "https://lh3.googleusercontent.com/gps-cs-s/...","scrapedAt": "2026-05-31T04:49:29.132Z"}
| Field | Description |
|---|---|
placeId | Google Maps Place ID (ChIJ…) |
placeName | Display name of the restaurant |
placeUrl | Google Maps place URL |
category | Menu section header (e.g. "Pizzas", "Desserts") — null if not visible |
name | Item name in original language |
description | Item description or ingredients — null if absent |
price | Parsed numeric price without currency symbol (e.g. 8.99) — null if absent |
currency | ISO 4217 currency code (e.g. "EUR", "BGN") — null if indeterminate |
priceText | Original price text as shown in the photo (e.g. "€8.99") — null if absent |
language | ISO 639-1 language code of the item text (e.g. "en", "bg", "it") |
confidence | Model confidence that the item was read correctly (0–1). Filter out low scores if you only want high-certainty rows. |
menuImageUrl | High-resolution URL of the source menu photo |
scrapedAt | ISO timestamp of when this item was scraped |
How It Works
- Input — provide
startUrls,placeIds, and/ortextQueries. - Extract — the Actor collects menu photos for each place and reads visible items.
- Output — one dataset row per unique menu item, with place details and price fields.
Pricing
This Actor uses pay-per-event pricing with three events (see the Store pricing tab for current rates):
| Event | When charged |
|---|---|
place-scraped | Once per place looked up for menu photos (including places with none) |
menu-photo-analyzed | Once per menu photo sent to AI analysis (capped by maxMenuImages) |
result-item | Once per unique menu item written to the dataset |
Budgeting tips
place-scrapedis charged for every place you submit, whether or not menu photos exist. Looking up a place has a real cost even when there is nothing to extract — places with no menu photos still incur this event (and produce no further charges).result-itemis usually the dominant cost for places with long menus. Real cost per place varies far more than place+photo alone suggests; long menus cost more because they return more dataset rows.- A per-place average above place+photo alone almost always means
result-itemcharges — not extra photos beyondmaxMenuImages.
Example (100 places, maxMenuImages: 1): place-scraped alone is about $0.69 across the whole batch. Places that also have a photo add menu-photo-analyzed; if the run writes ~400–1,100 menu items, result-item adds roughly $0.35–$1.00 on top.
Notes and Limitations
- AI-powered extraction: This Actor uses AI to identify menu photos and extract items. Output is non-deterministic and not ready for production use without your own cleaning pipeline — the same place may produce different results across runs, and the model can misclassify photos or misread names, prices, and descriptions. Use the
confidencefield and your own validation before shipping data downstream. You may still be charged for photos that are analyzed even when no usable menu items are returned. - Photo availability: Results depend on user-uploaded photos. Places with no menu photos produce no output.
- Photo quality: Handwritten or low-quality menu photos may yield incomplete extractions.
- Menu language: Set
menuLanguageto the primary script of the menus you are scraping for best results with non-Latin alphabets (Cyrillic, Arabic, Chinese, etc.). - Batch size & timeout: Plan on roughly 10–12 minutes per 100 places (
maxMenuImages: 1). Prefer batches of about 100–150 places per run, or raise the run timeout (default is 2 hours). Results are saved per place as soon as that place finishes, so a timeout still keeps partial output instead of discarding everything.