Zomato Scraper [Only $1.9💰] | Restaurants | Menus | Ratings
Pricing
from $1.80 / 1,000 restaurants
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
Maintained by CommunityActor 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:
| Data | Request |
|---|---|
| Listing and search pages (city, cuisine, locality, delivery) | GET https://www.zomato.com/webroutes/getPage?page_url=/mumbai/restaurants |
| Extra result pages | POST on the search endpoint, which paginates about 12 restaurants per call and is the fastest way to reach volume. |
| Restaurant detail | Detail page JSON for phone, full address, coordinates, city and country. |
| Delivery menu | Delivery 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 instartUrls. - Auto-expand a city listing into its cuisine and locality pages (
expandListings), bounded bymaxListings. - 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
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
cities | array | No | ["mumbai"] | Zomato city slugs (for example mumbai, delhi-ncr, bangalore, pune, hyderabad, dubai). Each expands into its main dining and delivery listings. |
startUrls | array | No | Mumbai restaurants | Zomato listing or restaurant URLs to scrape. Listing pages yield all restaurants on them; restaurant URLs yield a single restaurant. |
maxRestaurants | integer | No | 100 | Maximum restaurants to output per run. Free users are capped at 10. |
maxListings | integer | No | 20 | Maximum listing pages crawled when auto-expanding a city into cuisine and locality pages. |
maxSearchPages | integer | No | 10 | Result pages pulled per listing through the search route (about 12 restaurants per page). |
includeDetails | boolean | No | true | Fetch each restaurant's detail page for phone, full address, coordinates, city and country. |
includeMenu | boolean | No | true | Fetch each restaurant's delivery menu with item names and prices. |
expandListings | boolean | No | true | Discover and crawl cuisine and locality listing pages linked from each city listing. |
maxConcurrency | integer | No | 30 | Parallel requests; the session pool matches it so each request gets its own sticky residential exit IP. |
proxy | object | No | Apify 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.
Related Actors
- easyapi/zomato-restaurant-reviews-scraper
- stealth_mode/zomato-restaurants-search-scraper
- thirdwatch/zomato-scraper
- fatihtahta/zomato-scraper
- memo23/zomato-scraper
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:
citiesandstartUrlsare both honoured; each city expands into its dining and delivery listings unlessexpandListingsis false.maxRestaurantsis capped by the free limit of 10 for non-paying users; set it higher only on a paid account.includeDetailsandincludeMenueach add billed events (restaurant-details,restaurant-menu) and extra requests; set them false for a cheap listing-only run.maxSearchPagescontrols 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.
Legal & Compliance Disclaimer
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.