# Zomato Restaurants Search Scraper (`stealth_mode/zomato-restaurants-search-scraper`) Actor

Scrape comprehensive restaurant data from Zomato search results including menus, ratings, promotions, and delivery options. Ideal for food delivery analytics, competitive research, and market intelligence in India's dynamic F\&B sector.

- **URL**: https://apify.com/stealth\_mode/zomato-restaurants-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 100 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Zomato Restaurant Search Scraper: Extract Dining Data from India's Leading Food Platform

### Why Zomato Data Matters for Food Industry Intelligence

Zomato dominates India's online food delivery and restaurant discovery market, serving millions of users across hundreds of cities. The platform aggregates critical data about restaurants, their offerings, pricing, promotions, and customer preferences—making it an essential resource for anyone in the food and beverage industry.

For restaurant owners, aggregators, market researchers, and business analysts, Zomato data reveals dining trends, competitive positioning, promotional strategies, and consumer behavior patterns. However, manually collecting this information across multiple locations and restaurant categories would be impractical. This scraper automates that process, delivering structured data ready for analysis.

### What This Scraper Extracts

The Zomato Restaurant Search Scraper collects detailed information from search result pages, capturing everything from basic restaurant details to promotional offers and delivery options. It processes dine-out, delivery, and takeaway listings, extracting both visible information and underlying metadata that powers Zomato's recommendation algorithms.

Target users include food delivery platforms conducting competitive analysis, restaurant chains monitoring market presence, investors researching F\&B trends, and data analysts building predictive models for the hospitality sector.

### Input Configuration Explained

The scraper accepts Zomato search page URLs—these are the results pages you see after searching for restaurants in a specific area or category. The URL structure typically includes location parameters and filters.

**Input Parameters:**

```json
{
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [],
    "apifyProxyCountry": "US"
  },
  "max_items_per_url": 20,
  "ignore_url_failures": true,
  "urls": [
    "https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"
  ]
}
```

#### Example Screenshot:

![](https://i.ibb.co/gZvLjk5y/Screenshot-from-2025-12-13-19-16-32.png)

**max\_items\_per\_url** limits how many restaurants to extract per search URL, useful for controlling costs and focusing on top results. **ignore\_url\_failures** ensures the scraper continues processing other URLs even if one fails, important when scraping multiple locations. The **urls** array accepts multiple search pages, allowing you to collect data across different neighborhoods, cuisines, or dining types simultaneously.

Note that proxy usage may be necessary for large-scale scraping to avoid rate limits, though it's disabled in this example for simplicity.

### Output Fields and Their Business Value

The scraper returns JSON data with each restaurant represented as a complete object. Here's what each field means:

**Type** identifies the listing category (dine-out, delivery, nightlife), crucial for segmenting analysis by service model.

**Info** contains core restaurant details including name, cuisine types, location, ratings, and pricing indicators. This structured data enables comparative analysis across restaurants.

**Order** captures ordering capabilities and integration status, showing which restaurants support online orders directly through Zomato.

**Gold** indicates Zomato Gold membership status and available benefits, revealing which restaurants participate in loyalty programs—valuable for understanding partnership strategies.

**Takeaway** shows takeaway availability and terms, important for restaurants offering multiple service modes.

**Card Action** contains primary call-to-action data (Book Table, Order Online), indicating the restaurant's main engagement channel.

**Distance** provides proximity data from the search location, enabling geographic analysis and understanding delivery radius coverage.

**Is Promoted** and **Promoted Text** identify paid placements, essential for competitive advertising intelligence and understanding promotional investment patterns.

**Tracking Data** includes analytics metadata that Zomato uses internally, useful for understanding how restaurants are categorized and prioritized.

**All CTA** captures all available actions (order, book, directions), showing the full range of user engagement options.

**Promo Offer** and **Check Bulk Offers** detail current promotional campaigns, critical for tracking competitive discounting strategies and seasonal promotions.

**Bulk Offers** shows package deals and special offers, particularly relevant during festive seasons or for corporate catering analysis.

**Is Disabled** flags restaurants currently unavailable for ordering, useful for tracking operational status and availability patterns.

**Bottom Containers** includes additional metadata and promotional widgets displayed below main restaurant information.

Example output structure:

```json
[
  {
  "type": "restaurant",
  "info": {
    "res_id": 1800,
    "name": "VEDA - Ancient Recipes, Modern Palates",
    "image": {
      "url": "https://b.zmtcdn.com/data/pictures/0/1800/45ef62e1d8f769fa28a08a76177ad495_featured_v2.jpg?output-format=webp",
      "url_with_params": "https://b.zmtcdn.com/data/pictures/0/1800/45ef62e1d8f769fa28a08a76177ad495_featured_v2.jpg?fit=around%7C108%3A108&crop=108%3A108%3B%2A%2C%2A&output-format=webp"
    },
    "o2_featured_image": {
      "url": "https://b.zmtcdn.com/data/pictures/0/1800/0c32c319225e85fb53472d63e68f6c74_o2_featured_v2.jpg?output-format=webp"
    },
    "rating": {
      "has_fake_reviews": 0,
      "aggregate_rating": "4.0",
      "rating_text": "4.0",
      "rating_subtitle": "Very Good",
      "rating_color": "5BA829",
      "votes": "2,218",
      "subtext": "REVIEWS",
      "is_new": false
    },
    "rating_new": {
      "newly_opened_obj": null,
      "suspicious_review_obj": null,
      "ratings": {
        "d_i_n_i_n_g": {
          "rating_type": "DINING",
          "rating": "3.8",
          "review_count": "1,933",
          "review_text_small": "1,933 Reviews",
          "subtext": "1,933 Dining Reviews",
          "color": "#1C1C1C",
          "rating_v2": "3.8",
          "subtitle": "DINING",
          "side_sub_title": "Dining Ratings",
          "bg_color_v2": {
            "type": "green",
            "tint": "600"
          },
          "new_on_dining": false
        },
        "d_e_l_i_v_e_r_y": {
          "rating_type": "DELIVERY",
          "rating": "4.1",
          "review_count": "285",
          "review_text_small": "285 Reviews",
          "subtext": "285 Delivery Reviews",
          "color": "#E23744",
          "rating_v2": "4.1",
          "subtitle": "DELIVERY",
          "side_sub_title": "Delivery Ratings",
          "bg_color_v2": {
            "type": "green",
            "tint": "700"
          },
          "new_on_delivery": false
        }
      }
    },
    "cft": {
      "text": "₹1,800 for two"
    },
    "cfo": {
      "text": "₹750 for one"
    },
    "locality": {
      "name": "Connaught Place, New Delhi",
      "address": "26-H, Ground Floor, Tropical Building, Connaught Circus, Connaught Place, New Delhi",
      "locality_url": "ncr/connaught-place-delhi-restaurants"
    },
    "timing": {
      "text": "",
      "color": ""
    },
    "cuisine": [
      {
        "deeplink": "zomato://search?deeplink_filters=WyJ7XCJjb250ZXh0XCI6XCJhbGxcIn0iLCJ7XCJjdWlzaW5lX2lkXCI6W1wiNTBcIl19Il0%3D",
        "url": "https://www.zomato.com/ncr/restaurants/north-indian/",
        "name": "North Indian"
      }
    ],
    "should_ban_ugc": false,
    "cost_text": {
      "text": "₹1,800 for two"
    }
  },
  "order": [],
  "gold": {
    "instant": 15,
    "welcome_offer": false,
    "gold_offer": false,
    "text": "Flat",
    "offer_value": "15% OFF",
    "is_gold_icon": false
  },
  "takeaway": [],
  "card_action": null,
  "distance": "1.1 km",
  "is_promoted": null,
  "promoted_text": null,
  "tracking_data": null,
  "all_cta": null,
  "promo_offer": null,
  "check_bulk_offers": null,
  "bulk_offers": null,
  "is_disabled": null,
  "bottom_containers": null,
  "from_url": "https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"
}
]
```

### Using the Scraper Effectively

Create an Apify account and access the Zomato scraper. Identify your target search URLs by browsing Zomato and filtering by location, cuisine, or dining type. Copy the resulting URLs into your input configuration.

Configure **max\_items\_per\_url** based on your needs—20 captures top restaurants, while higher values provide broader market coverage. Enable **ignore\_url\_failures** when scraping multiple locations to ensure partial failures don't halt the entire run.

For large-scale operations across multiple cities, organize URLs by region and run separate scraping jobs to manage data more effectively. Set up scheduled runs to track changes in promotions, ratings, or new restaurant additions over time.

Monitor execution through the Apify console. Processing speed depends on the number of URLs and items per URL, typically handling 100-200 restaurants within 5-10 minutes.

### Practical Applications

**Competitive Intelligence:** Restaurant owners can monitor competitor promotions, pricing changes, and service offerings in their area. Track which restaurants invest in promoted listings and how promotion frequency correlates with customer engagement.

**Market Research:** Analyze cuisine trends by geography, identify underserved neighborhoods, and understand pricing patterns across different dining categories. The promotional data reveals seasonal campaign strategies and discount intensity by market segment.

**Delivery Platform Analytics:** Aggregators can benchmark against Zomato's offerings, identify restaurants not yet on competing platforms, and understand partnership penetration rates across different localities.

**Investment Analysis:** Investors researching F\&B opportunities can assess market density, pricing dynamics, and competitive intensity in target locations. Gold membership participation rates indicate restaurant willingness to join loyalty programs.

**Pricing Strategy:** Cross-reference cost-for-two data with ratings and order volumes to identify optimal pricing positions. Track how promotional intensity varies by location and restaurant type.

### Best Practices

Schedule regular scraping to capture promotional cycles and rating changes. Most restaurants update offers weekly, making bi-weekly data collection optimal for trend analysis.

Combine Zomato data with other platforms (Swiggy, Google Maps) for comprehensive market intelligence. Cross-validate restaurant information across sources to identify discrepancies.

Implement data quality checks for anomalies in ratings, pricing, or availability status. Set up alerts for significant changes like new competitors entering your market or major promotional campaigns.

Store historical data to analyze seasonal patterns, track restaurant lifecycle (new openings to closures), and measure how promotional strategies evolve over time.

Respect rate limits and use proxies for large-scale operations to ensure sustainable access to this valuable data source.

### Conclusion

The Zomato Restaurant Search Scraper transforms India's largest food platform into actionable business intelligence. Whether you're optimizing restaurant operations, conducting market research, or building competitive strategies, this tool provides the structured data needed for informed decision-making in the dynamic food delivery and dining sector.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the models list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/zomato-restaurants-search-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 = {
    "urls": ["https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/zomato-restaurants-search-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 '{
  "urls": [
    "https://www.zomato.com/ncr/dine-out-in-paharganj?place_name=New%20Delhi%20Railway%20Station,%20%20New%20Delhi%20Railway%20station,%20%20Pahar%20Ganj"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/zomato-restaurants-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/zomato-restaurants-search-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/FwHaiUJ2ggFVfMgK0/builds/V585bRwqBkkkQVpWI/openapi.json
