UberEats Menu Scraper + Analytics
Pricing
from $2.75 / 1,000 menu_items
UberEats Menu Scraper + Analytics
Extract full menus from any UberEats store. Paste store URLs, get menu items with prices, images, and sections — plus per-store analytics (price/image coverage, min/max/avg price). Multi-country support. Ideal for price monitoring and competitive restaurant analysis.
Pricing
from $2.75 / 1,000 menu_items
Rating
0.0
(0)
Developer
DataCach
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🍔 UberEats Menu Scraper + Analytics
Extract complete, structured menu data from any UberEats store — including item names, prices, sections, descriptions, and images. Just paste the store URLs directly from your browser. No UUIDs, no API keys, no setup required.
Built for price monitoring, competitive restaurant analysis, food-tech applications, and AI-powered food discovery.
💰 Transparent, usage-based pricing
$6.90 per 1,000 menu items — you only pay for what you extract.
| Volume | Estimated cost |
|---|---|
| 1 store × 50 items | ~$0.35 |
| 20 stores × 50 items | ~$6.90 |
| 100 stores × 50 items | ~$34.50 |
| 1,000 stores × 50 items | ~$345.00 |
Higher Apify subscription tiers (Bronze, Silver, Gold) automatically receive discounted rates. No hidden fees, no per-run charges beyond the standard Actor start cost.
✨ What does this Actor do?
- Accepts one or more UberEats store page URLs copied directly from your browser.
- Automatically decodes the store identifier from the URL — works for both US and international stores.
- Fetches all stores concurrently with a built-in retry mechanism for maximum reliability.
- Extracts every menu item across all sections and subsections.
- Computes per-store analytics (price coverage, image coverage, min/max/avg price, promotion detection).
- Outputs structured data across three separate datasets ready for JSON, CSV, or Excel export.
- Enforces limits for free Apify accounts automatically.
📝 Input
| Field | Type | Required | Description |
|---|---|---|---|
store_urls | string[] | Yes | UberEats store page URLs to scrape. Paste directly from your browser. |
country_code | string | No (default: "us") | ISO country code fallback. Auto-detected from URLs when possible. |
Supported URL formats
Both US and international UberEats URLs are supported:
# US — UUID is visible directly in the URLhttps://www.ubereats.com/store/mcdonalds-fillmore/209c6d0b-8bf5-579c-926b-436bd3bf839c# Internationalhttps://www.ubereats.com/cl/store/arma-tu-hamburguesa-arica/reNyJaIAXPiMDQ7hjscVHA
Example input
{"store_urls": ["https://www.ubereats.com/store/mcdonalds-fillmore/209c6d0b-8bf5-579c-926b-436bd3bf839c","https://www.ubereats.com/cl/store/arma-tu-hamburguesa-arica/reNyJaIAXPiMDQ7hjscVHA"]}
How to find a store URL
Navigate to any restaurant on ubereats.com and copy the URL from your browser's address bar. That's it.
📦 Output
This Actor produces three separate datasets per run, each accessible from the Storage tab in the Apify run detail.
1. Default dataset — Menu Items
One record per menu item. This is the main output.
{"subsection_id": "2c05b603-56ea-5441-97f9-019f8a7ebc2f","subsection_name": "Most Popular","store_id": "ad2a8786-4e0e-45f4-a79f-a1dfb38d797f","section_id": "c65630da-f63f-5258-8f7d-f94f2bbba0cb","section_name": "Lunch","country_code": "us","region_code": "dc","data_file": "ad2a8786-4e0e-45f4-a79f-a1dfb38d797f","has_customizations": true,"is_sold_out": false,"is_available": true,"menu_item_id": "a34b9dd7-c831-5b77-bfd4-56ffa252feab","menu_item_name": "Medium French Fries","menu_item_price": 499,"menu_item_price_promotion": null,"menu_item_price_tagline": {"text": "$4.99 • 320 Cal.","textFormat": "<span>$4.99<span style=\"color:#757575\"> • 320 Cal.</span></span>","accessibilityText": "$4.99, 320 Cal."},"menu_item_description": null,"menu_item_image": "https://tb-static.uber.com/prod/image-proc/processed_images/c821c5db2718d95dd1fd68002987ec27/c67fc65e9b4e16a553eb7574fba090f1.jpeg","store_url": "https://www.ubereats.com/store/mcdonalds-bwr-rbd-80017-ny-aves/ad2a8786-4e0e-45f4-a79f-a1dfb38d797f","extraction_date": "2026-03-25","extraction_datetime": "2026-03-25T06:20:40.673495+00:00","main_task_id": "4e8b5aba-a061-4350-8852-32f114f8eabe","main_task_started": "2026-03-25T06:20:38.745046+00:00","position": 0}
| Field | Type | Description |
|---|---|---|
menu_item_id | string | Unique UUID of the menu item |
menu_item_name | string | Display name |
menu_item_price | integer | Raw price in the smallest currency unit (divide by 100 for most countries) |
menu_item_price_promotion | string | null | Promotional price tagline if a discount is active |
menu_item_price_tagline | object | Formatted price object from the UberEats API |
menu_item_description | string | null | Item description |
menu_item_image | string | null | Image URL |
store_id | string | UUID of the parent store |
section_name | string | Menu section name |
subsection_name | string | Menu subsection name |
has_customizations | boolean | Whether the item has customizable options |
is_sold_out | boolean | Whether the item is currently sold out |
is_available | boolean | Whether the item is currently available |
country_code | string | ISO country code of the store |
extraction_date | string | ISO date of extraction (YYYY-MM-DD) |
extraction_datetime | string | ISO datetime in UTC |
main_task_id | string | UUID shared across all items in the same run |
main_task_started | string | ISO datetime when the run started |
2. store-analytics dataset — Per-store Summary
One record per scraped store. Useful for competitive benchmarking, data quality audits, and price intelligence dashboards.
{"store_id": "ade37225-a200-5cf8-8c0d-0ee18ec7151c","country_code": "cl","total_sections": 4,"total_subsections": 12,"total_items": 38,"price_coverage_pct": 100.0,"image_coverage_pct": 94.74,"min_price": 150000,"max_price": 650000,"avg_price": 312500.0,"has_promotions": false,"extraction_date": "2026-03-25","extraction_datetime": "2026-03-25T04:30:35.319213+00:00","main_task_id": "36a31035-82ad-41a0-8b24-37ade70e2c44","main_task_started": "2026-03-25T04:30:31.438177+00:00"}
| Field | Description |
|---|---|
total_sections / total_subsections / total_items | Menu structure counts |
price_coverage_pct | % of items with a non-zero price (0–100) |
image_coverage_pct | % of items with an image URL (0–100) |
min_price / max_price / avg_price | Price statistics in raw currency units |
has_promotions | true if at least one item has an active promotional price |
3. run-summary dataset — Run-level Report
One record per Actor run. Ideal for monitoring scheduled runs, auditing failures, and tracking extraction history.
{"main_task_id": "36a31035-82ad-41a0-8b24-37ade70e2c44","main_task_started": "2026-03-25T04:30:31.438177+00:00","main_task_finished": "2026-03-25T04:31:10.000000+00:00","country_code": "cl","stores_requested": 5,"stores_succeeded": 4,"stores_failed": 1,"failed_store_ids": ["ade37225-a200-5cf8-8c0d-0ee18ec7151c"],"total_menu_items": 142,"free_user": false}
💎 Free vs Paid
| Feature | Free | Paid |
|---|---|---|
| Store URLs per run | 1 | Up to 1,000 |
| Menu items returned | 5 | Unlimited |
| Multi-country in one run | ❌ | ✅ |
| Per-store analytics dataset | ❌ | ✅ |
| Run summary dataset | ❌ | ✅ |
| Concurrent fetching (up to 32 workers) | ❌ | ✅ |
| Bulk scraping for price monitoring | ❌ | ✅ |
Free account limits
When running with a free Apify account, the following restrictions apply automatically:
- Only the first store URL is processed.
- A maximum of 5 menu items is returned.
Upgrade to a paid Apify plan to unlock bulk scraping, full analytics, and multi-country support.
🚀 How to run
Apify Console
- Click Try for free on this page.
- Paste your UberEats store URLs into the
store_urlsfield. - Click Start and wait for the run to complete.
- Download results from the Storage tab in JSON, CSV, or Excel format.
Apify API
curl -X POST \"https://api.apify.com/v2/acts/datacach~ubereats-menu-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"store_urls": ["https://www.ubereats.com/store/mcdonalds-fillmore/209c6d0b-8bf5-579c-926b-436bd3bf839c"]}'
Schedule recurring runs
Use Apify's built-in Scheduler to monitor menus on a daily or weekly basis and detect price changes over time.
🛠 Technical notes
- Built with Python 3 and the Apify SDK.
- Concurrent store fetching via
asynciowith a semaphore (up to 32 workers by default). - Automatic retry — stores that fail on the first attempt are retried once with a fresh authentication token before being marked as permanently failed.
- URL decoding — international UberEats URLs encode the store ID as a URL-safe base64 hash; the Actor decodes it automatically.
- Duplicate URLs in the input are deduplicated while preserving order.
- Supports UberEats menu API formats v1 (
catalogSectionsMap) and v2 (sectionEntitiesMap). - All timestamps are in UTC.
🔗 Related Actors
| Actor | Description |
|---|---|
| UberEats – Stores Search by Location and Keyword | Search for UberEats stores by location and keyword. Use it to discover store URLs, then feed them directly into this Actor to extract their full menus. |
| UberEats – Brand Listing by Country | Get every brand listed on UberEats for one or more countries. |
💬 Support
Need help or have a feature request? Reach us via the Apify inbox on our profile page.
✨ Credits
Developed and maintained by the DataCach team.
This Actor is neither affiliated with, sponsored by, nor endorsed by Uber Eats or Uber Technologies Inc. Use responsibly and in accordance with the Apify Terms of Service and Uber Eats' own terms of use.