· 13 min read
Google Maps Menu Scraper: 11 Data Fields per Record (2026)
Each record extracted by this Actor carries 11 fields, returning dish names, popular flags, max-resolution photo URLs, section categories, and external menu links directly from Google Maps place pages. Pricing is $5.00 per 1,000 results on Apify's free plan, which includes $5.00 of monthly credit. This Actor is designed for engineering teams building food aggregators, sales enrichment tools, or restaurant catalogs. It is not for teams requiring item-level prices or ingredient descriptions directly from inline records, as Google Maps does not render per-item prices on place page menus.
Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open Google Maps Menu Scraper on Apify and run the prefilled example.
How reliable is Google Maps Menu Scraper in production?
Across the last 30 days of public runs on the Apify platform, Google Maps Menu Scraper recorded 800 runs with the following outcomes.
| Outcome | Runs | Share |
|---|---|---|
| Succeeded | 790 | 98.8% |
| Failed | 10 | 1.3% |
| Aborted by the user | 0 | 0.0% |
| Timed out | 0 | 0.0% |
| Total | 800 | 100.0% |
When scheduling this Actor unattended, expect about 1 in a hundred runs to fail or time out based on platform metrics. Build your workflows to include automatic retries with exponential backoff to handle these occasional failures gracefully. Also, ensure your downstream ingestion logic can process the single fallback record emitted when a venue lacks inline menu items.
What does it cost to run Google Maps Menu Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. With 1.3% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.
The maxItems control limits the number of menu items a run can extract. For instance, an initial run using the example input with maxItems set to 50 will incur a maximum of $0.25 in result charges on the free plan. Before scaling up to large batches, test new locations with maxItems set between 5 and 10 to confirm data availability and suitability.
How do you run Google Maps Menu Scraper from the API?
The schema marks 1 of its 4 controls as required: placeUrl. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for Google Maps Menu Scraper, so the request works once your token is in place.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~google-maps-menu/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"placeUrl":"https://www.google.com/maps/place/The+Halal+Guys/@40.7615453,-73.9794252,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258ff097dbc2d:0x86df3a18a06daf7c!8m2!3d40.7615453!4d-73.9768503","maxItems":50,"language":"en"}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"placeUrl": "https://www.google.com/maps/place/The+Halal+Guys/@40.7615453,-73.9794252,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258ff097dbc2d:0x86df3a18a06daf7c!8m2!3d40.7615453!4d-73.9768503",
"maxItems": 50,
"language": "en"
}
run = client.actor("crawlerbros~google-maps-menu").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"placeUrl": "https://www.google.com/maps/place/The+Halal+Guys/@40.7615453,-73.9794252,17z/data=!3m1!4b1!4m6!3m5!1s0x89c258ff097dbc2d:0x86df3a18a06daf7c!8m2!3d40.7615453!4d-73.9768503",
"maxItems": 50,
"language": "en"
}
const run = await client.actor('crawlerbros~google-maps-menu').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.
Which Google Maps Menu Scraper inputs matter, and which can you skip?
The placeUrl input is the only required control and must be a direct Google Maps URL of the restaurant you wish to scrape. To limit the number of menu items extracted, adjust the maxItems setting, and use the language control to specify the Google Maps UI language. For most first runs, leave the proxyConfiguration untouched, as the default datacenter IPs provide reliable performance.
placeUrl(string): Google Maps URL of the restaurant whose menu should be scraped. Copy from the address bar after opening the place on Google Maps.maxItems(integer): Maximum number of menu items to extract (1-500). Default:100.language(string): Interface language for the Google Maps UI. Default:"en".proxyConfiguration(object): Proxy settings (optional). The scraper works reliably without a proxy by default.
Fixed-choice controls: language accepts 11 values (default en), including en (English), es (Spanish), fr (French), de (German).
What does Google Maps Menu Scraper return?
The output datasets provide structured dish names, menu categories, image links, and popular badges, making them suitable for menu catalog indexing. However, they do not include per-item prices or detailed modifier options. If Google Maps does not have inline dish cards for a given venue, the Actor provides a single fallback record, which will still contain the external menu URL if one is published.
businessName(e.g.The Halal Guys)placeId(e.g.0x89c258ff097dbc2d:0x86df3a18a06daf7c)placeUrlmenuUrlmenuCategoriesmenuFound(e.g.true)itemName(e.g.Chicken and Beef Gyro Platter)isPopular(e.g.true)itemImage(e.g.https://lh3.googleusercontent.com/...=s0)rank(e.g.1)scrapedAt(e.g.2026-06-16T12:00:00Z)
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open Google Maps Menu Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Copy the Google Maps URL of the restaurant from your browser's address bar.
- Paste this URL into the placeUrl input field, ensuring maxItems is set to a conservative value like 50 for your initial test.
- Confirm your desired language for the Google Maps UI in the language field; the default is English.
- Run the Actor, leaving the proxyConfiguration setting at its default.
- After the run completes, check the dataset to see if menuFound is true for any records.
- For records where menuFound is true, verify that itemName, rank, and itemImage fields contain valid data.
- If menuFound is false, confirm that menuUrl is present and contains an external link.
- Once satisfied with the output quality, increase maxItems up to 500 for comprehensive menu extraction.
How do you apply it? Three worked playbooks
These are Google Maps Menu Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Menu Intelligence Platform
Outcome: Power menu intelligence for delivery, restaurant tech, or food blog platforms
Configure: Set placeUrl to the Google Maps URL of a restaurant, maxItems to 200, and language to "en".
Working method: Start with a single target restaurant and run the Actor. Organize the results by menuCategories such as "Appetizers" or "Desserts", then integrate the dish names and photo links into your product schema.
Deliverable: A structured dataset of menu categories, dish items, and max-resolution photo URLs, ready for import into a food delivery platform.
Stop condition: The dataset contains only fallback records where menuFound is false and the menuCategories array is empty.
Use case 2: CRM Lead Enrichment
Outcome: Enrich CRM / lead-gen datasets with menu signals
Configure: For a target restaurant, set placeUrl to its Google Maps URL and maxItems to 10.
Working method: Process individual place URLs in sequence. Assess whether menuFound is true or if an external menuUrl is populated to gauge each venue's digital menu presence within your sales pipeline.
Deliverable: Updated CRM records with an external menu URL and flags indicating the availability of a digital menu.
Stop condition: The provided placeUrl fails to resolve or returns a fallback record where the menuUrl field is absent.
Use case 3: Popular Dish Discovery
Outcome: Discover signature / popular dishes per restaurant
Configure: Set placeUrl to the desired restaurant's Google Maps URL, maxItems to 100, and language to "en".
Working method: Execute the extraction for your chosen locations. Filter the dataset records where isPopular is true to identify Google-highlighted signature dishes for competitive analysis.
Deliverable: A curated list of popular dishes per business, including their rank and associated images.
Stop condition: No items in the dataset have isPopular set to true for a restaurant known to feature popular dish tags.
What breaks, and how do you design around it?
- Over the last 30 days, 1.3% of public runs failed and 0.0% timed out. Build retries and alerting around those rates rather than assuming every run completes.
Google Maps does not display per-item prices or detailed descriptions on its inline menu tabs. If you require pricing or modifier information, use the extracted menuUrl to direct custom web scrapers to the restaurant's official website. To prevent ambiguous business names from resolving to an incorrect location, always include explicit coordinates like @lat,lng in your placeUrl.
When should you not use Google Maps Menu Scraper?
Do not use this Actor if your integration relies on item-level prices, detailed dish descriptions, or the ability to access online ordering directly through Google Maps records, as Google Maps does not publish per-item prices on place page menu tabs. If you need to find business emails, phone numbers, and social media links from business listings for contact enrichment, consider using Google Maps Leads Scraper. If your primary goal is to identify points of interest around a specific latitude and longitude coordinate rather than extracting menu data, Google Maps Nearby Scraper would be a more suitable tool.
What should you check before trusting the output?
- Alert if menuFound is false and menuUrl is null, indicating neither an inline menu nor an external link was found.
- Check that itemName is a non-empty string for every record where menuFound is true.
- Verify that rank is a positive integer, starting at 1, for all extracted dish records.
- Stop scheduled runs if a batch consistently yields only fallback records with menuFound set to false.
- Confirm that itemImage, when present, contains a valid URL string from Googleusercontent.com.
None of this proves a record is correct. It gives a scheduled Google Maps Menu Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
Does Google Maps Menu Scraper return item prices?
No, Google Maps does not display per-item prices on its place page menu cards. The Actor provides dish names, photos, and popular badges. If a restaurant publishes an external menu link, the Actor extracts it into the menuUrl field, allowing other tools to fetch full pricing details.
How much does it cost to run this Actor?
The cost is $0.005 per result written to the dataset, amounting to $5.00 per 1,000 results on Apify's free plan. Apify's free plan includes $5.00 of monthly usage, which covers up to 1,000 results of this Actor before run-start charges. Paid Apify tiers offer lower per-result rates. A small run-start fee and platform usage charges also apply.
What is the historical run success rate for this scraper?
In the last 30 days, 790 out of 800 runs succeeded, representing a 98.8% success rate. 10 runs failed, while 0 timed out and 0 were aborted by users. This indicates a high degree of reliability for the Actor.
What happens if a restaurant does not have a menu on Google Maps?
When a restaurant lacks inline menu items on Google Maps, the Actor still emits a single fallback record. This record includes the businessName, placeUrl, scrapedAt, and sets menuFound to false. If an external site link is present, it will be captured in the menuUrl field.
Can I scrape multiple restaurant menus in a single run?
No, this Actor is designed to accept only one placeUrl per run execution. To process multiple restaurant menus, you will need to schedule sequential runs or integrate this Actor into a larger workflow that iterates through a list of URLs.
Where to go next
When you are ready to run it, open Google Maps Menu Scraper on Apify; the free plan covers up to 1,000 results a month.
Start with the Google Maps Menu Scraper Actor page for the current input schema, pricing tier, and run history.
It is part of the Google Maps Scraping Suite, which puts every related Actor on one page with its price and run history.
Other Actors we maintain for related data:
- Google Maps Photos Scraper: Extract photos from any Google Maps place - carousel scraping with max-resolution URLs, contributor info, and category metadata.
- Google Maps Leads Scraper: Scrape business leads from Google Maps.
- Google Maps Geocoding Scraper: Bidirectional geocoding via Google Maps: convert addresses to coordinates (forward) or coordinates to addresses (reverse).
- Google Maps Nearby Places: Find places near a coordinate.
- Google Maps Timezone & Local Time Lookup: Resolve the IANA timezone, current local time, UTC offset, and daylight-saving information for any coordinate.
- Google Maps Place List Scraper: Extract ranked places from Google's curated Top lists ('Top hotels in Paris', 'Best coffee in Brooklyn', 'Things to do in Tokyo') or any Google Maps list URL.
- Google Maps Similar Places Scraper: Extract 'People also search for' / similar / related places from any Google Maps business page - name, place ID, rating, reviews, category, image, and coordinates.
- Google Maps Popular Times Scraper: Extract popular times busy-hours histograms and live busyness data from Google Maps places - all 7 days with hourly percentages, current busyness, and typical time spent.
Related guides:
- Google Maps Photos Scraper: Practical Applications
- Google Maps Geocoding Scraper: 13 Data Fields per Record (2026)
- Google Maps Popular Times Scraper: Up to 1,000 Free Results a Month
- Google Maps Area Scanner: Practical Use Cases and Implementation Guide
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-25.
Actor last updated by its maintainers on 2026-06-16.
Run outcome figures cover the 30 day public window ending 2026-09-25.
Featured actors
Google Maps Menu Scraper
Extract restaurant menu items, popular dishes, photos, categories, and external menu links from any Google Maps place page.
Run on Apify ↗