Zomato Scraper — Restaurants, Phones, Ratings & Cuisines
Pricing
from $1.60 / 1,000 results
Zomato Scraper — Restaurants, Phones, Ratings & Cuisines
Zomato scraper: export restaurants from any Indian city with phone numbers, address, coordinates, PIN code, rating, votes, cost for two, cuisines, opening hours, features and popular dishes. Filter by city, cuisine, rating and cost. Up to tens of thousands of rows per city. No login.
Pricing
from $1.60 / 1,000 results
Rating
0.0
(0)
Developer
Logiover
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
Zomato Scraper — Restaurants, Phone Numbers, Ratings, Cuisines & Cost for Two
Not affiliated with, endorsed by or sponsored by Zomato. "Zomato" is a trademark of its owner. This Actor reads pages that Zomato shows to every visitor without a login. You are responsible for using the data lawfully — see Legal and compliance.
Zomato Scraper turns zomato.com into a spreadsheet: pick a city (Mumbai, Delhi NCR, Bangalore, Pune, Hyderabad, Chennai, Kolkata, Dubai and every other Zomato dine-out city), optionally a cuisine, a minimum rating or a cost-for-two band, and get one clean row per restaurant — name, phone numbers, full address, PIN code, GPS coordinates, rating, votes, dining and delivery ratings, cost for two, cuisines, opening hours, features (outdoor seating, Wi-Fi, stags allowed...), payment methods, popular dishes, offers and chain information. It is a Zomato restaurant data scraper, a Zomato API alternative and a restaurant lead generator in one: no login, no cookies, no browser, export to CSV, Excel, JSON or XML, or pull it through the Apify API. One run measured on 29 Oct 2026 returned 12,000 unique restaurants from Mumbai, Delhi NCR and Bangalore with zero duplicates.
Searching for a Zomato data extractor, a Zomato restaurant list in Excel, restaurant phone numbers from Zomato, a Zomato scraper in Python without writing the Python, or the Zomato cost for two by area? This is that. Hindi and Hinglish searches work the same way: ज़ोमैटो रेस्टोरेंट डेटा स्क्रैपर, ज़ोमैटो से रेस्टोरेंट का फ़ोन नंबर और पता निकालें, रेस्टोरेंट की लिस्ट एक्सेल में डाउनलोड करें, "Zomato se restaurant ka data kaise nikale", "Zomato restaurant database India", "restaurant leads Mumbai Delhi Bangalore", "Zomato dine out list with contact number". The Actor handles Zomato's own limit of roughly 500 results per search by itself — it splits a city into cuisine, cost and rating slices and removes duplicates by Zomato's restaurant ID — so a 20,000-restaurant city is one run, not forty manual searches.
Table of contents
- At a glance
- What you get
- Who uses Zomato data and how
- Cookbook: ready-to-run inputs
- How to run it in Apify Console
- How to run it through the API
- Input reference
- Data dictionary
- Real output sample
- Scale and speed
- What you pay
- Integrations
- Performance tips
- Troubleshooting and status messages
- Honest limits
- Zomato Scraper compared with the alternatives
- FAQ
- Glossary
- Legal and compliance
- Changelog
- Support
At a glance
| Source | zomato.com — the public "Dine-out" and "Nightlife" restaurant listings and each restaurant's public page |
| Search by | city (any Zomato city slug or common spelling) · cuisine · minimum rating · cost-for-two band · sort order — or paste any zomato.com listing or restaurant URL |
| One row per | restaurant, de-duplicated by Zomato's numeric restaurant ID |
| Columns | 49 — 25 of them are filled even in list-only mode; the rest (phone, GPS, hours, features...) come from each restaurant's page |
| Phone numbers | the numbers printed on the restaurant's public page, unmasked — 99.2 % of the 12,000 restaurants in the proof run |
| Speed (measured) | 30 restaurants in 9 s (first row after 4.5 s) · 1,000 restaurants with full details in 86 s · 12,000 in 16.9 minutes |
| Depth (measured) | 12,000 unique restaurants in one run, 0 duplicates (29 Oct 2026); Mumbai alone: 20,234 of 21,535 listed (94 %) in 5.4 minutes without details |
| Login, cookies, browser | none |
| Export | JSON, CSV, Excel, XML, HTML, JSONL — or API, webhooks, Google Sheets, Make, Zapier, n8n |
| Price | pay per result: $2.50 per 1,000 restaurants on the Free plan, down to $1.60 per 1,000 on higher Apify plans |
What you get
Every row carries Zomato's stable numeric restaurantId and the restaurant's page URL. The complete column list with types, meanings, measured fill rates and examples is in the Data dictionary.
Identity and location. name, url, city, region (the area band Zomato files the locality under, e.g. South Mumbai, Western Suburbs), locality, localityUrl, the street address exactly as the restaurant page prints it, pincode where Zomato publishes one, and latitude / longitude with up to ten decimals.
Contact. phone (the first number) and phones (all numbers printed on the page, E.164 format with the +91 country code). Numbers are included exactly as Zomato shows them; nothing is masked or hashed.
Reputation. rating (Zomato's aggregate, 1.0–5.0), ratingLabel (Excellent, Very Good, Good, Average, Poor), votes, and the split into diningRating / diningReviews and deliveryRating / deliveryReviews — the delivery figures are often an order of magnitude larger than the dining ones.
Money. costForTwo as a number, costForTwoText as Zomato prints it ("₹1,200 for two"), costForOne where the listing shows it, currency (INR for India, AED for Dubai...), and costNotes such as "₹350 for a pint of beer (approx.)".
Food and ambience. cuisines (list), features (Indoor seating, Wifi, Stags allowed, Valet Parking, Live Music...), paymentMethods, knownFor (Zomato's one-line signature), popularDishes, peopleSay (what reviewers praise), offers (dine-out offers on the page), menuTypes (menu sections and their page counts).
Operations. openingHours as structured blocks (days, hours), openStatusText, currentStatus ("Open now", "Closes in 57 minutes"), and the flags isDeliveryOnly, isDarkKitchen, isTemporarilyClosed, isPermanentlyClosed.
Chain. chainName, chainOutlets (how many outlets Zomato groups under the same chain in that city) and chainUrl.
Search context. searchCategory (dineout / nightlife), isSponsored (the card was a promoted placement in the listing), detailsFetched and scrapedAt.
Anything Zomato does not publish is null — never a placeholder, never a zero standing in for "unknown". Zomato's own "0" PIN code and 0,0 coordinates for restaurants without a location are written as null.
Who uses Zomato data and how
1. B2B sales to restaurants. POS and billing software, kitchen equipment, uniforms, packaging, payment terminals, loyalty apps: filter Mumbai, minRating: 3.5, maxCostForTwo: 1500, and call the phone column. A restaurant with 2,000+ votes is an operating business, not a listing ghost.
2. Food-delivery and aggregator competitors. Benchmark coverage per locality: how many restaurants, which cuisines, what price bands, how many are delivery-only. The deliveryReviews column shows where delivery volume sits.
3. FMCG and beverage distributors. Territory plans for the on-trade: features containing "Serves Alcohol" or "Live Music", costNotes with beer prices, cuisines per area, GPS for route planning.
4. Real-estate and retail site selection. Count cafes and restaurants per locality, compare costForTwo between neighbourhoods, find streets with restaurant clusters from latitude / longitude.
5. Franchise and restaurant founders. Before opening: how many Biryani places are within a 3 km radius, what do they charge, how well are they rated, how many have a chain (chainOutlets).
6. Marketing and PR agencies. Influencer and event outreach lists: new, well-rated restaurants in a city, offers they currently run, knownFor lines for ready-made copy.
7. Tourism and travel startups. Build "best food in Goa / Jaipur / Dubai" guides from rating, votes, popularDishes and peopleSay, with coordinates for maps.
8. Banks and fintech lenders. SME lead lists for merchant loans and POS machines — an active restaurant is visible through votes, currentStatus and isPermanentlyClosed = false.
9. Market researchers and economists. Price-level indices: median costForTwo per city and cuisine, share of unrated restaurants, share of chains, measured on a dated snapshot.
10. Data journalists. Where are the restaurants, which areas have the highest cost for two, how many Zomato listings are permanently closed, how do ratings differ between dining and delivery.
11. Food-tech and AI builders. Train recommendation or "near me" models on cuisines, features, ratings and coordinates; feed a RAG assistant with knownFor, popularDishes and peopleSay.
12. Hotel concierges and event planners. Shortlist by features (private dining, large group seating, valet), cuisines and costForTwo, with phone numbers for booking.
13. Franchise-development and expansion teams of chains. Track competitor outlets: chainName, chainOutlets and their addresses per city, re-run monthly and diff by restaurantId.
14. Delivery-rider and cloud-kitchen operators. Spot isDarkKitchen and isDeliveryOnly clusters per area to place kitchens and hubs.
Cookbook: ready-to-run inputs
Paste any of these into the Input tab (JSON view) or send them through the API. Cities accept common spellings: "Delhi", "Gurgaon" and "Noida" all map to Zomato's Delhi NCR listing; "Bengaluru" maps to Bangalore.
1. The 30-restaurant test (the default prefill; about 9 seconds)
{ "cities": ["Mumbai"], "maxResults": 30 }
2. 1,000 Mumbai restaurants with phone, GPS and hours
{ "cities": ["Mumbai"], "maxResults": 1000 }
3. Every North Indian restaurant in Bangalore rated 4.0 and above
{ "cities": ["Bangalore"], "cuisines": ["North Indian"], "minRating": 4, "maxResults": 5000 }
4. Budget eateries: cost for two up to ₹300 in Delhi NCR
{ "cities": ["Delhi NCR"], "maxCostForTwo": 300, "maxResults": 5000 }
5. Premium dining: cost for two ₹2,000–₹6,000 in Mumbai and Bangalore
{ "cities": ["Mumbai", "Bangalore"], "minCostForTwo": 2000, "maxCostForTwo": 6000, "minRating": 4, "maxResults": 3000 }
6. Fast list-only export without phone numbers (about 5x faster)
{ "cities": ["Mumbai"], "includeDetails": false, "maxResults": 20000 }
7. Several cities in one run — the budget is shared fairly between them
{ "cities": ["Pune", "Hyderabad", "Chennai", "Kolkata", "Ahmedabad"], "maxResults": 10000 }
8. Bars, pubs and clubs (Nightlife listing)
{ "cities": ["Mumbai", "Delhi NCR", "Bangalore"], "category": "nightlife", "maxResults": 3000 }
9. The best-rated restaurants first
{ "cities": ["Hyderabad"], "sortBy": "rating", "maxResults": 500 }
10. Cheapest first, to find street-food and mess-style places
{ "cities": ["Jaipur"], "sortBy": "costLow", "maxResults": 500 }
11. Biryani places across a metro, mid-range
{ "cities": ["Hyderabad"], "cuisines": ["Biryani"], "minCostForTwo": 300, "maxCostForTwo": 1000, "maxResults": 2000 }
12. Several cuisines at once
{ "cities": ["Bangalore"], "cuisines": ["Cafe", "Bakery", "Desserts"], "minRating": 3.5, "maxResults": 3000 }
13. Details for restaurant pages you already have
{ "startUrls": [ { "url": "https://www.zomato.com/mumbai/leopold-cafe-colaba" }, { "url": "https://www.zomato.com/mumbai/lucky-restaurant-since-1938-hill-road-bandra-west" } ] }
14. Start from a Zomato listing URL (a cuisine or area page)
{ "startUrls": [ { "url": "https://www.zomato.com/mumbai/restaurants" } ], "maxResults": 2000 }
15. A city outside India
{ "cities": ["Dubai"], "maxResults": 2000 }
16. Cap the spend: stop at 500 rows whatever the input says
{ "cities": ["Delhi NCR"], "maxResults": 500 }
Also set Max cost per run in the Console's Run options — see What you pay.
How to run it in Apify Console
- Open the Actor and go to the Input tab. The prefilled input (Mumbai, 30 restaurants) is a complete working example.
- Type a city in Cities (press Enter after each name). Add Cuisines, Minimum rating or a cost-for-two range if you want a slice instead of the whole city.
- Set Maximum restaurants. You pay per restaurant saved, so this is also your spending cap; Max cost per run in the run options is a second, hard cap.
- Leave Include phone, coordinates, hours and features switched on for lead lists. Switch it off for a name-rating-cost-cuisine list that runs several times faster.
- Press Start. The first rows appear in the Output tab after a few seconds; the status message shows the final outcome when the run ends.
- Download from the Export menu: JSON, CSV, Excel, XML, HTML or JSONL, with or without selected columns.
How to run it through the API
Start a run and wait for it (replace YOUR_TOKEN; the Actor ID is shown on the Actor page and username~zomato-scraper works as well):
curl -s -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~zomato-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{ "cities": ["Mumbai"], "cuisines": ["Biryani"], "minRating": 4, "maxResults": 200 }'
That call returns the rows directly as JSON (it is limited to about five minutes; use the asynchronous pattern below for big runs). Asynchronous start, then read the dataset when the run has finished:
curl -s -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~zomato-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" -d '{ "cities": ["Delhi NCR"], "maxResults": 5000 }'# -> data.id (run id) and data.defaultDatasetIdcurl -s "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN&format=csv&clean=1" -o delhi.csv
Add &maxTotalChargeUsd=5 to the run URL to cap the cost of that run at five dollars. The dataset can be read while the run is still going, so a downstream job can start consuming rows after the first minute. Every run also writes a SUMMARY record to its key-value store: outcome, counts, timing and the numbers behind the status message.
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
cities | list of text | ["Mumbai"] | City names or Zomato city slugs. "Delhi", "New Delhi", "Gurgaon", "Gurugram", "Noida", "Ghaziabad", "Faridabad" resolve to Delhi NCR; "Bengaluru" to Bangalore; "Bombay" to Mumbai. Any other name is used as Zomato's own slug (the part after zomato.com/), so "Pune", "Hyderabad", "Goa", "Dubai" work as typed. |
startUrls | list of URLs | empty | zomato.com listing pages (city, cuisine, area pages) are crawled like a city; restaurant pages return that restaurant. Can be combined with cities. |
category | dineout / nightlife | dineout | Zomato's Dine-out listing (restaurants, cafes, bakeries, bars...) or the Nightlife listing (bars, pubs, clubs). |
cuisines | list of text | empty | Only restaurants serving a listed cuisine, exactly as Zomato names it: "North Indian", "Chinese", "Biryani", "Cafe", "Pizza", "Street Food"... Names that Zomato does not know are ignored with a warning in the log. |
minRating | number 0–5 | none | Minimum aggregate rating. Unrated (new) restaurants are excluded when this is set. |
minCostForTwo, maxCostForTwo | whole number | none | Cost-for-two band in the city's currency (INR in India). Either side can be left empty. |
sortBy | select | popularity | Order of the result when fewer restaurants are requested than exist: Zomato's popularity order, rating high to low, cost low to high, cost high to low. |
includeDetails | true / false | true | Opens each restaurant's page for phone, address, coordinates, PIN code, hours, features, payment methods, dishes and offers. false gives the listing columns only. |
splitLargeSearches | true / false | true | Zomato shows about 500 restaurants per search. With this on, a request for more than ~500 is split by cuisine, cost and rating automatically. Switch off only to get Zomato's own first ~500 in its own order. |
maxResults | whole number | 1000 | Stop after this many restaurants across all cities. Cities and URLs share it fairly; a city that runs dry hands its unused share to the others. |
maxConcurrency | whole number 1–30 | 24 | Parallel sessions. 24 is tuned; lower it only if you want a gentler run. |
proxyConfiguration | proxy | Apify datacenter proxy | Leave as is. If Zomato refuses datacenter addresses, the Actor switches to a small amount of Indian residential traffic by itself and probes the datacenter route again later. |
Validation: a city or URL that is not a Zomato listing is skipped with a clear message; if none of them is, the run fails with INVALID_INPUT instead of returning an empty dataset that looks like a success.
Data dictionary
All 49 columns, grouped by theme (the CSV header further down shows the exact output order). Filled is the share of the 12,000 rows of the 29 Oct 2026 proof run (Mumbai, Delhi NCR and Bangalore, details on) that carry a value; columns that are conditional by nature say so. "Detail" columns need includeDetails: true.
Identity and location
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
restaurantId | number | 100 % | Zomato's numeric restaurant ID (res_id). Unique per restaurant; the key to de-duplicate on. | 20691585 |
name | text | 100 % | Restaurant name as Zomato shows it. | Butterfly High |
url | text | 100 % | The restaurant's page on zomato.com (absolute URL). | https://www.zomato.com/mumbai/butte… |
city | text | 100 % | City or town on the restaurant page. A Delhi NCR run returns New Delhi, Gurgaon, Noida...; a Mumbai run includes Thane and Navi Mumbai. | Mumbai |
region | text | 99.9 % | Area band above the locality in Zomato's breadcrumbs, e.g. "South Mumbai", "Western Suburbs". Detail. | South Mumbai |
locality | text | 100 % | Neighbourhood and city as Zomato prints it, e.g. "Hill Road, Bandra West, Mumbai". | Lower Parel, Mumbai |
localityUrl | text | 100 % | Zomato's listing page for that locality. | https://www.zomato.com/mumbai/lower… |
address | text | 100 % | Street address as printed on the restaurant page. | Ground Floor, One Lodha Place, 1, S… |
pincode | text | 67.5 % | PIN / postal code where Zomato publishes one (not every restaurant has it). Detail. | 400013 |
latitude | number | 99.9 % | Latitude in decimal degrees from the map position on the page; null when Zomato has no location. Detail. | 19.0018514 |
longitude | number | 99.9 % | Longitude in decimal degrees. Detail. | 72.8282706 |
Contact
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
phone | text | 99.2 % | First public phone number, as the page prints it (Indian numbers with +91). Detail. | +918655973838 |
phones | list | 99.2 % | Every public phone number of the page. Detail. | ["+918655973838", "+918655973839"] |
Reputation
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
rating | number | 90.3 % | Zomato's aggregate rating (1.0–5.0); null for unrated restaurants. | 4.2 |
ratingLabel | text | 90.3 % | Zomato's word for the rating: Excellent, Very Good, Good, Average, Poor. | Very Good |
votes | number | 100 % | Number of ratings behind the aggregate. | 884 |
diningRating | number | 75.2 % | Average of dining-out ratings; null when the restaurant has none. | 4.2 |
diningReviews | number | 100 % | Number of dining ratings. | 884 |
deliveryRating | number | 74.9 % | Average of delivery ratings; null for restaurants without delivery. | 4.3 |
deliveryReviews | number | 100 % | Number of delivery ratings. | 346 |
Money
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
costForTwo | number | 100 % | Zomato's cost-for-two estimate as a number (city currency). | 3000 |
costForTwoText | text | 100 % | The same as Zomato prints it, e.g. "₹1,200 for two". | ₹3,000 for two |
costForOne | number | 100 % | Per-person figure when the listing card shows one. | 1200 |
currency | text | 100 % | ISO code derived from the price symbol: INR, AED... | INR |
costNotes | list | 13.3 % | Extra price notes on the page, e.g. "₹350 for a pint of beer (approx.)". Conditional on the restaurant serving such items. Detail. | ["₹190 for a pint of beer (approx.)"] |
Food and ambience
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
cuisines | list | 99.8 % | Cuisines in Zomato's order. | ["Modern Indian", "Continental"] |
features | list | 99.9 % | Highlights Zomato marks as available: Dinner, Delivery, Indoor seating, Wifi, Stags allowed, Valet Parking... Detail. | ["Dinner", "Lunch"] |
paymentMethods | list | 86.5 % | Accepted payments as listed, e.g. "Cash and Cards accepted". Detail. | ["Digital payments accepted"] |
knownFor | text | 4.7 % | Zomato's one-line signature ("Slow-cooked, home-style Biryani"). Present only for restaurants where Zomato shows it. Detail. | Slow-cooked, home-style Biryani |
popularDishes | list | 22.8 % | Dishes Zomato lists as popular. Conditional. Detail. | ["Paneer Patty Burger", "Patatas Br… |
peopleSay | list | 39.6 % | What reviewers mention most ("Efficient Staff", "Family Place"). Conditional. Detail. | ["Portions", "Customizable Food"] |
offers | list | 42.1 % | Dine-out offers shown on the page ("Instant offer - Flat 10% OFF"); bank and cashback promos are not included. Conditional. Detail. | ["Carnival offer - Flat 10% OFF"] |
menuTypes | list | 93.8 % | Menu sections with their page counts, e.g. "Food (8 pages)". Detail. | ["Food (15 pages)", "Bar (10 pages)"] |
Operations
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
openingHours | list | 98.9 % | Weekly blocks {days, hours}, e.g. {"days":"Mon-Sun","hours":"12noon – 1am"}. Detail. | [{"days": "Mon-Sun", "hours": "12no… |
openStatusText | text | 99.9 % | Hours for the day of the scrape, e.g. "9am – 1am (Today)". | 12noon – 1:30am (Today) |
currentStatus | text | 99.9 % | Status at scrape time: "Open now", "Closed", "Closes in 57 minutes". Time-dependent. Detail. | Open now |
isDeliveryOnly | true / false | 99.9 % | Delivery-only restaurant. Detail. | false |
isDarkKitchen | true / false | 99.9 % | Cloud kitchen without a dining room. Detail. | false |
isTemporarilyClosed | true / false | 99.9 % | Zomato marks the restaurant temporarily closed. Detail. | false |
isPermanentlyClosed | true / false | 99.9 % | Zomato marks the restaurant permanently closed. Detail. | false |
Chain
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
chainName | text | 27.5 % | Chain name when Zomato groups outlets together. Conditional. Detail. | Butterfly High |
chainOutlets | number | 27.5 % | Number of outlets Zomato lists for the chain in that city. Conditional. Detail. | 6 |
chainUrl | text | 27.5 % | Zomato page listing all outlets of the chain. Conditional. Detail. | https://www.zomato.com/mumbai/resta… |
Search context
| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
imageUrl | text | 100 % | Cover image URL. | https://b.zmtcdn.com/data/pictures/… |
shareUrl | text | 99.9 % | Short share link (zoma.to). Detail. | http://zoma.to/r/20691585 |
isSponsored | true / false | 100 % | The restaurant appeared as a promoted card in the listing. | true |
searchCategory | text | 100 % | dineout or nightlife — the listing it came from. | dineout |
detailsFetched | true / false | 100 % | true when the restaurant page was read; false in list-only runs or when a page did not answer. | true |
scrapedAt | text | 100 % | ISO 8601 UTC timestamp of the row. | 2026-10-29T08:40:13.886Z |
Real output sample
Two rows from the 29 Oct 2026 proof run, unmasked, exactly as the Actor wrote them (long lists shortened with …):
Gurukripa — Mumbai
{"restaurantId": 35658,"name": "Gurukripa","url": "https://www.zomato.com/mumbai/gurukripa-powai","city": "Mumbai","region": "Central Mumbai","locality": "Powai, Mumbai","localityUrl": "https://www.zomato.com/mumbai/powai-restaurants","address": "55, Tunga Village, Saki Vihar Road, Opposite Local Office Bus Stop, Powai, Mumbai","pincode": "400076","latitude": 19.1168907726,"longitude": 72.8890661895,"phone": "+919930589247","phones": ["+919930589247","+919930597247","+919930679247"],"rating": 4.6,"ratingLabel": "Excellent","votes": 10412,"diningRating": 4.6,"diningReviews": 10400,"deliveryRating": 4.5,"deliveryReviews": 46200,"costForTwo": 1700,"costForTwoText": "₹1,700 for two","costForOne": 700,"currency": "INR","costNotes": ["₹155 for a pint of beer (approx.)"],"cuisines": ["North Indian","Mughlai","Chinese","Fast Food","Rolls","…"],"openingHours": [{"days": "Mon","hours": "11am – 12midnight"},{"days": "Tue-Sun","hours": "11am – 3am"}],"openStatusText": "11am – 3am (Today)","currentStatus": "Open now","features": ["Lunch","Dinner","Takeaway available","Full bar available","Less noisy","…"],"paymentMethods": ["Cash and Cards accepted","Digital payments accepted"],"knownFor": "Multi cuisine specialities","popularDishes": ["Gadbad Ice Cream","Paneer Pulao","Chicken Ghee Roast","Neer Dosa","Malai Kofta","…"],"peopleSay": ["Rooftop Dining","Happy Hour Offers","Efficient Service","Rooftop Ambience","Gastronomical Experience","…"],"offers": ["Carnival offer - Flat 10% OFF","Instant offer - Flat 10% OFF"],"menuTypes": ["Food (15 pages)","Rules & Regulations (1 page)","Bar (12 pages)","Beverages (2 pages)"],"chainName": "Gurukripa","chainOutlets": 2,"chainUrl": "https://www.zomato.com/mumbai/restaurants/gurukripa","isDeliveryOnly": false,"isDarkKitchen": false,"isTemporarilyClosed": false,"isPermanentlyClosed": false,"imageUrl": "https://b.zmtcdn.com/data/pictures/chains/8/35658/bd53f1fbd527794449a1f1bf9e2578b8_featured_v2.jpg","shareUrl": "http://zoma.to/r/35658","isSponsored": false,"searchCategory": "dineout","detailsFetched": true,"scrapedAt": "2026-10-29T08:40:31.433Z"}
Qla — New Delhi
{"restaurantId": 312781,"name": "Qla","url": "https://www.zomato.com/ncr/qla-mehrauli-new-delhi","city": "New Delhi","region": "South Delhi","locality": "Mehrauli, New Delhi","localityUrl": "https://www.zomato.com/ncr/mehrauli-delhi-restaurants","address": "4-A, Seven Style Mile, Kalka Das Marg, Near Qutab Minar, Mehrauli, New Delhi","pincode": "110030","latitude": 28.5276217,"longitude": 77.18582,"phone": "+918527098766","phones": ["+918527098766","+919995558093"],"rating": 4.4,"ratingLabel": "Very Good","votes": 2824,"diningRating": 4.4,"diningReviews": 2824,"deliveryRating": 4,"deliveryReviews": 28,"costForTwo": 4000,"costForTwoText": "₹4,000 for two","costForOne": 1600,"currency": "INR","costNotes": ["₹375 for a pint of beer (approx.)"],"cuisines": ["European","Italian","Mediterranean","Desserts","Beverages"],"openingHours": [{"days": "Mon-Sun","hours": "12noon – 1am"}],"openStatusText": "12noon – 1am (Today)","currentStatus": "Open now","features": ["Dinner","Lunch","Home delivery","Takeaway available","Wheelchair accessible","…"],"paymentMethods": ["Cash and Cards accepted","Digital payments accepted"],"knownFor": "Luxury outdoor seating","popularDishes": ["Chicken Slider","Wine","Tiramisu","Cocktail","Sangria","…"],"peopleSay": ["Clean Bathrooms","Beautiful Courtyard","Sophisticated","Romantic Place","Valet Service","…"],"offers": ["Carnival offer - Flat 20% OFF","Carnival offer - Flat 10% OFF"],"menuTypes": ["Bar (12 pages)","Food (6 pages)"],"chainName": null,"chainOutlets": null,"chainUrl": null,"isDeliveryOnly": false,"isDarkKitchen": false,"isTemporarilyClosed": false,"isPermanentlyClosed": false,"imageUrl": "https://b.zmtcdn.com/data/pictures/1/312781/4827f038886ea3c34f9e44277dc74ed5_featured_v2.jpg","shareUrl": "http://zoma.to/r/312781","isSponsored": false,"searchCategory": "dineout","detailsFetched": true,"scrapedAt": "2026-10-29T08:46:28.554Z"}
CSV columns (the header row of a CSV export, in this order):
restaurantId,name,url,city,region,locality,localityUrl,address,pincode,latitude,longitude,phone,phones,rating,ratingLabel,votes,diningRating,diningReviews,deliveryRating,deliveryReviews,costForTwo,costForTwoText,costForOne,currency,costNotes,cuisines,openingHours,openStatusText,currentStatus,features,paymentMethods,knownFor,popularDishes,peopleSay,offers,menuTypes,chainName,chainOutlets,chainUrl,isDeliveryOnly,isDarkKitchen,isTemporarilyClosed,isPermanentlyClosed,imageUrl,shareUrl,isSponsored,searchCategory,detailsFetched,scrapedAt
List-type columns (cuisines, phones, features, openingHours...) are written as JSON text inside one CSV cell. In Excel use Power Query (Transform → Parse → JSON); in Google Sheets clean the brackets and use SPLIT; through the API request format=json or format=jsonl, where lists stay real lists.
Scale and speed
All figures below were measured on the Apify platform on 29 Oct 2026 with the shipped defaults (24 parallel sessions, datacenter proxy, 2 GB memory).
| Run | Result |
|---|---|
| Prefill: Mumbai, 30 restaurants with details | 9 s end to end, first row after 4.5 s |
| 1,000 Mumbai restaurants with phone, GPS, hours | 86 s, 1,322 requests, no refused or failed request |
| 12,000 restaurants, Mumbai + Delhi NCR + Bangalore, details on | 16.9 minutes (about 12 restaurants per second), 12,000 unique, 0 duplicates, 11,909 with a phone number |
Mumbai listing only (includeDetails: false) | 20,234 unique restaurants of 21,535 that Zomato listed (94 %) in 5.4 minutes |
What limits the speed. Reading a listing page costs one request for 12 restaurants; reading a restaurant page costs one request per restaurant, so a run with details is roughly 5 times slower than a list-only run — in exchange for the phone number, coordinates and hours. The Actor keeps one connection per session and spreads the work over 24 sessions; Zomato's responses take about one second each.
What the proof dataset looks like. The 12,000 restaurants come from the Mumbai, Delhi NCR and Bangalore listings, a third of the budget each. Cities in the city column: Bangalore (3,995), Mumbai (2,948), New Delhi (2,247), Gurgaon (870), Thane (549), Navi Mumbai (482). Most frequent cuisines: North Indian (37 %), Beverages (35 %), Chinese (35 %), Desserts (27 %), Fast Food (22 %), Biryani (16 %). Median cost for two: ₹700. 10 % of the restaurants are unrated, 27 % belong to a chain, 5 % were promoted placements in the listing. These shares describe this sample, not whole cities: a run that stops at a quota reads Zomato's most popular restaurants first, while the full-city Mumbai listing-only run had 16 % unrated restaurants.
| Zomato listing | Restaurants | With phone | With coordinates | Unrated | Median cost for two (₹) |
|---|---|---|---|---|---|
/mumbai/ | 4,000 | 99.3 % | 100 % | 8.1 % | 700 |
/ncr/ | 4,000 | 99.6 % | 99.9 % | 8.8 % | 850 |
/bangalore/ | 4,000 | 98.9 % | 99.8 % | 12.1 % | 600 |
Why a city is not 100 %. Zomato refuses to page beyond roughly 500 restaurants for any one set of filters. The Actor therefore walks the city through hundreds of filter combinations (by cuisine, then cost band, then rating band, then sort order) and de-duplicates by restaurant ID. A few restaurants stay hidden behind combinations that are still larger than 500 after every split; in the Mumbai listing-only run that was 1,301 restaurants (6 %). More restaurants than the city count are never invented — a run for a small city simply ends earlier with COMPLETED and a message that the listing is exhausted.
Memory. The proof run peaked at 114 MB; the default of 2,048 MB leaves a wide margin.
Which build was measured. The 12,000-restaurant run executed on build 1.0.6, the extraction code that still ships. Builds 1.0.7 and 1.0.8 changed only status messages (restaurants whose own Zomato page answers 404 are no longer counted as read failures, and the maximum-cost message reports the exact number of rows) and this documentation; the prefill, the maximum-cost proof and the checks of the other input modes were repeated on the later builds.
What you pay
Pay per result: $2.50 per 1,000 restaurants on the Free plan, falling with your Apify plan to $1.60 per 1,000 on the highest tier. A restaurant counts once, whether or not details were fetched; you pay for rows saved to the dataset and nothing for pages read, retries, proxy traffic or time.
| Restaurants | Free plan | Highest-tier plan |
|---|---|---|
| 1,000 | $2.50 | $1.60 |
| 10,000 | $25 | $16 |
| 100,000 | $250 | $160 |
Maximum cost per run. Every run has a spending cap: the one you set in the run options (or maxTotalChargeUsd in the API) — when you leave it empty Apify applies a default. The Actor reads the cap before writing rows, trims its last batch to what the cap pays for and ends the run as SUCCEEDED with the message "Saved N restaurants - this run's maximum cost per run covers N results" instead of being aborted. A test with a $0.05 cap saved exactly 22 restaurants and was charged for exactly 22 (29 Oct 2026); how many rows a cap covers depends on your plan's price per result.
Cheap ways to spend less. Use filters instead of downloading a whole city; switch details off when you only need names, ratings and cuisines; set maxResults to what you will really use; run monthly instead of daily — the listing changes slowly.
Integrations
curl — see How to run it through the API.
Node.js (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('YOUR_USERNAME/zomato-scraper').call({cities: ['Bangalore'], cuisines: ['Cafe'], minRating: 4, maxResults: 2000,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length, items[0].name, items[0].phone);
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("YOUR_USERNAME/zomato-scraper").call(run_input={"cities": ["Mumbai"], "maxCostForTwo": 500, "maxResults": 3000})rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())print(len(rows), rows[0]["name"], rows[0]["costForTwo"])
Make, Zapier, n8n. Use the Apify app/node: "Run Actor" with the JSON input above, then "Get dataset items". Trigger on "Actor run finished" to push rows into your CRM, Slack, e-mail or database.
Google Sheets. Use the Apify integration or Apps Script with https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&fields=name,phone,address,rating,costForTwo&token=... and IMPORTDATA. Selecting fields keeps the sheet small.
Airtable and Notion. Map restaurantId to a unique-key column so repeated imports update rows instead of duplicating them.
Webhooks and schedules. In the Console create a Schedule (monthly is enough for a city) and a webhook on "run succeeded" that calls your endpoint with the dataset ID.
MCP and AI agents. The Actor can be called as a tool from any MCP-capable assistant through Apify's MCP server; the input is plain JSON and the output is flat enough to summarise: "which five Biryani places in Hyderabad have the highest rating with more than 1,000 votes?"
Warehouses. Load the JSONL export into BigQuery, Snowflake, ClickHouse or Postgres (jsonb). restaurantId is the primary key; scrapedAt makes snapshot tables easy.
Performance tips
- Filter first. A cuisine or cost band is cheaper than downloading a city and filtering afterwards, and the Actor splits big requests anyway.
- Details off for counting.
includeDetails: falseis the right mode for market sizing, rating and cost statistics: the listing already carries name, rating, votes, dining/delivery ratings, cost for two, cuisines and locality. - Two-pass lead lists. Pass 1 list-only for the whole city; pass 2
startUrlswith the restaurant pages you actually want to call (rating and votes filters in your own sheet). - One big run beats many small ones when you want a whole city: the splitting work is shared and duplicates are removed inside one run.
- Several cities in one run share the cap fairly; run very large cities (Delhi NCR) on their own when you want them complete.
- Use
maxResultsas the main brake and the platform's Max cost per run as the second one. - Keep the default concurrency. 24 sessions ran without a single refused or rate-limited request in every measured run.
Troubleshooting and status messages
Every run ends with one of these outcomes in the status message and in the SUMMARY record.
| Outcome and message | Meaning and what to do |
|---|---|
COMPLETED: Saved N restaurants. | Normal end. |
COMPLETED: Saved N restaurants - this is everything the listing exposes for these settings (the requested M could not be reached). | The filters or the city have fewer restaurants than maxResults. Relax the filters or add cities. |
COMPLETED: Saved N restaurants - this run's maximum cost per run covers N results; raise "Max cost per run" to collect more. | The cap you set was reached; rows are saved and charged exactly. Raise the cap for more. |
COMPLETED: Saved N restaurants; K of them are listed by Zomato but their own page answers "404 - File not found", so those rows carry listing fields only (detailsFetched=false). | Zomato's search still lists a few restaurants whose page no longer exists (11 of 12,000 in the proof run). The rows keep name, rating, cost, cuisines and locality; nothing to fix. |
PARTIAL: Saved N restaurants; the run reached its time limit before M were collected. | The run hit its timeout (default one hour). Rows so far are saved. Split the job (fewer cities per run) or raise the timeout. |
PARTIAL: Saved N restaurants; K detail page(s) could not be read, so those rows carry listing fields only (detailsFetched=false). | A few restaurant pages did not answer; those rows still have name, rating, cost, cuisines and locality. Re-run those restaurants through startUrls. |
PARTIAL: Saved N restaurants before an error stopped the run: ... | An unexpected error after some rows were saved. Re-run; the message carries the cause. |
EMPTY_RESULT: The listing was read but no restaurant matched these filters. Relax the rating, cost or cuisine filters. | Filters are too narrow (for example minRating: 5). |
INVALID_INPUT: None of the cities or URLs is a Zomato restaurant listing. ... | Check the spelling of the city, or paste a zomato.com listing URL. |
BLOCKED: No Zomato page could be fetched (...) | Zomato is refusing the platform's addresses right now. The Actor already tried the residential fallback; retry later. |
FETCH_FAILED: No restaurants collected and N request(s) failed (...) | Network trouble; an empty result cannot be confirmed. Retry. |
In the log you will also see warnings such as Cuisine "x" is not offered in this city - ignored (typo or unknown name; the cuisine filter is dropped) and City "x" is not a Zomato listing (that city is skipped, others continue).
Honest limits
- ~93 % of a big city per run, not 100 %. Zomato lets any one search show about 500 restaurants. The Actor reaches the rest by slicing, but a few hundred restaurants in the largest cities stay behind combinations that remain larger than 500 after every split (Mumbai listing-only run: 20,234 of 21,535).
- Dine-out and Nightlife listings only. Delivery-only brands that Zomato lists solely in its delivery universe (location-bound and small) are not enumerated; restaurants that offer delivery and dining are included, and
deliveryRating/deliveryReviewsare filled for them. - No review texts and no dish-by-dish menu in this version. Zomato asks for a login beyond the first five pages of a restaurant's reviews, and a full menu is hundreds of kilobytes per restaurant, so neither is collected. The rows carry the review counts, ratings,
popularDishes,peopleSay,knownForand themenuTypes(which menu sections exist and how many pages each has). - Phone numbers are what the page prints. 99.2 % of restaurants in the proof run had one; the rest show none on Zomato. Some restaurants print several, all are in
phones. - PIN code only where Zomato has one (67 % in the proof run); the full
addressis always there. - Live fields change by the minute.
currentStatus("Open now", "Closes in 57 minutes") andopenStatusTextdescribe the moment of the scrape; ratings, votes and offers change daily. UsescrapedAt. - Unrated restaurants have
rating = null; Zomato shows "New" or nothing for them. They are included unless you setminRating. - Sponsored placements. Promoted cards appear in the listing like any other;
isSponsoredmarks them and they are not duplicated. - One snapshot, not a history. Re-run on a schedule and diff by
restaurantIdto track openings, closures and price changes.
Zomato Scraper compared with the alternatives
| Zomato Scraper (this Actor) | Copying from the website by hand | A browser extension | Your own script | |
|---|---|---|---|---|
| Rows per run | tens of thousands | tens | hundreds | depends on your work |
| Phone numbers and GPS | yes, per row | one page at a time | partly | you must find the page API |
| Beyond Zomato's ~500 result limit | automatic slicing and de-duplication | impossible by hand | no | you build the slicing |
| Upkeep when the site changes | handled in updates | n/a | breaks | yours |
| Cost | per result | your time | free or paid | engineering time and proxies |
To our knowledge Zomato does not offer a self-serve public API for restaurant search with phone numbers and coordinates today. Everything this Actor returns is information Zomato already shows publicly on its pages to any visitor.
FAQ
Does Zomato have an official API for restaurant data?
To our knowledge there is no self-serve public Zomato API that returns restaurant lists with phone numbers and coordinates today. This Actor reads the public pages instead.
How do I download a list of restaurants from Zomato to Excel?
Run the Actor with your city, press Export on the dataset, choose Excel (XLSX) or CSV. That is the whole workflow; no Python needed.
Zomato se restaurant ka phone number kaise nikale? / ज़ोमैटो से रेस्टोरेंट का फ़ोन नंबर कैसे निकालें?
Keep "Include phone, coordinates, hours and features" on. Every restaurant row then has phone (first number) and phones (all numbers) exactly as Zomato prints them.
Can I scrape Zomato without logging in?
Yes. Nothing in this Actor uses a Zomato account, cookie or password.
How many restaurants are on Zomato in each city?
The listing totals Zomato showed on 29 Oct 2026: Mumbai 21,535, Delhi NCR 25,571, Bengaluru 19,087, Dubai 10,598. Totals move daily as restaurants open and close.
How do I get all restaurants of Mumbai?
{ "cities": ["Mumbai"], "maxResults": 25000 }. Expect around 94 % of Zomato's listed count; see Honest limits.
How do I get Delhi, Gurgaon and Noida restaurants?
Zomato files them under Delhi NCR. Use "Delhi NCR" (or "Delhi", "Gurgaon", "Noida" — all resolve to the same listing). Filter by locality or address afterwards for one town.
Can I scrape only one area, for example Bandra or Koramangala?
Zomato's area pages show the whole city, so the Actor cannot filter by area on Zomato's side. Download the city and filter locality (e.g. contains "Bandra West") or use coordinates.
Does it work for cities outside India?
Yes, for Zomato's other dine-out cities such as Dubai (tested: Dubai returned rows with currency AED). Use the city name as zomato.com spells it.
Can I filter by cuisine?
Yes: cuisines: ["Biryani"]. Names are matched exactly (case-insensitive) with Zomato's own list of cuisines.
Can I filter by price?
Yes, minCostForTwo and maxCostForTwo, in the city's currency.
What is "cost for two"?
Zomato's estimate of what two people pay for a meal at the restaurant. costForTwo is the number, costForTwoText the label, costForOne Zomato's per-person figure when shown.
What is the difference between rating, diningRating and deliveryRating?
rating is the aggregate on the restaurant's header. Zomato also keeps separate averages for dining out and for delivery, with their own review counts.
Why is rating empty for some restaurants?
They are new or have too few votes; Zomato shows no number, so the column is null.
Can I get coordinates?
Yes: latitude and longitude (detail mode) as Zomato publishes them on the restaurant page. Restaurants without a map location have null.
Can I get opening hours?
openingHours lists the weekly blocks ("Mon-Sun" / "12noon – 1am"); openStatusText and currentStatus describe today.
Can I get the menu or the reviews?
Not in this version — see Honest limits. You do get menuTypes, popularDishes, peopleSay, rating splits and vote counts.
Can I paste a Zomato URL?
Yes, startUrls accepts restaurant pages and listing pages.
How fast is it?
30 restaurants with full details in 9 s, 1,000 in 86 s, and a list-only run of 20,234 Mumbai restaurants in 5.4 minutes (29 Oct 2026).
How many restaurants can one run return?
Up to your maxResults (and Max cost per run). The measured proof run returned 12,000 unique restaurants.
Will I get duplicates?
No. Rows are de-duplicated by restaurantId inside a run; the proof run had 0 duplicates in 12,000 rows. Across separate runs, de-duplicate by the same key.
Why did I get fewer restaurants than I asked for?
The filters matched fewer, or Zomato's per-search limit left a small remainder; the status message says "this is everything the listing exposes for these settings".
Are the phone numbers real and can I call them?
They are the numbers Zomato prints on the restaurant's public page, included unmasked. Calling for business purposes is subject to Indian telemarketing rules — see Legal and compliance.
Does it return e-mail addresses?
No. The restaurant pages this Actor reads carry no e-mail field.
Can it find restaurants that are permanently closed?
Zomato marks them with isPermanentlyClosed; if a closed restaurant is still listed, it is returned with the flag set. Filter on it in your sheet.
What does isSponsored mean?
The restaurant appeared as a promoted card in Zomato's listing. It is still a normal restaurant row; the flag lets you exclude paid placements from statistics.
What does isDarkKitchen mean?
Zomato's flag for delivery-only cloud kitchens without a dining room.
What is chainOutlets?
How many outlets Zomato lists for the same chain in that city ("See all 14 ... outlets in Mumbai").
Can I schedule a daily or monthly export?
Yes, with Apify Schedules; keep the same input and diff the datasets by restaurantId.
How do I export only some columns?
Add fields=name,phone,address,rating to the dataset URL, or choose columns in the Console export dialog.
How much does it cost to scrape 10,000 restaurants?
$25 on the Free plan, down to $16 on the highest tier — see What you pay.
Why do a few rows have detailsFetched = false and no phone?
Zomato's search lists a handful of restaurants whose own page has been removed ("404 - File not found"): 11 of 12,000 in the proof run. The row keeps the listing data (name, rating, votes, cost, cuisines, locality) and detailsFetched is false.
Why did my run end with PARTIAL?
Either the run's time limit was reached or some detail pages did not answer; the message says which, and the saved rows stay yours.
Do I need my own proxy?
No. The default Apify proxy is used and a residential fallback is built in.
Can an AI agent use this Actor?
Yes; call it through Apify's MCP server or API with the JSON inputs above.
Is it legal to scrape Zomato?
The Actor reads public pages without logging in. Whether your use of the data is lawful depends on your purpose and jurisdiction — see Legal and compliance. This is not legal advice.
Glossary
- Zomato (ज़ोमैटो) — India's restaurant discovery and food-delivery platform; this Actor reads its restaurant pages.
- Dine-out — Zomato's listing of restaurants, cafes, bars and bakeries you can visit (as opposed to Delivery).
- Nightlife — the listing of bars, pubs and clubs.
- Cost for two (दो लोगों के लिए खर्च) — Zomato's typical bill estimate for two people.
- Votes — the number of ratings behind a restaurant's aggregate rating.
- Dining / Delivery rating — separate averages for eating at the restaurant and for ordered food.
- Locality — the neighbourhood Zomato files the restaurant under (e.g. Bandra West); region is the broader band above it (e.g. Western Suburbs).
- NCR — National Capital Region: Delhi plus Gurgaon, Noida, Ghaziabad, Faridabad; one Zomato listing.
- Cuisine id — Zomato's internal number per cuisine, used for filtering.
- Dark kitchen / cloud kitchen — a delivery-only kitchen without seating.
- Sponsored / promoted card — a paid placement in the listing.
- Facet splitting — dividing a large search into slices (cuisine, cost, rating) so each slice fits under Zomato's ~500-result limit.
- PPE / pay per event — Apify's pricing in which you pay per saved result.
- DPDP Act 2023 — India's Digital Personal Data Protection Act.
- DND (Do Not Disturb) — India's registry of numbers that opted out of commercial calls and SMS.
Legal and compliance
The Actor collects information that Zomato shows publicly to every visitor, without logging in, bypassing a login, or using anyone's account. Restaurant names, addresses, ratings, cuisines and cost estimates describe businesses. Phone numbers on restaurant pages are business contact numbers of establishments; they are included in the data exactly as shown, unmasked.
You decide what the data is used for and you are the responsible party under the laws that apply to you:
- India — Digital Personal Data Protection Act, 2023 (DPDP). The Act concerns the personal data of individuals. Business listings are mostly establishment data, but a phone number can identify a sole proprietor; if you process personal data you need a lawful purpose, must respect data-principal rights and keep it only as long as needed.
- India — telemarketing rules. Commercial calls and SMS to numbers registered on the Do Not Disturb registry are restricted by TRAI's regulations; screen your call lists accordingly and identify yourself honestly.
- EU/UK — GDPR. If you handle data of people in the EU/UK, GDPR applies to you; business contact data still needs a legitimate-interest assessment for outreach.
- Terms of service and copyright. Zomato's terms govern use of its site. Collections of ratings or images may be protected; do not republish Zomato's photos or review text as your own, and do not use the data to harass anyone.
The Actor does not log in, does not collect user accounts, reviewer identities or private data, and returns no images except the public cover image URL. Nothing here is legal advice; ask a lawyer when in doubt.
Changelog
- 1.0 (29 Oct 2026) — first release. City, cuisine, rating and cost filters; sort orders; automatic splitting beyond Zomato's ~500-result limit; restaurant details with phone, GPS and hours; listing and restaurant URLs; multi-city runs with a fair budget share; Dine-out and Nightlife listings. Proof: 12,000 unique restaurants in one run.
Support
Questions, a city that does not resolve, a column you need: open an issue on the Actor page or write through Apify's message form — we reply within 24 hours. Please include the run ID.