Google Maps Menu Scraper avatar

Google Maps Menu Scraper

Pricing

from $0.90 / 1,000 menu items

Go to Apify Store
Google Maps Menu Scraper

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

rainminer

Maintained by Community

Actor stats

0

Bookmarked

28

Total users

13

Monthly active users

2.7 hours

Issues response

4 days ago

Last modified

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.

FieldTypeDefaultDescription
startUrlsArrayGoogle Maps place page URLs or maps.app.goo.gl short links
placeIdsArray of stringsGoogle Maps Place IDs starting with ChIJ
textQueriesArray of stringsFree-text search queries (e.g. "brunch austin")
maxPlacesPerQueryInteger5Max places to scrape per text query (up to 60)
maxMenuImagesInteger1Max menu photos to process per place
maxItemsInteger100Max unique menu items to output per place after deduplication
menuLanguageString"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"
}
FieldDescription
placeIdGoogle Maps Place ID (ChIJ…)
placeNameDisplay name of the restaurant
placeUrlGoogle Maps place URL
categoryMenu section header (e.g. "Pizzas", "Desserts") — null if not visible
nameItem name in original language
descriptionItem description or ingredients — null if absent
priceParsed numeric price without currency symbol (e.g. 8.99) — null if absent
currencyISO 4217 currency code (e.g. "EUR", "BGN") — null if indeterminate
priceTextOriginal price text as shown in the photo (e.g. "€8.99") — null if absent
languageISO 639-1 language code of the item text (e.g. "en", "bg", "it")
confidenceModel confidence that the item was read correctly (01). Filter out low scores if you only want high-certainty rows.
menuImageUrlHigh-resolution URL of the source menu photo
scrapedAtISO timestamp of when this item was scraped

How It Works

  1. Input — provide startUrls, placeIds, and/or textQueries.
  2. Extract — the Actor collects menu photos for each place and reads visible items.
  3. 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):

EventWhen charged
place-scrapedOnce per place looked up for menu photos (including places with none)
menu-photo-analyzedOnce per menu photo sent to AI analysis (capped by maxMenuImages)
result-itemOnce per unique menu item written to the dataset

Budgeting tips

  • place-scraped is 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-item is 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-item charges — not extra photos beyond maxMenuImages.

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 confidence field 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 menuLanguage to 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.