Uber Eats Scraper
Pricing
from $4.00 / 1,000 restaurant scrapeds
Uber Eats Scraper
Scrape Uber Eats restaurants and full menus by location or store URL. HTTP-only, no login, MCP-ready.
Pricing
from $4.00 / 1,000 restaurant scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
Uber Eats Scraper is an Apify Actor for restaurant and menu data from Uber Eats. It accepts either a location search or Uber Eats store URLs, and it returns one record per restaurant or store menu. In location mode, each record can include fields such as name, rating, review count, ETA, delivery fee, menu item count, city name, store URL, image URL, store UUID, and scraped time. In store-URL mode, each input URL returns one complete menu record with sections, items, prices, and descriptions. The Actor is usable through Apify MCP and is built for HTTP-only extraction with no login.
Best fit and connected workflows
This Actor fits workflows that need public Uber Eats restaurant data in a structured form:
- Location-based restaurant discovery for a city, address, or precise delivery point.
- Store-by-store menu extraction from known Uber Eats URLs.
- Lead lists for restaurant-tech, POS, and delivery-oriented research.
- Cataloging restaurant coverage, ratings, fees, and menu size across markets.
- AI agent workflows through Apify MCP, where a tool call returns clean JSON for downstream analysis.
A location search is a natural starting point when you need restaurant cards for a market. A store URL is the direct route when you already have the restaurant page and want the full menu.
Practical scenario
Maya, a product manager at a local food-tech company, starts with Chicago, IL and the keyword pizza. The Actor returns restaurant records with fields like name, rating, reviewCount, etaText, deliveryFeeText, storeUrl, and menuItemCount. Maya uses the rating, fee, and menu size fields to shortlist a few restaurants, then opens the store URLs to review menu structure and item pricing for her next outreach list.
Focused standalone workflow
This Actor is designed as a focused standalone workflow.
Input
| Field | Type | Purpose | Example |
|---|---|---|---|
location | string | Free-text address or city for Uber Eats restaurant search. It is geocoded automatically. | Chicago, IL |
locationLatLng | string | Exact latitude,longitude pair that overrides geocoding. | 40.758,-73.9855 |
startUrls | array | Uber Eats store URLs for full menu extraction. | ["https://www.ubereats.com/store/duane-reade-158-w-45th-st/3aRdtSxMQI-rBbPFn6miNQ"] |
searchQuery | string | Search keyword such as a cuisine, dish, or brand. | pizza |
enrichMenus | boolean | Fetch full menus for restaurants returned from the location feed. | true |
maxRestaurants | integer | Maximum restaurant records from the location feed. | 50 |
maxMenusToScrape | integer | Maximum menus to enrich when enrichMenus is enabled. | 10 |
diningMode | string | Returns delivery or pickup availability and pricing. | DELIVERY |
localeCode | string | Uber Eats locale code used by the API. | en-GB |
proxyConfiguration | object | Proxy settings for the run. | Residential proxy settings |
Focused JSON input example
{"location": "Chicago, IL","searchQuery": "pizza","enrichMenus": true,"maxRestaurants": 25,"maxMenusToScrape": 5,"diningMode": "DELIVERY","localeCode": "en-US"}
Output
The dataset overview view is centered on restaurant cards and enriched menus. The live dataset contract exposes these fields in the table view.
| Field | Type | Meaning |
|---|---|---|
name | string | Restaurant name |
rating | number | Average star rating |
reviewCount | number | Review count |
priceBucket | string | Price tier |
etaText | string | ETA text shown by Uber Eats |
deliveryFeeText | string | Delivery fee text shown by Uber Eats |
menuItemCount | number | Number of menu items returned |
cityName | string | City name |
storeUrl | string | Canonical Uber Eats store URL |
imageUrl | string | Restaurant image URL |
storeUuid | string | Stable Uber Eats store ID |
scrapedAt | string | Scrape timestamp |
Illustrative JSON record
{"name": "Example Sushi","rating": 4.7,"reviewCount": 1280,"priceBucket": "$$","etaText": "15 min","deliveryFeeText": "$0.99 delivery fee","menuItemCount": 42,"cityName": "Chicago","storeUrl": "https://www.ubereats.com/store/example-sushi/store-id","imageUrl": "https://d2s9..../image.jpg","storeUuid": "example-store-uuid","scrapedAt": "2026-01-01T12:00:00.000Z"}
How it works
This Actor uses Uber Eats HTTP endpoints directly, including getFeedV1 for location-based restaurant feeds and getStoreV1 for store menus. Free-text locations are geocoded with OpenStreetMap Nominatim, and exact coordinates can be supplied through locationLatLng. The default proxy setup uses Apify Residential proxies in the US, which aligns with the live contract for this Actor. The build is based on the js-crawlee-cheerio template.
Pricing
This Actor uses Pay per event pricing, plus Apify platform usage. The charged events in the live contract are:
- Actor start
- Restaurant scraped
- Menu scraped
Each location-search restaurant card generates a Restaurant scraped event, and each full menu fetch generates a Menu scraped event. For example, a run that returns twenty restaurants and enriches five menus produces twenty restaurant events and five menu events, plus the start event. For the current event pricing and Apify platform usage details, use the live Pricing tab in the Apify Console.
Use with AI agents (MCP)
This Actor is available through Apify MCP as a tool-backed Apify Actor. The exact Actor identity is khadinakbar/uber-eats-scraper.
Tool use is a good fit when an agent needs a single structured call that returns Uber Eats restaurant cards or full menus. The input can be a location, a precise coordinate pair, or a list of store URLs. The output is dataset-backed, so downstream tools can read clean JSON from the dataset endpoint.
Search Uber Eats in Chicago with the keyword "pizza", return up to 10 restaurants, and enrich the top 3 menus so I can compare ratings, delivery fees, and menu size.
Output interpretation:
name,rating, andreviewCounthelp identify the store.etaTextanddeliveryFeeTextdescribe availability and pricing shown by Uber Eats.storeUrlandstoreUuidsupport follow-up lookups.menuItemCountindicates how much menu content was returned.scrapedAthelps track when the record was collected.
Provenance and scope:
- Records come from public Uber Eats restaurant and store pages.
- The Actor covers location feeds and store menus.
- In store-URL mode, each URL returns one record with the full menu.
- In location mode, restaurant cards come from the search feed, and menu enrichment adds store-menu records.
Pagination and cost guidance:
maxRestaurantscaps the number of restaurant records pulled from a location feed.maxMenusToScrapecaps how many menus are enriched when that option is enabled.- Store-URL mode returns one record per input URL.
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const actorRun = await client.actor('khadinakbar/uber-eats-scraper').call({location: 'Austin, TX',searchQuery: 'sushi',maxRestaurants: 10,});const datasetId = actorRun.defaultDatasetId;const { items } = await client.dataset(datasetId).listItems({ clean: true });console.log(items);
Best results and outcome guidance
Use a city or address when you want the live nearby restaurant feed. Use locationLatLng when you need a precise delivery point. Use startUrls when you already have the store page and want the full menu. Keep maxRestaurants and maxMenusToScrape aligned with the size of the workflow you want to run. When comparing markets, the combination of rating, reviewCount, deliveryFeeText, and menuItemCount gives a practical first pass.
Design note
I found that the live dataset overview view exposes a compact record shape centered on name, rating, reviewCount, priceBucket, etaText, deliveryFeeText, menuItemCount, cityName, storeUrl, imageUrl, storeUuid, and scrapedAt, which makes the Actor easy to read in table form and easy to pass into downstream tooling.
FAQ
When should I use location versus startUrls?
Use location for restaurant discovery around a city or address. Use startUrls for direct menu extraction from known Uber Eats store pages.
What happens when I need a narrower area?
Use locationLatLng for an exact coordinate target, which overrides geocoding from the free-text location field.
Can I search by cuisine or brand?
Yes. searchQuery accepts keywords such as cuisine, dish, or brand and runs Uber's relevance search near the selected location.
How can I keep a run smaller?
Reduce maxRestaurants for location searches and maxMenusToScrape when menu enrichment is enabled.
Does this Actor work with MCP clients?
Yes. It is described as MCP-ready and can be used through Apify MCP with the Actor identity khadinakbar/uber-eats-scraper.
Responsible use
This Actor collects publicly available Uber Eats restaurant and menu information. Use the results in ways that align with Uber Eats terms, applicable laws, and data-protection obligations. Review the live Pricing tab before running larger jobs so the selected input size matches your intended usage.