# Uber Eats Scraper - Stores, Menus, Reviews & Prices (`topapi/uber-eats-scraper`) Actor

Scrape Uber Eats stores by address, city, search term or link: name, phone, address, hours, rating, delivery time and fee, the full menu with prices, reviews and the EU trader block. Any country, no login. $0.90 per 1,000 listing rows, $1.80 per 1,000 full stores.

- **URL**: https://apify.com/topapi/uber-eats-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 stores

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Uber Eats Scraper do?

**Uber Eats Scraper** extracts stores from [Uber Eats](https://www.ubereats.com) - restaurants, grocery, convenience, alcohol, pharmacy and retail - for any delivery address, city, coordinates, search term or Uber Eats link. Each store row carries its phone, address, opening hours, rating, delivery time and fee, the full menu with prices, the reviews Uber Eats shows and, in the EU, the store's legal trader block. Built for restaurant-tech sales teams, delivery-market analysts and menu-price trackers who need Uber Eats data on a schedule without copying it by hand.

Uber Eats Scraper - Uber Eats API - Uber Eats menu scraper - Uber Eats restaurant scraper

- **Every store Uber Eats lists at an address:** the same list a customer sees, 80 stores a page, with Uber Eats' own sort and filters
- **The full store page in one row:** phone, address, hours, the whole menu (85 items per store on average in our 100-store test), reviews, chain and price level
- **EU trader block parsed into fields:** legal name, address, email, phone, register, registration and VAT number, managing director - free with the store details
- **City-wide coverage:** a grid of delivery points around an address, merged and de-duplicated by store id
- **No login, cookies or Uber Eats API key:** give an address, a search term or a link
- **Pay only for delivered stores:** no start fee; filtered, duplicate and unreadable stores are never charged
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets; callable from AI agents through the Apify API and MCP server

### What data can you get from Uber Eats?

<table>
<tr><td>🏪 Store name, id (`uuid`) and link</td><td>🍽️ Store type (restaurant, grocery, convenience, alcohol, pharmacy, retail)</td><td>☎️ Phone number</td></tr>
<tr><td>📍 Full address, city, postcode, coordinates</td><td>⭐ Rating, exact score and rating count</td><td>💲 Price level ($, $$…)</td></tr>
<tr><td>⏱️ Delivery time estimate (min / max minutes)</td><td>🚚 Delivery fee, surge flag, service fee</td><td>🎁 Offers (BOGO, $ off, free delivery)</td></tr>
<tr><td>🕒 Opening hours per day and per menu</td><td>📖 Full menu: sections, items, prices, photos, descriptions</td><td>🔥 Like %, "#1 most liked", calories, sold out</td></tr>
<tr><td>💬 Reviews: text, first name, date</td><td>🔗 Chain (parent brand) and cuisines</td><td>📊 Menu analytics: item count, min / max / average price</td></tr>
<tr><td>🇪🇺 EU trader block: legal name, email, register, registration and VAT number</td><td>🧼 UK hygiene rating, NYC health-grade link</td><td>🧩 Item options and nutrition (add-on)</td></tr>
</table>

On our 100-store test run at a Washington, DC address (2026-10-28): phone 98%, rating 95%, opening hours 99%, menu 99% (8,477 items), reviews on 78% of stores (2,072 reviews), chain 81%, price level 63%, delivery fee 58%.

### How to scrape Uber Eats with Uber Eats Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [Uber Eats Scraper](https://apify.com/topapi/uber-eats-scraper) and click **Try for free**.
3. Type a delivery address or city into **Delivery addresses or cities** (or paste store links into **Uber Eats links**), add search terms if you want, and set **Max stores per address / search**.
4. Click **Start**. Stores stream into the dataset as they are read.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel - or put the input on a schedule.

### ⬇️ Input

| Field | What it does | Default |
|---|---|---|
| `locations` | Delivery addresses, postcodes or cities ("Times Square, New York", "75008 Paris") | - |
| `coordinates` | Delivery points as "latitude,longitude" | - |
| `searchQueries` | Search terms ("pizza", "pharmacy", "McDonald's"); each runs at each address | every store at the address |
| `startUrls` | Store links (any country), store ids, /search, /feed, /city, /category links | - |
| `sitemapCountries` | Two-letter codes: store links from Uber Eats' store sitemaps, no address needed | - |
| `country` | Country of your addresses (Uber Eats' address search prefers the caller's country) | - |
| `includeDetails` | The store page on each row: phone, address, hours, menu, reviews, trader block (add-on) | on |
| `includeMenu` / `includeReviews` | Nest the menu / reviews in the store row | on |
| `maxReviewsPerStore`, `reviewsSince` | Cap and date window for reviews | all |
| `includeItemOptions`, `maxItemOptionsPerStore` | Option groups + nutrition of customisable items (add-on) | off |
| `groceryCatalog`, `maxItemsPerStore` | Walk every aisle of grocery-type stores; cap items per store | off |
| `outputFormat` | `stores`, `menuItems` (one row per item) or `reviews` (one row per review) | stores |
| `compact` | Only the key columns, for spreadsheets | off |
| `maxResults` | Stores per address x search term (main cost control; 0 = all) | 100 |
| `maxItems` | Stores in the whole run | no cap |
| `coverage`, `radiusKm`, `gridSpacingKm` | `cityGrid` = grid of points around the address | point |
| `storeType`, `diningMode`, `sortBy` | Uber Eats' own store type, delivery / pickup, sort | all, delivery, recommended |
| `minRating`, `offersOnly`, `topEatsOnly`, `maxDeliveryMinutes`, `maxDeliveryFee` | Uber Eats' own filters, re-checked on each store | - |
| `priceBuckets`, `cuisines`, `openOnly`, `withPhoneOnly`, `withEmailOnly`, `excludeChains`, `newStoresOnly`, `onboardedSince`, `excludeStoreIds` | Filters checked before anything is charged | - |
| `monitorMode`, `monitorChanges`, `monitorStoreName` | Deliver only new (and changed) stores since the last run; with store details on, a store delivered before without its store page comes once more with it (`monitorStatus` `details`) | off |
| `language` | English site or the country's own language | English |
| `maxConcurrency`, `maxRequestRetries`, `proxyConfiguration` | Advanced | 6, 3, Apify proxy |

Field names of other Uber Eats actors are accepted too (`address`, `query`, `urls`, `maxRows`, `getMenuCustomizations`, `addressCountry`, `latitude` / `longitude`…), so switching is a copy-paste.

#### Input examples

Every store Uber Eats delivers to an address, full rows:

```json
{
  "locations": ["1600 Pennsylvania Avenue, Washington DC"],
  "maxResults": 100
}
```

The best-rated sushi in London, listing rows only (cheapest):

```json
{
  "locations": ["10 Downing Street, London"],
  "country": "GB",
  "searchQueries": ["sushi"],
  "sortBy": "rating",
  "includeDetails": false,
  "maxResults": 200
}
```

A whole city, grocery stores with their full catalogue:

```json
{
  "locations": ["Paris"],
  "country": "FR",
  "coverage": "cityGrid",
  "radiusKm": 8,
  "storeType": ["GROCERY"],
  "groceryCatalog": true,
  "maxResults": 500
}
```

Store links, with item options and the menu one row per item:

```json
{
  "startUrls": [{ "url": "https://www.ubereats.com/store/gregorys-coffee-1000-vermont/AOLOcvgyR2uaxcXi9nC76Q" }],
  "includeItemOptions": true,
  "outputFormat": "menuItems"
}
```

### ⬆️ Output

One row per store (trimmed: one menu item and one review shown; real row from the 2026-10-28 test run):

```json
{
  "uuid": "00e2ce72-f832-476b-9ac5-c5e2f670bbe9",
  "title": "Gregorys Coffee (1000 Vermont)",
  "url": "https://www.ubereats.com/store/gregorys-coffee-1000-vermont/AOLOcvgyR2uaxcXi9nC76Q",
  "storeType": "RESTAURANT",
  "phoneNumber": "+18772129983",
  "addressText": "1000 Vermont, Washington DC, DC 20005",
  "latitude": 38.9028536,
  "longitude": -77.0338531,
  "currencyCode": "USD",
  "cuisineList": ["Coffee and Tea", "Juice and Smoothies", "Pastry", "Breakfast and Brunch", "Desserts"],
  "priceBucket": "$$",
  "parentChain": { "uuid": "a20d44bb-a37b-4eb2-8f9d-93ddc1971c00", "name": "gregorys coffee" },
  "rating": { "ratingValue": 4.6, "reviewCount": "180+", "exactValue": 4.5701, "ratingCount": 180 },
  "isOpen": true,
  "etaRange": "13–32 Min",
  "etaMinutes": { "min": 13, "max": 32 },
  "deliveryFee": { "amount": 0, "currencyCode": "USD", "text": "$0 delivery fee (new users)" },
  "workingHoursTagline": "Open until 3:00 PM",
  "menus": [{ "title": "Menu", "hours": "6:00 AM – 3:00 PM", "isTop": true }],
  "promotions": ["$0 delivery fee (new users)", "Buy 1, get 1", "Buy 1, get 1 free"],
  "distance": "0.4 mi",
  "menu": [{
    "catalogName": "Featured items",
    "menuName": "Menu",
    "catalogItems": [{
      "uuid": "827aa8ca-5ecd-5d8b-bb51-68421a7d867c",
      "title": "Sausage, Egg, & Cheese Muffin",
      "itemDescription": "Pork sausage, eggs, swiss cheese & peppercorn dressing on an english muffin",
      "price": 960,
      "priceTagline": "$9.60",
      "isSoldOut": false,
      "hasCustomizations": true,
      "popularityHints": ["#1 most liked"],
      "promotionTags": ["Buy 1, get 1 free"]
    }]
  }],
  "menuItemCount": 111,
  "menuSectionCount": 20,
  "storeReviews": [{
    "reviewText": "Shop stayed open a few more minutes past closing just so I could get my order! Thank you!!",
    "eaterName": "Toby L.",
    "createdAt": "2025-05-13T00:00:00Z"
  }],
  "detailsIncluded": true,
  "searchAddress": "1600 Pennsylvania Ave NW, Washington, DC 20500, USA",
  "searchRank": 13
}
```

Menu prices are in the currency's minor units (`960` = $9.60), with `currencyCode` on every row.

An EU store adds the trader block (real values from a Munich store read on 2026-10-28):

```json
{
  "trader": {
    "legalName": "Feinkost Käfer GmbH",
    "tradingName": "Feinkost Käfer",
    "address": "Prinzregentenstr. 73, 81675, München",
    "email": "a.scherpke@feinkost-kaefer.de",
    "phone": "+49894168310",
    "register": "Amtsgericht München",
    "registrationNumber": "HRB 90753",
    "vatNumber": "811258423",
    "managingDirector": "Michael Käfer"
  },
  "emails": ["a.scherpke@feinkost-kaefer.de"]
}
```

The full field list is in the **Output** tab (81 fields). With `includeDetails: false` a row carries the listing fields only: id, name, link, photo, rating and count, delivery time and fee, offers, coordinates, open / closed state, new / exclusive badges.

### 💰 How much does it cost to scrape Uber Eats?

Pay per event, no start fee, no monthly rent:

| Event | Price | When |
|---|---|---|
| Store | **$0.0009** ($0.90 per 1,000) | every store row delivered |
| Store details | **$0.0009** ($0.90 per 1,000) | the row carries the store page (phone, address, hours, menu, reviews, trader block) - on by default |
| Item options | **$0.0027** per store | the store got at least one option group (`includeItemOptions`) |

So a full store row is **$0.0018** ($1.80 per 1,000), a listing row $0.0009. The menu, reviews, grocery catalogue, trader block and the menu-item / review output formats are inside those prices.

Measured on the platform (2026-10-28, Apify cost to us in brackets):

| Run | Stores | Time | You pay |
|---|---|---|---|
| 10 stores at Times Square (the prefill) | 10 full rows | 6.5 s | $0.018 |
| Every store at a Washington, DC address, capped at 100 | 100 full rows | 37 s | $0.18 |
| Every store Uber Eats lists at Times Square, listing rows | 422 listing rows | 10 s | $0.38 |
| Washington, DC city grid (19 points, 6 km) | 736 full rows | 16 min | $1.32 |
| 3 sushi stores in London as menu-item rows | 199 item rows | 6 s | $0.0054 |
| Store links with item options (US, FR, DE) | 3 stores, 2 with options | 5 s | $0.0108 |

Set a maximum cost per run in Apify and the actor stops cleanly at it: it delivers only stores whose events all fit.

### 🔁 Run it on a schedule

Turn on **Monitor mode**, give the memory a name and schedule the task (Apify Console → Schedules, e.g. daily). Each run delivers only stores no earlier run delivered; **Also deliver changed stores** adds stores whose rating, menu prices / items / sold-out state, price level or phone changed, with `previousStats` and `changedFields`. A run that finds nothing new bills nothing.

```json
{
  "locations": ["Times Square, New York"],
  "monitorMode": true,
  "monitorChanges": true,
  "monitorStoreName": "nyc-times-square",
  "maxResults": 0
}
```

From code: `POST https://api.apify.com/v2/acts/topapi~uber-eats-scraper/run-sync-get-dataset-items?token=<TOKEN>` with the input as the body, or the Apify MCP server from an AI agent.

### Data limits (measured)

- **One address lists the stores Uber Eats shows there**: 132 stores at a Washington, DC address, 205 at Times Square on the first page; a point ends after about 300. Use `coverage: cityGrid` for a whole city.
- **Delivery time, fee, open state and offers depend on the address and the time** of the run. Store links read without any address carry no delivery fields (add an address in `locations` and it is used for the links too).
- **The EU trader block is shown only to a customer in the store's country**; the actor reads EU store links from inside the store's country automatically (one extra request when the link has no country prefix).
- **Reviews are the ones Uber Eats shows on the store** (0 to about 110: text, first name, date). Uber Eats shows no star rating per review on the web.
- **Item options and grocery aisles are read from the container or datacenter IP only**: when a run has had to move to residential IPs, those stores are delivered without options (and not charged for them).
- **Volume per run:** each run uses one IP per step (container IP, then one Apify datacenter session, then one residential session) and moves up only when Uber Eats refuses the step before. In our city-grid test the container IP read 697 store pages before Uber Eats answered "too many requests" and the run went on from the datacenter session. If every step is refused, the run stops and delivers what it already read.
- **The full grocery catalogue is request-heavy** (one big store took 151 requests for 6,855 products) and Uber Eats checks such walks sooner, so a run reads the whole catalogue of a few stores; a walk that was cut keeps the aisles read and says `groceryCatalogComplete: false`.
- **Search results carry no matched dishes**: Uber Eats' web search answer lists stores, not the items that matched.
- Italy and Brazil returned no restaurants in our 2026-10-20 test (Uber Eats does not serve restaurants there).

### FAQ

#### Do I need an Uber Eats account or API key?

No. The actor reads what any visitor sees, with no login, cookie or key.

#### Which countries work?

Every country Uber Eats serves: the US, Canada, Mexico, the UK, Ireland, France, Germany, Spain, the Netherlands, Belgium, Japan, Taiwan, Australia, New Zealand, Chile and more. Set `country` for addresses outside the US, or give coordinates.

#### How do I get a whole city?

Set `coverage` to `cityGrid` and a `radiusKm`. The actor reads a grid of points around the address and merges them by store id, so a store is delivered and charged once.

#### How do I get only the stores I have not seen yet?

Monitor mode remembers delivered stores in a named store; schedule it and each run returns only new (and, if you want, changed) stores.

#### Can I get the menu as one row per item?

Yes: `outputFormat: menuItems`. Each item row carries the store's name, link, type, city, country and currency. `reviews` gives one row per review. The price is still per store.

#### What is the EU trader block?

EU law makes marketplaces show who the seller is. Uber Eats shows it on EU stores; the actor splits it into legal name, address, email, phone, register, registration number, VAT number and managing director.

#### Why is the delivery fee empty on some stores?

Uber Eats shows a fee only for some store / address / time combinations and often shows a new-user offer instead (58% of stores carried one in our DC test).

#### Does it get item options (sizes, toppings)?

Yes, with `includeItemOptions`: every option group with its choices, extra prices, min / max and the item's nutrition. It costs $0.0027 per store that gets at least one group.

#### Can I use my own proxy?

Yes, in `proxyConfiguration`. The actor then uses only that proxy.

#### What happens if Uber Eats blocks the run?

The run moves one step up (container IP → datacenter → residential) when Uber Eats refuses; it never answers a challenge. If every step is refused with nothing delivered, the run ends FAILED and nothing is charged; with some stores delivered it ends SUCCEEDED with a warning in the status.

### Other actors

- [Google Maps Reviews Scraper](https://apify.com/topapi/google-maps-reviews-scraper) - reviews of the same restaurants on Google Maps
- [Yelp Reviews Scraper](https://apify.com/topapi/yelp-reviews-scraper) - Yelp ratings, owner replies and photos
- [Google Maps Photos Scraper](https://apify.com/topapi/google-maps-photos-scraper) - every photo and video of a place on Google Maps

# Actor input Schema

## `locations` (type: `array`):

Where Uber Eats should deliver: a street address, a postcode or a city, e.g. "Times Square, New York", "10 Downing Street, London", "75008 Paris". Each one lists the stores Uber Eats shows for that address (about 300 for one point; use City-wide coverage below for a whole city).

## `coordinates` (type: `array`):

Delivery points as "latitude,longitude", e.g. "40.7580,-73.9855". Works in every country without an address look-up.

## `searchQueries` (type: `array`):

What you would type in Uber Eats' search box, e.g. "pizza", "sushi", "pharmacy", "McDonald's". Each term runs at each address. Empty = every store Uber Eats lists at the address.

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

Store links (any country, e.g. https://www.ubereats.com/gb/store/...), store ids, or listing links: /search?q=…\&pl=…, /feed?pl=…, /city/<city>, /category/<city>/<dish>. A /brand/ or /near-me/ link needs an address in "Delivery addresses". Store links are always read in full.

## `sitemapCountries` (type: `array`):

Two-letter country codes, e.g. "GB", "JP". The actor lists store links from Uber Eats' own store sitemaps (no address needed) and reads up to "Max stores in total". Uber Eats lists about 11,000 US and 2,500 GB stores per sitemap file.

## `country` (type: `string`):

Two-letter code of the country your addresses are in, e.g. "GB". Uber Eats' address search prefers places in the caller's own country, so set this for addresses outside the US; the actor then keeps only places in that country.

## `includeDetails` (type: `boolean`):

On: each store row carries its store page - phone, full address, opening hours, the full menu with prices, reviews, chain, price level and the EU trader block ($0.0009 store + $0.0009 details). Off: the listing row only - name, link, rating, review count, delivery time and fee, offers, coordinates, photo ($0.0009). Filters on phone, cuisine, price level, open status, email, chain or onboarding date need the store page, so they turn details on.

## `includeMenu` (type: `boolean`):

Nest every menu section and item (price, description, photo, sold out, calories, like %, offers) in the store row. Included in the details price.

## `includeReviews` (type: `boolean`):

Nest the reviews Uber Eats shows on the store (up to ~100 per store: text, first name, date). Included in the details price.

## `maxReviewsPerStore` (type: `integer`):

0 = every review Uber Eats shows on the store.

## `reviewsSince` (type: `string`):

Only reviews posted on or after this date (YYYY-MM-DD).

## `includeItemOptions` (type: `boolean`):

Fetch each customisable item's option groups (sizes, toppings, sides with their extra prices, min/max choices) and nutrition. One extra request per customisable item; $0.0027 per store that gets at least one option group.

## `maxItemOptionsPerStore` (type: `integer`):

0 = every customisable item. Caps the option requests (and the run time) on very large menus.

## `groceryCatalog` (type: `boolean`):

For grocery, convenience, alcohol, pharmacy and retail stores: walk every aisle for the whole catalogue (thousands of products) instead of the storefront shelves. Included in the details price.

## `maxItemsPerStore` (type: `integer`):

0 = every item. Keeps rows small for very large catalogues.

## `outputFormat` (type: `string`):

Stores: one row per store with its menu and reviews nested. Menu items: one row per menu item (store fields on each). Reviews: one row per review. The price is per store in every format.

## `compact` (type: `boolean`):

Only the key columns (id, name, link, type, phone, address, coordinates, cuisines, price level, rating, delivery time and fee, open, item count, currency, emails) - for spreadsheets.

## `maxResults` (type: `integer`):

Stores to deliver for each address x search term (the main cost control). 0 = every store Uber Eats lists there.

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

Hard cap on stores delivered in the run (all addresses, searches and links together). Empty = no total cap.

## `coverage` (type: `string`):

One point: the stores Uber Eats shows at the address (about 300). City-wide: a grid of points around the address, merged and de-duplicated, for a whole city.

## `radiusKm` (type: `number`):

Radius of the grid around the address when Coverage is City-wide.

## `gridSpacingKm` (type: `number`):

Distance between grid points; 3 km keeps every store in reach of a point.

## `maxFeedPages` (type: `integer`):

Uber Eats lists 80 stores a page; one point ends after about 4 pages.

## `storeType` (type: `array`):

Only these kinds of store. With a search term Uber Eats filters itself; without one the store page is read to tell.

## `diningMode` (type: `string`):

Pickup lists the stores that offer pickup at the address.

## `sortBy` (type: `string`):

Uber Eats' own orders.

## `minRating` (type: `number`):

e.g. 4.5. Uber Eats filters at 3, 3.5, 4, 4.5 and 5; the exact value is checked again on each store.

## `offersOnly` (type: `boolean`):

Only stores running a deal (BOGO, $ off, free delivery…).

## `topEatsOnly` (type: `boolean`):

Uber Eats' "Top Eats" badge.

## `maxDeliveryMinutes` (type: `integer`):

e.g. 30. Stores whose delivery estimate ends above it are skipped.

## `maxDeliveryFee` (type: `number`):

In the local currency, e.g. 2.99. Stores showing a higher fee are skipped (stores that show no fee are kept).

## `priceBuckets` (type: `array`):

e.g. "$", "$$". Uber Eats leaves the level blank on many stores; those are skipped when this is set.

## `cuisines` (type: `array`):

Keep stores whose cuisine or category contains one of these words, e.g. "pizza", "thai", "vegan".

## `openOnly` (type: `boolean`):

Only stores open at run time.

## `withPhoneOnly` (type: `boolean`):

Only stores that list a phone number.

## `withEmailOnly` (type: `boolean`):

Only stores whose EU trader block lists an email (EU countries).

## `excludeChains` (type: `boolean`):

Skip stores that belong to a chain (Uber Eats' parent chain).

## `newStoresOnly` (type: `boolean`):

Only stores Uber Eats badges as New.

## `onboardedSince` (type: `string`):

Only stores whose Uber Eats onboarding status changed on or after this date (YYYY-MM-DD).

## `excludeStoreIds` (type: `array`):

Store ids or links to skip (in every mode).

## `monitorMode` (type: `boolean`):

Deliver only stores that no earlier monitor run delivered (remembered in the named store below). Run it on a schedule: a run that finds nothing new bills nothing.

## `monitorChanges` (type: `boolean`):

With monitor mode: also deliver stores whose rating, menu (prices, items, sold out), price level or phone changed, with the previous values and the changed fields.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers delivered stores. Use one name per schedule.

## `language` (type: `string`):

English: Uber Eats' English site in every country. Local: the country's own language (menus and reviews as the store wrote them).

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

Requests in flight at once.

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

Retries of a request that timed out or failed.

## `proxyConfiguration` (type: `object`):

Default: the container's own IP, then Apify datacenter proxy, then residential (store pages only) if Uber Eats refuses the one before. Give your own proxy to use only that.

## Actor input object example

```json
{
  "locations": [
    "Times Square, New York"
  ],
  "includeDetails": true,
  "includeMenu": true,
  "includeReviews": true,
  "maxReviewsPerStore": 0,
  "includeItemOptions": false,
  "maxItemOptionsPerStore": 0,
  "groceryCatalog": false,
  "maxItemsPerStore": 0,
  "outputFormat": "stores",
  "compact": false,
  "maxResults": 10,
  "coverage": "point",
  "radiusKm": 6,
  "gridSpacingKm": 3,
  "maxFeedPages": 25,
  "diningMode": "DELIVERY",
  "sortBy": "recommended",
  "offersOnly": false,
  "topEatsOnly": false,
  "openOnly": false,
  "withPhoneOnly": false,
  "withEmailOnly": false,
  "excludeChains": false,
  "newStoresOnly": false,
  "monitorMode": false,
  "monitorChanges": false,
  "monitorStoreName": "uber-eats-monitor",
  "language": "en",
  "maxConcurrency": 6,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One item per store (menu and reviews nested), or one per menu item / review in those output formats.

## `summary` (type: `string`):

Per-search counts (resolved address, pages, stores listed, delivered, filtered), not-found inputs, the egress used, charges.

# 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 = {
    "locations": [
        "Times Square, New York"
    ],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "locations": ["Times Square, New York"],
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "locations": [
    "Times Square, New York"
  ],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call topapi/uber-eats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/uber-eats-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/G0dSYHjVI9O3mMKKP/builds/T0wnp6R8lesqlkzXc/openapi.json
