Zomato Scraper [Only $1.9💰] | Restaurants | Menus | Ratings avatar

Zomato Scraper [Only $1.9💰] | Restaurants | Menus | Ratings

Pricing

from $1.80 / 1,000 restaurants

Go to Apify Store
Zomato Scraper [Only $1.9💰] | Restaurants | Menus | Ratings

Zomato Scraper [Only $1.9💰] | Restaurants | Menus | Ratings

Scrape Zomato restaurants, full menus and delivery data for lead generation and market research: ratings, cuisines, cost for two, phone, address, coordinates and priced menu items.

Pricing

from $1.80 / 1,000 restaurants

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Zomato Scraper

Scrape Zomato restaurant listings, details and menus for restaurant lead generation, POS and fintech sales, and food-market research: restaurant name, phone, address and locality, cuisines, dining and delivery ratings, cost for two, coordinates and priced menu items.

The actor drives Zomato's own internal JSON routes with a plain HTTP crawler (no browser), so pages come back small and fast, and it can expand a single city into its cuisine and locality listings automatically.

Main Use Cases

  • Restaurant lead generation and POS or payments sales prospecting
  • Food-market research and city-level restaurant supply mapping
  • Building structured restaurant databases with phone, address and coordinates
  • Menu and price monitoring for delivery and dine-in offerings
  • Competitor analysis of ratings, cuisines and cost for two
  • Aggregator and delivery-ops intelligence (open listings, localities, ratings)

How It Works

Zomato's frontend calls a small internal JSON API for every page. The actor drives that API directly with a Cheerio crawler, no browser:

DataRequest
Listing and search pages (city, cuisine, locality, delivery)GET https://www.zomato.com/webroutes/getPage?page_url=/mumbai/restaurants
Extra result pagesPOST on the search endpoint, which paginates about 12 restaurants per call and is the fastest way to reach volume.
Restaurant detailDetail page JSON for phone, full address, coordinates, city and country.
Delivery menuDelivery menu JSON for item names and prices.

Zomato blocks datacenter IPs, so the default proxy is Apify residential (India). Listing pages, search pages and detail requests run in parallel, and each restaurant detail and menu adds its own billed event.

Scrape Zomato Restaurants And Menus Without An Official API

The old public Zomato API (the developers.zomato.com v2.1 endpoints used with a user-key) was shut down, and Zomato's current developer platform is a POS and merchant integration program for restaurants operating on Zomato, not a general restaurant-data API. That leaves no self-serve endpoint for restaurant discovery, ratings or menus. This actor reads the same public routes the website calls:

  • Start from city slugs (cities), which expand into the main dining and delivery listings, or from any listing or restaurant URL in startUrls.
  • Auto-expand a city listing into its cuisine and locality pages (expandListings), bounded by maxListings.
  • Pull result pages quickly through the search route (maxSearchPages), about 12 restaurants per page.
  • Enrich each restaurant with details (includeDetails) and its priced delivery menu (includeMenu).

Input Parameters

FieldTypeRequiredDefaultNotes
citiesarrayNo["mumbai"]Zomato city slugs (for example mumbai, delhi-ncr, bangalore, pune, hyderabad, dubai). Each expands into its main dining and delivery listings.
startUrlsarrayNoMumbai restaurantsZomato listing or restaurant URLs to scrape. Listing pages yield all restaurants on them; restaurant URLs yield a single restaurant.
maxRestaurantsintegerNo100Maximum restaurants to output per run. Free users are capped at 10.
maxListingsintegerNo20Maximum listing pages crawled when auto-expanding a city into cuisine and locality pages.
maxSearchPagesintegerNo10Result pages pulled per listing through the search route (about 12 restaurants per page).
includeDetailsbooleanNotrueFetch each restaurant's detail page for phone, full address, coordinates, city and country.
includeMenubooleanNotrueFetch each restaurant's delivery menu with item names and prices.
expandListingsbooleanNotrueDiscover and crawl cuisine and locality listing pages linked from each city listing.
maxConcurrencyintegerNo30Parallel requests; the session pool matches it so each request gets its own sticky residential exit IP.
proxyobjectNoApify residential (India)Zomato blocks datacenter IPs. Turn it off with useApifyProxy false only if you run from a residential IP.

Output Fields

One item per restaurant in the default dataset:

  • resId, name, url, listingUrl: Zomato restaurant ID, name, restaurant URL and the listing page it was found on.
  • cuisines: array of cuisines.
  • diningRating, diningReviews, deliveryRating, deliveryReviews: dining and delivery ratings with their review counts.
  • rating, votes: overall rating and vote count.
  • costForTwo, costForOne: cost for two and cost for one.
  • address, locality: full address and locality.
  • phone: phone number (when details are enabled).
  • latitude, longitude: coordinates (when details are enabled).
  • menu: array of menu items with names and prices (when menus are enabled).
  • menuItemsCount: number of menu items.

Dataset view: overview.

Example Input And Output

Example input:

{
"cities": ["mumbai", "bangalore"],
"maxRestaurants": 200,
"maxListings": 20,
"maxSearchPages": 10,
"includeDetails": true,
"includeMenu": true,
"expandListings": true
}

Example output row:

{
"resId": "18987654",
"name": "Example Kitchen",
"url": "https://www.zomato.com/mumbai/example-kitchen-bandra-west",
"listingUrl": "https://www.zomato.com/mumbai/restaurants",
"cuisines": ["North Indian", "Chinese"],
"diningRating": "4.2",
"diningReviews": 1204,
"deliveryRating": "4.0",
"deliveryReviews": 860,
"rating": "4.1",
"votes": 2064,
"costForTwo": "800",
"costForOne": "400",
"address": "Shop 4, Linking Road, Bandra West, Mumbai",
"locality": "Bandra West",
"phone": "+91 22 4000 0000",
"latitude": 19.0607,
"longitude": 72.8362,
"menu": [
{ "name": "Paneer Butter Masala", "price": "320" },
{ "name": "Garlic Naan", "price": "60" }
],
"menuItemsCount": 42
}

Integrations & Automation

Export results as JSON, CSV or Excel, read them through the Apify API, or push them to a CRM or database with webhooks, Zapier or Make. For lead generation, a weekly schedule keeps a territory fresh; for rating and cost-for-two monitoring, run daily or weekly and keep the same cities so runs are comparable. Recurring runs also help the actor surface better in the Apify Store.

FAQ

Is there an official Zomato API?

No general-purpose one. The old public API (the developers.zomato.com v2.1 endpoints with a user-key) was discontinued and no longer issues keys. Zomato's current developer platform is a POS and merchant integration API for restaurants selling on Zomato, not a data API for restaurant discovery, ratings or menus. For discovery data, reading the public site routes is the practical route.

What are the alternatives to this actor for Zomato data?

Alternatives include other Apify Store actors that focus on Zomato reviews or Zomato search, and general place-data APIs such as Google Places, Yelp Fusion or Foursquare, which give broad place data but not Zomato menus or Zomato cost-for-two. This actor returns restaurant details and priced menus from one run.

Do I need residential proxies?

Yes, in practice. Zomato blocks datacenter IPs, so the default configuration uses the Apify residential proxy with an India exit. If you run from a residential IP (for example, locally), you can turn the proxy off.

Why is my restaurant count lower than maxRestaurants?

Two reasons. First, free users are capped at 10 restaurants per run regardless of maxRestaurants. Second, the count is also bounded by how many listing and search pages the run crawls through maxListings and maxSearchPages.

Can I scrape a single restaurant or a specific listing?

Yes. Put the restaurant or listing URL in startUrls. A restaurant URL yields that single restaurant; a listing URL yields every restaurant on the listing.

Does it return menus with prices?

Yes, when includeMenu is true. Menu items are returned in the menu array with names and prices, and the total is in menuItemsCount.

SEO Keywords

zomato scraper, zomato restaurant scraper, scrape zomato, zomato api, zomato menu scraper, zomato menus with prices, zomato data, zomato restaurants, restaurant lead generation, restaurant data india, food delivery data, zomato ratings scraper, restaurant market research, cost for two data, restaurant database india, zomato dubai, zomato location data, restaurant phone number scraper, zomato csv export, restaurant competitor analysis, zomato without api, food delivery aggregator data, zomato listing scraper, restaurant pos lead generation

For AI Agents & LLM Apps

Purpose: return Zomato restaurant rows (ratings, cost for two, address, coordinates) and, optionally, priced delivery menus, for a set of cities or URLs.

Minimal working input:

{ "cities": ["mumbai"] }

Variant for a single listing, details only, no menus:

{ "startUrls": [{ "url": "https://www.zomato.com/mumbai/restaurants/biryani" }], "includeMenu": false }

Output fields: resId, name, url, listingUrl, cuisines, diningRating, diningReviews, deliveryRating, deliveryReviews, rating, votes, costForTwo, costForOne, address, locality, phone, latitude, longitude, menu, menuItemsCount.

Behaviors an agent should know:

  • cities and startUrls are both honoured; each city expands into its dining and delivery listings unless expandListings is false.
  • maxRestaurants is capped by the free limit of 10 for non-paying users; set it higher only on a paid account.
  • includeDetails and includeMenu each add billed events (restaurant-details, restaurant-menu) and extra requests; set them false for a cheap listing-only run.
  • maxSearchPages controls how many result pages are pulled per listing through the fast search route (about 12 restaurants per page); it is the main volume lever.
  • The default proxy is required in practice because Zomato blocks datacenter IPs.

Billing: pay-per-event. apify-actor-start (about $0.00005), one restaurant event per base result (about $0.0019), one restaurant-details per enriched restaurant (about $0.004) and one restaurant-menu per menu (about $0.008), lower at higher loyalty tiers.

This actor is independent and is not affiliated with, endorsed by or sponsored by Zomato Ltd. or Eternal Ltd. It reads only publicly available pages and the public JSON routes the site itself calls: it does not log in, does not bypass authentication, does not solve CAPTCHAs and does not place orders.

Users are responsible for complying with Zomato's Terms of Service and with applicable data-protection law (for example GDPR or CCPA) in their own jurisdiction. Where the output contains restaurant phone numbers or other contact data, that data must not be used for unsolicited commercial outreach in violation of applicable law.