# Zomato Scraper: Restaurants, Ratings & Cuisine (`getascraper/zomato-scraper`) Actor

Scrape Zomato restaurant listings by city and full detail per restaurant. Rating, review count, cuisine, address, price range for two, phone, and hours. Works for market research, lead generation, or dining apps. No login needed. From $1.76 per 1,000 results.

- **URL**: https://apify.com/getascraper/zomato-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 restaurant records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🍽️ Zomato Scraper: Restaurants, Ratings & Cuisine

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#FDF2F3;border:1px solid #F6C2C6;border-top:4px solid #E23744;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Get Zomato restaurant listings, ratings, and full contact details ready for your spreadsheet in minutes.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Search any Indian city for curated top restaurants, then pull complete detail records, address, phone, price range, hours, and a link to the menu, for the ones you need.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F6C2C6;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#B91C2B">🔍 City-wide discovery</span><br>
<span style="font-size:12px;color:#57534E">Ranked restaurant lists for any Indian city, with cuisine, address, and rating included.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F6C2C6;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#B91C2B">📋 Full contact records</span><br>
<span style="font-size:12px;color:#57534E">Phone number, exact address, and geo coordinates for every restaurant you enrich.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F6C2C6;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#B91C2B">💰 Price and hours</span><br>
<span style="font-size:12px;color:#57534E">Price range for two and opening hours, before you ever pick up the phone.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F6C2C6;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#B91C2B">🔗 Menu links included</span><br>
<span style="font-size:12px;color:#57534E">Every detail record carries a direct link to the restaurant's live menu.</span>
</td>
</tr>
</table>

No login required, and it works for any Indian city Zomato covers. Search mode pulls Zomato's curated top restaurant lists for a city, and Detail mode fills in the full record for the restaurants you care about.

***

### 🔍 What does Zomato Scraper do?

This Actor runs in two modes:

- **Search mode** returns Zomato's curated top restaurant lists for a city: name, rank, cuisine, address, rating and review count. Querying both list types roughly doubles unique coverage per city.
- **Detail mode** returns the full record for specific restaurants: exact address, geo coordinates, phone number, price range for two, opening hours, rating, review count and a link to the menu.

Chain the two together: run Search mode to find restaurants, then feed their URLs into Detail mode to enrich only the ones you need.

***

### 💡 Why use Zomato Scraper

- **I am a market researcher** studying India's restaurant industry, looking to compare cuisine mix, ratings, and pricing across cities in order to build sector reports for clients.
- **I am building a restaurant discovery app**, looking to seed my directory with clean starter data in order to skip weeks of manual data entry.
- **I am a B2B sales rep** selling POS systems and delivery integrations, looking to build a targeted outreach list in order to reach restaurant owners directly by phone and address.
- **I am a marketing agency** working with restaurant clients, looking to map cuisine density and rating patterns across a city in order to pitch data-backed recommendations.

***

### 🚀 How to use Zomato Scraper

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FDF2F3;border:1px solid #F6C2C6;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#E23744;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick a city and mode</span><br>
<span style="font-size:12px;color:#57534E">Choose an Indian city for Search mode, or paste restaurant URLs for Detail mode.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FDF2F3;border:1px solid #F6C2C6;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#E23744;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Start the run</span><br>
<span style="font-size:12px;color:#57534E">Zomato's public pages load automatically. No login and no account setup needed.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FDF2F3;border:1px solid #F6C2C6;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#E23744;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Export your data</span><br>
<span style="font-size:12px;color:#57534E">Download clean rows as CSV, JSON, or Excel, ready for your spreadsheet or CRM.</span>
</td>
</tr>
</table>

***

### 📥 Input

| Field | Type | Required | Description |
| --- | --- | :---: | --- |
| `mode` | enum | No | Choose Search (city listings) or Detail (specific restaurants). Defaults to Search. |
| `city` | string | No | Zomato city slug to search, e.g. bangalore, mumbai, delhi. Used only in Search mode. |
| `listTypes` | array of enums | No | Which curated city lists to pull: all restaurants, best restaurants, or both. Defaults to both. |
| `restaurantUrls` | array of URLs | No | Zomato restaurant URLs or their paths to enrich. Used only in Detail mode. |
| `maxItems` | integer | No | Maximum number of records saved to your dataset. Use 0 for no limit. |
| `proxyConfiguration` | object | No | Proxy settings. Datacenter proxy is enough for Zomato. |

***

### 📤 Output

Each row represents one restaurant, either a ranked listing from Search mode or a full record from Detail mode. Only fields genuinely present on the page are included, so your dataset stays clean.

Here is a realistic example of a Detail mode row:

```json
{
  "rowType": "detail",
  "name": "Cajsa - ITC Gardenia",
  "city": "bangalore",
  "cuisine": "European, Asian, Continental",
  "address": "ITC Gardenia, Residency Road, Bangalore",
  "locality": "Residency Road",
  "country": "India",
  "ratingValue": 4.6,
  "reviewCount": 1284,
  "restaurantUrl": "https://www.zomato.com/bangalore/cajsa-itc-gardenia-residency-road-bangalore",
  "latitude": 12.9698,
  "longitude": 77.6089,
  "telephone": "+91 80 6660 6161",
  "priceRangeForTwo": "₹4,500 for two",
  "openingHours": "12:30 PM to 3:00 PM, 7:00 PM to 11:30 PM (Mon-Sun)",
  "menuUrl": "https://www.zomato.com/bangalore/cajsa-itc-gardenia-residency-road-bangalore/menu"
}
```

***

### 📋 Data table

| Field | Type | Description |
| --- | --- | --- |
| `rowType` | string | Record type, "listing" for Search mode rows or "detail" for Detail mode rows. |
| `rank` | integer | Position of the restaurant in Zomato's ranked city list (Search mode only). |
| `name` | string | Restaurant name. |
| `city` | string | Zomato city slug the restaurant was found in. |
| `listType` | string | Which curated list surfaced this restaurant, "restaurants" or "best-restaurants" (Search mode only). |
| `cuisine` | string | Cuisine types served, as listed on Zomato. |
| `address` | string | Full street address of the restaurant. |
| `locality` | string | Neighborhood or area within the city. |
| `country` | string | Country the restaurant operates in. |
| `ratingValue` | number | Zomato rating out of 5. |
| `reviewCount` | integer | Number of user reviews behind the rating. |
| `imageUrl` | string | Restaurant's primary listing image URL. |
| `restaurantUrl` | string | Direct link to the restaurant's Zomato page. |
| `latitude` | number | Geographic latitude coordinate. |
| `longitude` | number | Geographic longitude coordinate. |
| `telephone` | string | Restaurant's public contact phone number (Detail mode only). |
| `priceRangeForTwo` | string | Approximate cost for two people, as shown on Zomato. |
| `openingHours` | string | Restaurant's listed opening hours. |
| `menuUrl` | string | Direct link to the restaurant's live menu on Zomato. |

***

### 💰 Pricing

Pricing is pay per result, billed per restaurant record saved to your dataset. Empty runs cost nothing, and there are no monthly subscriptions or hidden fees.

***

### ⭐ Enjoying Zomato Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#FDF2F3;border:1px solid #F6C2C6;border-left:5px solid #E23744;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Save hours of manually browsing Zomato for restaurant names, ratings, and contact details.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other market researchers and lead-gen teams find a reliable Zomato data source. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#E23744;border:1px solid #F6C2C6;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/zomato-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

***

### 🛠️ Tips and optimization

- **Query both list types**: "All restaurants" and "Best restaurants" surface different top picks, so requesting both roughly doubles unique coverage per city.
- **Chain search into detail**: Copy the `restaurantUrl` values from a Search mode run into `restaurantUrls` for a Detail mode run to enrich only the restaurants you actually need.
- **Cap your spend**: Set `maxItems` to stop the run once you have reached the record count you need.

***

### ❓ FAQ

##### Does it get blocked?

Zomato serves plain pages with no bot-detection challenge, so a standard datacenter proxy is enough. You do not need to pay for residential IPs.

##### Does it extract private phone numbers?

No. Every phone number, address, and rating comes from Zomato's own public restaurant pages, the same information any visitor sees without logging in.

##### How fresh is the data?

Every run fetches restaurant pages live from Zomato the moment you start it, so ratings, review counts, and hours reflect what is on the site right now.

##### Does search mode cover every restaurant in a city?

Search mode returns Zomato's curated top restaurant lists for a city, not its entire directory. Querying both list types roughly doubles unique coverage. For a specific restaurant that is not in those lists, add its URL directly in Detail mode.

***

### 🛡️ Disclaimers and support

- **Disclaimer**: This is an independent scraper that retrieves publicly available information. It is not affiliated with, endorsed by, or sponsored by Zomato Media Private Limited.
- **Support**: For bug reports, feature requests, or custom field additions, please open a ticket under the **Issues** tab.

### 🔗 Other actors

- [Talabat UAE Restaurant Scraper: مطاعم طلبات](https://apify.com/getascraper/talabat-restaurant-scraper) ↗ - collects UAE restaurant listings and menus from Talabat.
- [BookMyShow Scraper](https://apify.com/getascraper/bookmyshow-scraper) ↗ - collects public movie and event listings across major Indian cities.
- [Zauba Trade Data Scraper: India Import Export](https://apify.com/getascraper/zauba-trade-data-scraper) ↗ - extracts India import and export shipment records for market and lead research.
- [CarDekho Used Cars Scraper: Indian Car Listings, Prices & Dealer Data](https://apify.com/getascraper/cardekho-used-cars-scraper) ↗ - collects used car listings and dealer details across India.
- [Apna.co Jobs Scraper: India Blue & Grey Collar Listings](https://apify.com/getascraper/apna-co-scraper) ↗ - extracts blue and grey collar job listings from India's Apna.co platform.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'Search' returns restaurant listings for a city. 'Detail' returns full detail for specific restaurants.

## `city` (type: `string`):

Zomato city slug to search, e.g. 'bangalore', 'mumbai', 'delhi'. Use the same spelling Zomato uses in its own URLs.

## `listTypes` (type: `array`):

Which curated Zomato listings to pull for the city. Each is a separate source, so picking both roughly doubles coverage with fewer duplicates.

## `restaurantUrls` (type: `array`):

Full Zomato restaurant URLs or their path (e.g. '/bangalore/cajsa-itc-gardenia-residency-road-bangalore'). Copy these from a Search mode run's 'restaurantUrl' field. Only used in Detail mode.

## `maxItems` (type: `integer`):

Maximum number of records to push to the dataset. Use 0 for no limit. You are billed per record returned.

## `proxyConfiguration` (type: `object`):

Datacenter proxy is sufficient. Zomato serves plain pages with no bot-detection challenge.

## Actor input object example

```json
{
  "mode": "search",
  "city": "bangalore",
  "listTypes": [
    "restaurants",
    "best-restaurants"
  ],
  "restaurantUrls": [
    "https://www.zomato.com/bangalore/cajsa-itc-gardenia-residency-road-bangalore"
  ],
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "city": "bangalore",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/zomato-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "city": "bangalore",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/zomato-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "city": "bangalore",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/zomato-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/zomato-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4o7SPnSJmUDra4Rsa/builds/4U2RxyWrwcatpwuyo/openapi.json
