Uber Eats Scraper [Only $2/1K💰] | Menus | Restaurant Data avatar

Uber Eats Scraper [Only $2/1K💰] | Menus | Restaurant Data

Pricing

from $1.90 / 1,000 restaurants

Go to Apify Store
Uber Eats Scraper [Only $2/1K💰] | Menus | Restaurant Data

Uber Eats Scraper [Only $2/1K💰] | Menus | Restaurant Data

Scrape Uber Eats restaurant data — full menus with prices, ratings, cuisines, hours and delivery info via Uber's internal JSON API. No browser, no API key. $0.002/restaurant.

Pricing

from $1.90 / 1,000 restaurants

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

17 days ago

Last modified

Categories

Share

Uber Eats Scraper

Scrape Uber Eats restaurant data — full menus with prices, restaurant details, cuisines, ratings, delivery info, opening hours and review samples — by calling Uber Eats' own internal JSON API directly. No browser, no DOM scraping. Built for restaurant groups, ghost kitchens, food-delivery aggregators, hospitality VCs and menu price-monitoring teams.

$0.002 per restaurant — the cheapest verified Uber Eats scraper on the Apify Store — with menu items billed at $0.00005 and reviews at $0.00005.

Main Use Cases

  • Restaurant lead generation — structured restaurant lists with phone, address, hours, cuisine and ratings per city
  • Menu price monitoring — track item prices across competitors and over time, per location and dining mode
  • Food delivery market research — cuisines, price buckets, ratings, delivery fees and ETAs across markets
  • Ghost kitchen / hospitality data — identify restaurant chains, parent chains and store types (including grocery and alcohol)
  • Competitor restaurant analysis — compare ratings, menu coverage, item counts and price levels

How It Works

Uber Eats' web app does not server-render its data — the Next.js front end hydrates from a private JSON API. This actor calls those endpoints directly (getFeedV1 for restaurant search/browse, getStoreV1 for restaurant + full menu in one response), using Crawlee's CheerioCrawler with a browser TLS/HTTP2 fingerprint that clears Cloudflare's managed challenge. No browser is launched, which makes runs dramatically cheaper and faster than browser-based alternatives. The proxy is enabled by default to rotate egress IPs, since sustained runs from one datacenter IP earn a bare HTTP 403 once Uber decides the IP is hot.

Build Restaurant Databases Without an Official API

Uber's official Uber Eats API requires partnership approval. This actor reads the same endpoints the website uses — no approval, no API key. Output is delivered as three separate datasets (restaurants, menu items, reviews), each billed under its own event, so you only pay for the data you actually consume.

Extract Full Restaurant Menus With Prices

With includeMenu: true (default), every restaurant is expanded into menuSections and menuItems — name, description, price (integer minor units, e.g. 1299 = $12.99), image, availability status and customizations flag. Items are deduplicated by UUID (Uber repeats the same item across promotional carousels), and every other section an item appeared in is kept in alsoInSections. A per-store analytics rollup reports price/image/description coverage plus min/max/average price.

Input

FieldTypeRequiredDefaultNotes
addressstringNoNew York, NYFree-text place to search, e.g. Chicago, IL, Berlin. Geocoded via Open-Meteo. Ignored when latitude + longitude are supplied
latitude / longitudenumberNo–Supply both to skip geocoding
addressCountrystringNousTwo-letter country code to disambiguate the geocoded address
searchQuerystringNo""Single keyword search, e.g. sushi. Empty = plain location feed
searchQueriesarrayNo[]Several keyword searches in one run. Takes precedence over searchQuery
startUrlsarrayNo[]Direct store URLs, e.g. https://www.ubereats.com/store/.... When set, search inputs are ignored
excludeStoresarrayNo[]Store UUIDs/URLs to skip even if they appear in results
storeTypestringNo""Restrict the feed, e.g. uber_eats, grocery, alcohol
maxItemsintegerNo20Hard cap on restaurants. Free users capped at 10
includeMenubooleanNotrueExpand each restaurant into menuSections/menuItems + per-store analytics
maxMenuItemsPerStoreintegerNo250Cap on menu items kept per restaurant
maxFeedPagesintegerNo1Feed pages per query (~80 restaurants each); Uber caps a location feed at 500
includeReviewsbooleanNotrueCollect the public review sample into a separate reviews dataset
maxReviewsintegerNo0Cap on reviews per restaurant (0 = no cap), applied after reviewsSince
reviewsSincestringNo""Only reviews with createdAt >= this ISO date — cheap incremental scheduled runs
localestringNousUber Eats locale code, e.g. us, gb, de, fr, au, ca
diningModestringNoDELIVERYDELIVERY or PICKUP — controls ETA/fee context
maxConcurrency / minConcurrencyintegerNo4 / 1Autoscaled parallelism range
maxRequestRetriesintegerNo3Retries before a store is skipped
proxyobjectNoonApify proxy picker — on by default (see anti-bot notes)

Output — Three Datasets

Each row is as small as its own grain; runs never pile up in a shared store (every run writes its own fresh instance of all three).

DatasetGrainBilled asPrice
restaurants (default)1 row per restaurantapify-default-dataset-item$0.002
menuItems1 row per distinct menu itemmenu-items$0.00005
reviews1 row per reviewreviews$0.00005

Restaurant row (lean — menus and reviews are counted, not nested)

Identity: storeUuid, storeId, shopId, shopName, name, title, storeSlug, url, originalUrl, restaurantUrl, source (search|browse|startUrl), sourceQuery, citySlug, locale, currencyCode Location: latitude, longitude, geo, address (schema.org PostalAddress), addressText, locationType, distanceText Classification: cuisineList, categories, priceBucket, merchantType Rating: ratingValue, reviewCount, ratingCountExact, ratingAccessibilityText Delivery: isOpen, isOrderable, deliveryFeeText, serviceFeeText, etaRange, etaMinutes, isDeliveryAvailable, isPickupAvailable, supportedDiningModes, promotion Store detail: phoneNumber, workingHoursTagline, image, heroImageUrls, hours, parentChain Counts & derived: hasMenu, menuItemCount, menuSectionCount, catalogItemCount, reviewCountReturned, itemCustomizationsEnabled, customizationItemsCount, faqCount, analytics, scrapedAt

itemUuid, name, description, priceDecimal ("12.99"), priceFormatted ("$12.99"), currency, imageUrl, hasImage, isSoldOut, isAvailable, availabilityState, hasCustomizations, section, sectionUuid, subsection, subsectionUuid, alsoInSections, endorsementRating, endorsementNumRatings + denormalized storeUuid, storeName, storeUrl, runId, scrapedAt

Review row

reviewUuid (Uber's stable contentUUID — dedup key across runs), text, author, createdAt, formattedDate, timeSinceReview, source, rating + denormalized store aggregates and runId, scrapedAt

Honest limitations (confirmed, not guessed): reviews are a sample (often 1–3, up to ~28 on busy US stores) — not the reviewCount total, and there is no paginated review feed. There is no per-review star rating (Uber publishes only store-level aggregates), so rating is usually null. deliveryFeeText is often null because the real fee requires a cart round-trip.

Collect Food Delivery Market Data — Example Input

{
"address": "Chicago, IL",
"searchQuery": "sushi",
"maxItems": 20,
"includeMenu": true,
"includeReviews": true,
"locale": "us"
}

Minimal run (restaurants only, cheapest):

{
"address": "Berlin",
"maxItems": 50,
"includeMenu": false,
"includeReviews": false
}

Example Output — Restaurant Row

{
"storeUuid": "657c9027-28b4-5d3b-a4f9-16425d8bc99b",
"name": "Tarallucci e Vino Union Square",
"source": "search",
"citySlug": "new-york",
"currencyCode": "USD",
"address": { "@type": "PostalAddress", "streetAddress": "15 E 18th St", "addressLocality": "New York", "addressRegion": "NY", "postalCode": "10003", "addressCountry": "US" },
"cuisineList": ["Breakfast and Brunch", "Italian", "Comfort Food"],
"ratingValue": 4.8,
"reviewCount": "33",
"etaRange": "21-38 Min",
"phoneNumber": "+12122285400",
"menuItemCount": 55,
"catalogItemCount": 61,
"analytics": { "totalItems": 55, "itemsWithPrice": 55, "priceCoverage": 100, "minPrice": 325, "maxPrice": 3100, "averagePrice": 1273.91 }
}

Integrations & Automation

  • API — run and fetch via the Apify REST API, or call it from AI agents through the Apify MCP server
  • Scheduling — daily/weekly runs per city for menu price monitoring and market research
  • Incremental reviews — set reviewsSince to last run's date so scheduled runs only collect new reviews and you are never re-charged for data you already have
  • Webhooks — push each finished run's datasets to your warehouse or BI tool
  • Export — JSON, CSV, Excel, XML, HTML per dataset

Recommended schedule: weekly per city for market research; daily with reviewsSince for review monitoring; daily for price monitoring on a fixed location.

FAQ

Why use this actor instead of the official Uber Eats API?

There is no public Uber Eats API — the official integration requires partner approval. This actor calls Uber's own internal www JSON endpoints (getFeedV1, getStoreV1) with a TLS fingerprint that passes Cloudflare's managed challenge, so it needs no API key, no browser and no paid anti-bot service.

What are alternatives to this actor for Uber Eats food delivery data?

Store alternatives for restaurant data: borderline/uber-eats-scraper-ppr ($0.005/restaurant — 2.5x our price), natanielsantos/uber-eats-scraper ($0.004/store), datacach ($0.00499), jdtpnjtp ($0.0022 listing + $0.007 full detail). Ours is the cheapest per restaurant at $0.002 with menu items billed 5-10x cheaper than any competitor.

How can I scrape Uber Eats menus and prices?

Runs use getStoreV1 — one POST returns the restaurant record and its entire menu. Set includeMenu: true, point the actor at an address (or pass startUrls), and each restaurant row plus its menuItems dataset rows are produced in one pass.

Uber Eats vs DoorDash for restaurant market research?

This actor covers Uber Eats only. For food delivery market research across platforms, pair it with a DoorDash scraper — this actor's per-restaurant price keeps multi-city research affordable.

Why did my run return zero restaurants?

Usually one of: the proxy was disabled and Uber 403'd the datacenter IP (re-enable the default proxy), or Accept-Language/Content-Type headers were missing on feed paging. The actor reports Cloudflare challenges explicitly rather than failing silently.

How much does it cost?

$0.002 per restaurant, $0.00005 per menu item, $0.00005 per review, $0.0005 actor start. Turning off includeMenu/includeReviews bills nothing for that data. maxTotalChargeUsd is respected — the run stops crawling once the budget is spent.

For AI Agents & LLM Apps

  • Purpose: given an address (or store URLs) returns one row per Uber Eats restaurant with ratings, cuisines, hours, phone, delivery ETA/fees, plus optional full menus (1 row per menu item) and a review sample (1 row per review) in separate datasets.
  • Minimal working input:
{ "address": "Chicago, IL", "maxItems": 5, "includeMenu": false, "includeReviews": false }
  • Variant inputs: direct stores — { "startUrls": ["https://www.ubereats.com/store/jessies-breakfast/UAVHGNSBQCeqhKzEtis3SQ"] }; menus — { "address": "Berlin", "includeMenu": true, "includeReviews": false }; incremental reviews — add "reviewsSince": "2026-01-01".
  • Output fields — restaurants: storeUuid, name, shopName, url, address, geo, cuisineList, priceBucket, ratingValue, reviewCount, etaRange, deliveryFeeText, phoneNumber, hours, parentChain, menuItemCount, analytics, source (+ many more). menuItems: itemUuid, name, description, priceDecimal, priceFormatted, currency, imageUrl, isSoldOut, section, alsoInSections. reviews: reviewUuid, text, author, createdAt, rating.
  • Behaviors an agent should know: startUrls overrides all search inputs. searchQueries takes precedence over searchQuery; both are capped by maxItems in total. includeMenu/includeReviews are on by default — turn them off if you only need restaurant rows (they add billed rows to separate datasets). Prices are integer minor units in price and analytics.* (divide by 100); use priceDecimal/priceFormatted for display. reviewsSince only keeps reviews newer than the date — set it on scheduled runs to avoid re-billing. maxItems caps restaurants only, not menu/review rows. The proxy input is on by default and its traffic is billed separately by Apify — disabling it risks empty runs from datacenter IPs.
  • Billing: pay-per-event — $0.002/restaurant, $0.00005/menu item, $0.00005/review, $0.0005 start; only rows actually stored are billed.

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Uber, Uber Eats, or any of their affiliates. It accesses only publicly available data through the same endpoints Uber Eats' website uses; it does not bypass login walls or access private account data. You are responsible for complying with Uber's Terms of Service and applicable law, including data-protection rules (e.g. GDPR, CCPA) if you process restaurant or review data of identifiable persons, and you must not use any personal contact data for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, GDPR, TCPA).

SEO Keywords

uber eats scraper, restaurant menu data, uber eats menu scraper, food delivery market research, restaurant lead generation, menu price monitoring, ghost kitchen data, restaurant ratings data, delivery fee data, uber eats api alternative, restaurant reviews data, food delivery aggregator data, hospitality market research, restaurant price tracking, competitor restaurant analysis, uber eats store data, cuisine list data, restaurant opening hours data, restaurant discovery api, uber eats pickup delivery data