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

0.0

(0)

Developer

rainminer

rainminer

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day 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.


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",
"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")
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.

Notes and Limitations

  • AI-powered extraction: This Actor uses AI to identify menu photos and extract items. Output is non-deterministic — the same place may produce slightly different results across runs, and the model can misclassify non-menu photos or misread item names, prices, and descriptions. You may still be charged for photos that are analyzed even when no usable menu items are returned. We are continuously improving accuracy, but the inherent non-determinism of modern AI is not something we can fully eliminate.
  • 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.).