# Uber Eats Full Menu & Reviews Scraper (`memo23/uber-eats-scraper`) Actor

Uber Eats stores → JSON per URL: menuSections & menuItems (prices, currency, images; optional add-on trees), ratingValue, reviewCount, reviewSamples, address, phone, hours, isOpen/isOrderable, cuisines, analytics, hero images, SEO title/description, URLs, scrapedAt.

- **URL**: https://apify.com/memo23/uber-eats-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 15 total users, 14 monthly users, 93.2% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### Overview

Extract structured restaurant and menu data from **Uber Eats** store pages: store identity, SEO metadata, ratings, address, hours, cuisines, full menu (JSON-LD sections and a flattened item list), optional customization trees, review samples, and delivery hints. Each input URL produces one rich dataset item suitable for price monitoring, menu syndication, or market research.

The **Uber Eats Store Scraper** is an Apify actor that loads public Uber Eats **store detail** URLs, parses embedded application state and JSON-LD, and returns a single JSON object per store with menu items, images, and analytics-style rollups.

With this scraper, you get **complete menu coverage** where exposed in the page payload (sections, item names, descriptions, prices, images), plus **store-level context** such as open/closed status, rating summary, phone number, and formatted address.

**Key metrics** include per-item prices, aggregate menu analytics (min/max/average price, image coverage, customization stats), and review text samples hydrated from the store page state.

The actor is built for **reliable high-concurrency fetching** using Crawlee with an HTTP client tuned for real browser fingerprints, with proxy support for stable runs.

Whether you are aggregating menus across brands, comparing pricing by location, or building a food-data product, this actor returns consistent JSON you can pipe into databases or spreadsheets.

---

### Features

- **Store page extraction**:
  - Accepts standard Uber Eats store URLs (with locale path or `/store/{slug}/{id}` form)
  - Resolves canonical URLs, titles, descriptions, and hero imagery

- **Comprehensive menu data**:
  - **menuSections**: Schema.org `Menu`/`MenuSection`/`MenuItem` structure from JSON-LD where present
  - **menuItems**: Flattened list with section names, prices, currency, images, UUIDs, and (optionally) full customization groups/options

- **Ratings, reviews, and trust signals**:
  - **ratingValue** and **reviewCount** from structured data or embedded state
  - **reviewSamples**: reviewer-visible comments and dates from embedded `storeReviews`

- **Location & operations**:
  - Postal address object and **addressText**, **phoneNumber**, **hours**, **isOpen** / **isOrderable**, **closedMessage**
  - **cuisineList**, **currencyCode**, **priceBucket**, FAQ count, ETA range when detectable

- **Analytics & diagnostics**:
  - **analytics** object summarizing section count, item counts, price and image coverage, customization coverage
  - HTTP **statusCode**, **contentType**, **bodyLength**, optional saved **htmlFile** reference, **scrapedAt** timestamp

- **Efficient crawling**:
  - Cheerio-based parsing with Impit HTTP client (Firefox fingerprint, HTTP/3)
  - Configurable concurrency, retries, and Apify proxy integration

---

### How to Use

1. **Set Up**: Ensure you have an Apify account and access to the Apify platform.
2. **Provide Input Data**: Add one or more **Uber Eats store URLs** to `startUrls`.
3. **Adjust Scraper Settings**: Configure settings like `maxItems`, `maxConcurrency`, and `maxRequestRetries` to optimize performance.
4. **Run the Scraper**: Execute the actor on the Apify platform.
5. **Download Results**: Export the scraped data in your preferred format (JSON, CSV, Excel).

#### Usage Limitations

**Free Users**: Non-paying users are limited to scraping **50 listings** per run. To access unlimited scraping and all features, please upgrade to a paid Apify account.

**Paid Users**: Enjoy unlimited scraping, multiple start URLs, and full access to all scraper features.

---

### Input Configuration

To use the scraper, configure the input parameters as follows:

```json
{
    "startUrls": [
        {
            "url": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A"
        },
        {
            "url": "https://www.ubereats.com/en-US/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A"
        }
    ],
    "maxItems": 300,
    "maxConcurrency": 100,
    "minConcurrency": 1,
    "maxRequestRetries": 100,
    "includeItemCustomizations": false,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
}
````

#### Input Fields Explanation

- **Start URLs** (`startUrls`): Public **Uber Eats restaurant store** URLs. Supported shapes include:
  - `https://www.ubereats.com/store/{store-slug}/{store-id}`
  - `https://www.ubereats.com/{locale}/store/{store-slug}/{store-id}` (locale prefix, e.g. `en-US`)
- **Max Items** (`maxItems`): Maximum number of stores to process per run (one dataset item per successful store page). Default is `100`.
- **Max Concurrency** (`maxConcurrency`): Maximum number of pages processed simultaneously. Default is `100`.
- **Min Concurrency** (`minConcurrency`): Minimum number of pages processed simultaneously. Default is `1`.
- **Max Request Retries** (`maxRequestRetries`): Number of retries for failed requests. Default is `100`.
- **Include item customizations** (`includeItemCustomizations`): When `true`, enriches `menuItems` with full customization group/option payloads (much larger output).
- **Proxy Configuration** (`proxy`): Settings for reliable and anonymous scraping. Supports custom proxy URLs.

***

### Output Structure

The scraper produces structured JSON output: **one object per store URL** with nested menu data, metadata, and optional debug fields.

#### Sample Data

*The record below is the **first item** from `data.json` (Jersey Mike's Subs example). The full export is very large; for readability this sample keeps all scalar fields and analytics as in the source object, shows the **first four** `heroImageUrls`, the **first two** `menuSections` with **two** dishes each, and **three** `menuItems` chosen from items without heavy customization payloads. Counts such as `menuItemCount` and `analytics` reflect the full scrape—not the shortened arrays.*

```json
{
    "source": "ubereats_detail_html",
    "url": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName=",
    "restaurantUrl": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A",
    "shopName": "jersey-mikes-subs-creekside",
    "shopId": "B5-ImzTAQf2En_RCiqU62A",
    "message": "success: menu found.",
    "hasMenu": true,
    "menuType": "Menu",
    "storeId": "B5-ImzTAQf2En_RCiqU62A",
    "storeUuid": "079f889b-34c0-41fd-849f-f4428aa53ad8",
    "storeSlug": "jersey-mikes-subs-creekside",
    "citySlug": "houston",
    "locale": null,
    "htmlLocale": "en-US",
    "originalUrl": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName=",
    "canonicalUrl": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A",
    "loadedUrl": "https://www.ubereats.com/store/jersey-mikes-subs-creekside/B5-ImzTAQf2En_RCiqU62A?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName=",
    "title": "Jersey Mike's Subs (Creekside)",
    "seoTitle": "Order Jersey Mike's Subs (Creekside) - Menu & Prices - Houston Delivery | Uber Eats",
    "description": "Use your Uber account to order delivery from Jersey Mike's Subs (Creekside) in Houston. Browse the menu, view popular items, and track your order.",
    "image": "https://tb-static.uber.com/prod/image-proc/processed_images/dc10f9e54832652cfaea6214699a22b8/19ec62ba51fde35ba0aff5b84321c5af.jpeg",
    "heroImageUrls": [
        "https://tb-static.uber.com/prod/image-proc/processed_images/dc10f9e54832652cfaea6214699a22b8/19ec62ba51fde35ba0aff5b84321c5af.jpeg",
        "https://tb-static.uber.com/prod/image-proc/processed_images/dc10f9e54832652cfaea6214699a22b8/c67d558c633281f9c71fc6a90ef470ae.jpeg",
        "https://tb-static.uber.com/prod/image-proc/processed_images/dc10f9e54832652cfaea6214699a22b8/8681e511c0910e0052cb155c50f01f89.jpeg",
        "https://tb-static.uber.com/prod/image-proc/processed_images/dc10f9e54832652cfaea6214699a22b8/6ea4f72e303000fbf403bbb36f971f85.jpeg"
    ],
    "ratingValue": 4.9,
    "reviewCount": 1000,
    "phoneNumber": "+13468085967",
    "address": {
        "@type": "PostalAddress",
        "addressLocality": "Spring",
        "addressRegion": "TX",
        "postalCode": "77389",
        "addressCountry": "US",
        "streetAddress": "25640 Kuykendahl Rd"
    },
    "addressText": "25640 Kuykendahl Rd, Spring, TX, 77389, US",
    "pllStatus": "200",
    "faqCount": 8,
    "currencyCode": "USD",
    "priceBucket": "$",
    "cuisineList": [
        "Sandwich",
        "American",
        "Bar Food"
    ],
    "isOrderable": true,
    "isOpen": true,
    "closedMessage": "",
    "hours": [
        {
            "dayRange": "Every Day",
            "sectionHours": [
                {
                    "startTime": 600,
                    "endTime": 1230,
                    "sectionTitle": ""
                }
            ]
        }
    ],
    "menuSections": [
        {
            "@type": "MenuSection",
            "name": "Free with $15 purchase",
            "hasMenuItem": [
                {
                    "@type": "MenuItem",
                    "name": "#7 Turkey and Provolone",
                    "description": "Provolone and Turkey. Served Mike's Way with onions, lettuce, tomato, vinegar, oil, oregano, and salt.",
                    "offers": {
                        "@type": "Offer",
                        "price": "11.94",
                        "priceCurrency": "USD"
                    },
                    "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/e092aa3249393c24f6edf40d7ca2af39/c67fc65e9b4e16a553eb7574fba090f1.jpeg"
                },
                {
                    "@type": "MenuItem",
                    "name": "Mike's Hot Italian",
                    "description": "Ham, salami & pepperoni with melted provolone cheese. Topped with grilled onions, lettuce, tomato and Hot Chopped Pepper Relish.",
                    "offers": {
                        "@type": "Offer",
                        "price": "10.73",
                        "priceCurrency": "USD"
                    },
                    "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/56eae964cde0acab6c6fc55337064832/c67fc65e9b4e16a553eb7574fba090f1.jpeg"
                }
            ]
        },
        {
            "@type": "MenuSection",
            "name": "Cold Subs",
            "hasMenuItem": [
                {
                    "@type": "MenuItem",
                    "name": "#7 Turkey and Provolone",
                    "description": "Provolone and Turkey. Served Mike's Way with onions, lettuce, tomato, vinegar, oil, oregano, and salt.",
                    "offers": {
                        "@type": "Offer",
                        "price": "11.94",
                        "priceCurrency": "USD"
                    },
                    "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/e092aa3249393c24f6edf40d7ca2af39/c67fc65e9b4e16a553eb7574fba090f1.jpeg"
                },
                {
                    "@type": "MenuItem",
                    "name": "#13 The Original Italian",
                    "description": "Provolone, ham, prosciuttini, cappacuolo, salami, and pepperoni. Served Mike's Way with onions, lettuce, tomato, vinegar, oil, oregano, and salt.",
                    "offers": {
                        "@type": "Offer",
                        "price": "13.13",
                        "priceCurrency": "USD"
                    },
                    "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/209a01090468cd8010e498c5183faea7/c67fc65e9b4e16a553eb7574fba090f1.jpeg"
                }
            ]
        }
    ],
    "menuSectionCount": 5,
    "menuSubsectionCount": 3,
    "menuItemCount": 39,
    "menuItems": [
        {
            "name": "#31 California Chicken Cheese Steak",
            "description": "Lettuce, tomato, mayo, and white American cheese (Not available in all locations).",
            "section": "Hot Subs",
            "price": 12.84,
            "currency": "USD",
            "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/d206b0e4d9dfb622a47210018c48e300/c67fc65e9b4e16a553eb7574fba090f1.jpeg",
            "hasImage": true
        },
        {
            "name": "Chips",
            "description": "",
            "section": "Sides, Drinks, & Desserts",
            "price": 2.34,
            "currency": "USD",
            "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/8e6b2d2fb9564795b2c343c185311f5e/c67fc65e9b4e16a553eb7574fba090f1.jpeg",
            "hasImage": true
        },
        {
            "name": "Cookie",
            "description": "Fresh-baked and delicious.",
            "section": "Sides, Drinks, & Desserts",
            "price": 1.8,
            "currency": "USD",
            "imageUrl": "https://tb-static.uber.com/prod/image-proc/processed_images/79b1243942eefeb750018d1cae8f654c/c67fc65e9b4e16a553eb7574fba090f1.jpeg",
            "hasImage": true
        }
    ],
    "analytics": {
        "totalSections": 5,
        "totalItems": 39,
        "itemsWithPrices": 39,
        "itemsWithoutPrices": 0,
        "minPrice": 1.8,
        "maxPrice": 13.86,
        "averagePrice": 10.22,
        "itemsWithImages": 39,
        "itemsWithoutImages": 0,
        "imageCoverage": 100,
        "priceCoverage": 100,
        "itemsWithCustomizations": 31,
        "itemsWithoutCustomizations": 8,
        "customizationCoverage": 79,
        "totalCustomizationGroups": 31,
        "totalCustomizationOptions": 2542
    },
    "reviewSamples": [
        {
            "eaterName": "Pamela G.",
            "reviewText": "The sandwich is just awesome",
            "formattedDate": "08/14/24",
            "createdAt": "2024-08-14T00:00:00"
        },
        {
            "eaterName": "Michael M.",
            "reviewText": "Always good",
            "formattedDate": "05/13/24",
            "createdAt": "2024-05-13T00:00:00"
        },
        {
            "eaterName": "Chase H.",
            "reviewText": "#13 is the best",
            "formattedDate": "02/27/24",
            "createdAt": "2024-02-27T00:00:00"
        },
        {
            "eaterName": "pamula S.",
            "reviewText": "Great sandwiches",
            "formattedDate": "02/02/24",
            "createdAt": "2024-02-02T00:00:00"
        },
        {
            "eaterName": "Cody P.",
            "reviewText": "Delicious!",
            "formattedDate": "10/15/23",
            "createdAt": "2023-10-15T00:00:00"
        },
        {
            "eaterName": "Jose G.",
            "reviewText": "Great Sandwiches and excellent service",
            "formattedDate": "10/11/23",
            "createdAt": "2023-10-11T00:00:00"
        },
        {
            "eaterName": "yadder M.",
            "reviewText": "Delicious",
            "formattedDate": "09/18/23",
            "createdAt": "2023-09-18T00:00:00"
        },
        {
            "eaterName": "Steve R.",
            "reviewText": "Excellent store.",
            "formattedDate": "07/22/23",
            "createdAt": "2023-07-22T00:00:00"
        },
        {
            "eaterName": "Linda J.",
            "reviewText": "The food is amazing and the delicious very driver was wonderful",
            "formattedDate": "07/10/23",
            "createdAt": "2023-07-10T00:00:00"
        },
        {
            "eaterName": "Sherley S.",
            "reviewText": "Delicious",
            "formattedDate": "06/24/23",
            "createdAt": "2023-06-24T00:00:00"
        },
        {
            "eaterName": "Claudia D.",
            "reviewText": "Fresh and delicious",
            "formattedDate": "05/27/23",
            "createdAt": "2023-05-27T00:00:00"
        },
        {
            "eaterName": "Vanessa G.",
            "reviewText": "Delicious!",
            "formattedDate": "03/26/23",
            "createdAt": "2023-03-26T00:00:00"
        },
        {
            "eaterName": "Mark N.",
            "reviewText": "Great",
            "formattedDate": "12/29/21",
            "createdAt": "2021-12-29T00:00:00"
        }
    ],
    "menuItemMentions": 40,
    "sectionMentions": 200,
    "reviewMentions": 1,
    "reactQueryQueryCount": 6,
    "catalogItemCount": 35,
    "itemCustomizationsEnabled": true,
    "customizationItemsCount": 31,
    "deliveryFeeText": null,
    "etaRange": "16–16 Min",
    "statusCode": 200,
    "contentType": "text/html; charset=utf-8",
    "bodyLength": 1399934,
    "htmlFile": "UBER_EATS_DETAIL-B5-ImzTAQf2En_RCiqU62A-1774802693942.html",
    "scrapedAt": "2026-03-29T16:45:03.903Z"
}
```

***

### Output Fields Explanation

Below is an explanation of the fields in the output JSON, categorized for clarity.

#### 1. Identification, URLs & source

- **source**: How the row was produced (e.g. `ubereats_detail_html`).
- **url** / **originalUrl** / **loadedUrl** / **canonicalUrl** / **restaurantUrl**: Request and canonical store links.
- **shopName**, **shopId**, **storeId**, **storeUuid**, **storeSlug**, **citySlug**: Store identifiers and slug paths.
- **locale**, **htmlLocale**: Language/locale hints from input or HTML.
- **message**: Short status such as menu discovery outcome.
- **hasMenu**, **menuType**: Whether a menu was found and its label.

#### 2. Store presentation & SEO

- **title**: Store display name.
- **seoTitle**, **description**: Meta title and description.
- **image**: Primary image URL.
- **heroImageUrls**: Gallery of hero/banner images from the page payload.

#### 3. Ratings, reviews & FAQs

- **ratingValue**: Average rating when available.
- **reviewCount**: Total ratings count from structured data (may exceed length of embedded review text).
- **reviewSamples**: Array of recent public reviews (eater name, text, formatted and ISO dates).
- **faqCount**: Number of FAQ entries when exposed.

#### 4. Location, contact & cuisines

- **address**: JSON-LD `PostalAddress` object.
- **addressText**: Single-line formatted address.
- **phoneNumber**: Store phone when present.
- **cuisineList**: Cuisine tags (e.g. Sandwich, American).
- **currencyCode**, **priceBucket**: Currency and price band indicator.

#### 5. Ordering state & hours

- **isOrderable**, **isOpen**: Whether the storefront accepts orders and is open.
- **closedMessage**: User-visible closed copy when applicable.
- **hours**: Structured opening hours (day ranges and section hours).

#### 6. Menu (structured & flat)

- **menuSections**: JSON-LD-style menu sections with nested `MenuItem` entries (name, description, `offers` price, `imageUrl`).
- **menuSectionCount**, **menuSubsectionCount**, **menuItemCount**: Counts for sections, subsections, and items.
- **menuItems**: Denormalized list of items (name, description, section, price, currency, image, UUIDs, optional `customizations` when enabled).

#### 7. Analytics & embedded-state hints

- **analytics**: Aggregates such as total items, min/max/average price, image and price coverage, customization coverage and option counts.
- **menuItemMentions**, **sectionMentions**, **reviewMentions**: Raw substring occurrence counts in HTML (debug/quality signal).
- **reactQueryQueryCount**: Number of React Query entries parsed from `__REACT_QUERY_STATE__`.
- **catalogItemCount**, **itemCustomizationsEnabled**, **customizationItemsCount**: Catalog sizing hints from embedded data.

#### 8. Delivery hints & HTTP metadata

- **deliveryFeeText**, **etaRange**: Delivery fee copy and ETA range when parsed from HTML.
- **pllStatus**: Internal PLL script status code string when present.
- **statusCode**, **contentType**, **bodyLength**: HTTP response metadata.
- **htmlFile**: Filename of optional saved HTML snapshot on disk (local/debug runs).
- **scrapedAt**: ISO timestamp when the row was produced.

***

### Benefits of the Uber Eats Store Scraper

- **Menu intelligence**: Capture full menus with prices and images in one request per store.
- **Competitive research**: Compare item pricing and assortment across locations and brands.
- **Data pipelines**: Clean JSON ready for warehouses, BI tools, or enrichment workflows.
- **Review snippets**: Quick access to verbatim customer feedback included in the initial page payload.
- **Operational flags**: Open/closed and orderable state for availability monitoring.

***

### Why Choose the Uber Eats Store Scraper?

The Uber Eats Store Scraper is built for teams that need **repeatable, structured restaurant data** without maintaining headless browsers for every run. It combines fast HTTP fetching with parsing of Uber’s embedded state and JSON-LD so you get menus and metadata in one JSON document per store.

**Use Cases:**

- Building or updating a restaurant menu database
- Tracking price or item changes over time
- Enriching location datasets with cuisines, hours, and ratings
- Sampling customer review text for sentiment or QA

***

### Technical Implementation

The actor uses a robust extraction pipeline:

1. **HTTP fetch**: Crawlee `CheerioCrawler` with an Impit-based client (Firefox profile, HTTP/3, optional TLS relaxations) and Apify proxy support.
2. **State & JSON-LD parsing**: Reads `__REACT_QUERY_STATE__` and JSON-LD blocks to recover store entity, menu, ratings, and reviews.
3. **Menu flattening & analytics**: Derives flat `menuItems`, optional customization trees, and summary statistics for coverage and pricing.

***

### Explore More Scrapers

If you found this actor useful, check out other scrapers at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs.

***

### Support

- For issues or feature requests, please use the **Issues** section of this actor in the Apify console.
- For further assistance, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

***

### Additional Services

- Request customization or a full dataset: <muhamed.didovic@gmail.com>
- Need other platforms scraped? Contact <muhamed.didovic@gmail.com>
- For API services of this scraper, reach out to <muhamed.didovic@gmail.com>
- Custom integrations and automation solutions available

***

### Version History

- **v1.0**: Uber Eats store detail extraction (menu, reviews, analytics)
- Cheerio + embedded React Query state parsing
- Optional full item customization payloads

***

### Legal & Compliance

This scraper is designed for legitimate business and research purposes. Users are responsible for:

- Complying with **Uber** and **Uber Eats** terms of service and applicable laws
- Respecting robots.txt, rate limiting, and platform policies
- Using scraped data in accordance with applicable privacy and consumer regulations
- Obtaining necessary permissions for commercial use of data

***

### FAQ

**Q: How many stores can I scrape per run?**\
A: Free users can process up to **50** stores per run (same `maxItems` cap as other actors on this billing tier). Paid users can raise limits according to their plan.

**Q: Does the actor return the full menu?**\
A: Yes, when Uber Eats exposes the menu in the store page payload. Output includes both JSON-LD `menuSections` and a flattened `menuItems` list; enabling `includeItemCustomizations` adds large per-item customization trees.

**Q: Are prices and currency included?**\
A: Yes. Items include numeric prices and `currency` (typically `USD` for US stores), plus store-level `currencyCode`.

**Q: How fresh is the data?**\
A: Data reflects the store page at crawl time (`scrapedAt`).

**Q: Can I scrape without proxies?**\
A: You can, but residential or datacenter proxies are recommended for stable production runs.

## apify-ubereats

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start with.

## `maxItems` (type: `integer`):

Maximum number of listings to scrape per run. Set to 0 for unlimited.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `includeItemCustomizations` (type: `boolean`):

When enabled, fetches Uber Eats item option trees such as sizes, toppings, add-ons, and nested suboptions from the item detail API. This increases run time and request volume.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ubereats.com/mx-en/store/whataburger-1120-n-velasco-st/tn7g8jrHWleakVN6nVbaIw?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName="
    }
  ],
  "maxItems": 10000,
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "includeItemCustomizations": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.ubereats.com/mx-en/store/whataburger-1120-n-velasco-st/tn7g8jrHWleakVN6nVbaIw?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName="
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/uber-eats-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.ubereats.com/mx-en/store/whataburger-1120-n-velasco-st/tn7g8jrHWleakVN6nVbaIw?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName=" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/uber-eats-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.ubereats.com/mx-en/store/whataburger-1120-n-velasco-st/tn7g8jrHWleakVN6nVbaIw?diningMode=PICKUP&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMjE0MDclMjBOJTIwTWFpbiUyMFN0JTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyaGVyZSUzQWFmJTNBc3RyZWV0c2VjdGlvbiUzQWlRanFNei05UUYwT1FIYXRmOU9qR0QlM0FDZ2dJQkNDZDc3YXVBeEFCR2dReE5EQTMlMjIlMkMlMjJyZWZlcmVuY2VUeXBlJTIyJTNBJTIyaGVyZV9wbGFjZXMlMjIlMkMlMjJsYXRpdHVkZSUyMiUzQTM3LjI0NzUzJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTgwLjQxNTEyJTdE&surfaceName="
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/uber-eats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/uber-eats-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Uber Eats Full Menu & Reviews Scraper",
        "description": "Uber Eats stores → JSON per URL: menuSections & menuItems (prices, currency, images; optional add-on trees), ratingValue, reviewCount, reviewSamples, address, phone, hours, isOpen/isOrderable, cuisines, analytics, hero images, SEO title/description, URLs, scrapedAt.",
        "version": "0.0",
        "x-build-id": "QA0s4yaWBr4aRbcf3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~uber-eats-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-uber-eats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~uber-eats-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-uber-eats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~uber-eats-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-uber-eats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to start with.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Results Limit",
                        "type": "integer",
                        "description": "Maximum number of listings to scrape per run. Set to 0 for unlimited.",
                        "default": 10000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 100
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 100
                    },
                    "includeItemCustomizations": {
                        "title": "Include All Menu Option",
                        "type": "boolean",
                        "description": "When enabled, fetches Uber Eats item option trees such as sizes, toppings, add-ons, and nested suboptions from the item detail API. This increases run time and request volume.",
                        "default": false
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
