# Swiggy Scraper — Restaurants, Ratings & Offers (`memo23/swiggy-scraper`) Actor

Scrape Swiggy restaurants across 20+ Indian cities — name, Swiggy rating and rating count, cuisines, cost for two, locality, delivery time, distance, live offers and the Google rating Swiggy shows alongside its own. Search any keyword or browse a whole city. JSON, CSV or Excel.

- **URL**: https://apify.com/memo23/swiggy-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Travel, AI
- **Stats:** 2 total users, 2 monthly users, 93.8% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 restaurant results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Swiggy Scraper — Restaurants, Ratings & Offers (India)

> **$0.002 per restaurant** · no browser, pure HTTP · Swiggy rating *and* the Google rating shown beside it

Scrape **Swiggy restaurants across 20+ Indian cities**. Browse a whole city or search a keyword, and get one clean row per restaurant: name, Swiggy rating and rating count, cuisines, cost for two, locality, delivery time, distance, live discount offers — plus the **Google rating** Swiggy displays alongside its own.

### Why use this scraper

- **Two ratings per restaurant.** Swiggy's own score *and* the Google aggregate it surfaces, so you can compare platform sentiment against the wider web in one row.
- **Live commercial signals.** Current discount offers, delivery ETA, distance and open/closed state — the fields that actually change day to day.
- **City or keyword.** Take a city's full listing, or search "biryani" across several cities in one run.
- **Anywhere in India.** 20+ cities built in, and any other point can be reached with explicit coordinates.
- **No browser.** Pure HTTP against Swiggy's own JSON API — fast and cheap to run.

### Supported inputs

| Input | Example | Notes |
|---|---|---|
| City | picked from a dropdown | 20 cities built in |
| Keyword | `pizza`, `biryani` | Searched per city |
| Coordinates | `19.1136, 72.8697, Andheri` | Neighbourhoods or unlisted cities |
| Google Maps link | `https://www.google.com/maps/@19.11,72.86,15z` | Coordinates are read out of the URL |

Cities are chosen from a dropdown, so there is nothing to spell: Mumbai, Delhi NCR, Gurgaon, Noida, Bengaluru, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Lucknow, Chandigarh, Kochi, Indore, Surat, Nagpur, Bhopal, Coimbatore, Vadodara. Anywhere else is reachable through custom coordinates.

### Use cases

- Track competitor ratings, pricing bands and discounts across a city.
- Build restaurant lead lists by cuisine and locality.
- Monitor how aggressively chains discount, and when.
- Compare Swiggy ratings against Google ratings for the same venue.
- Market research on cuisine mix and delivery coverage by neighbourhood.

### How it works

1. **Resolve** — each city becomes a latitude/longitude, because Swiggy's API is coordinate-driven rather than slug-driven.
2. **Fetch** — the city listing or keyword search is pulled from Swiggy's JSON API.
3. **Extract** — restaurants are collected from Swiggy's nested card tree, de-duplicated by id, and written one row each.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `cities` | array | `["mumbai"]` | Chosen from the built-in dropdown |
| `queries` | array | — | Keywords searched per city |
| `coordinates` | array | — | `lat, lng` per line — optional label, or paste a Google Maps URL |
| `maxItems` | integer | `100` | Hard cap on rows |
| `maxConcurrency` | integer | `3` | Keep low — Swiggy blocks aggressive clients |
| `proxy` | object | none | Optional; add your own if blocked at volume |

Minimal input:

```json
{
    "cities": ["mumbai"],
    "maxItems": 50
}
```

### Output — key fields

| Field | Description |
|---|---|
| `restaurantId`, `name`, `url` | Swiggy id, name and page URL |
| `rating`, `ratingCount` | Swiggy rating and how many ratings |
| `googleRating`, `googleRatingCount` | Google rating as shown on Swiggy |
| `cuisines`, `costForTwo` | Cuisine list and typical spend for two |
| `locality`, `area`, `city` | Location |
| `deliveryTimeMins`, `deliveryTimeText`, `distanceKm` | Delivery signals |
| `offer` | Current discount, e.g. "70% OFF · UPTO ₹140" |
| `isOpen`, `isVeg` | Status flags |
| `imageUrl` | Restaurant image |

#### Output sample

```json
{
    "restaurantId": "448490",
    "name": "Barbeque Nation",
    "url": "https://www.swiggy.com/city/mumbai/barbeque-nation-rest448490",
    "rating": 3.5,
    "ratingCount": "1.5K+",
    "cuisines": ["North Indian", "Barbecue", "Kebabs", "Biryani"],
    "costForTwo": "₹600 for two",
    "locality": "Bandra East",
    "area": "Bandra Kurla Complex",
    "deliveryTimeMins": 21,
    "deliveryTimeText": "20-25 mins",
    "distanceKm": "1.1 km",
    "isOpen": true,
    "offer": "70% OFF · UPTO ₹140",
    "googleRating": "4.0",
    "googleRatingCount": "1.8K+"
}
```

### Pricing

Pay-per-event: **$0.002 per restaurant row**, plus a $0.005 actor-start fee per GB of run memory. 100 restaurants cost $0.20.

### FAQ

**Which countries?** India only — that is Swiggy's market.

**Are menus included?** No. Swiggy blocks its menu endpoint to automated clients (it answers with an empty response), and this Actor does not bypass that. For priced menu data, a Talabat scraper covers the Gulf markets.

**Are reviews included?** No — Swiggy does not publish review text on its public API, only aggregate ratings. For restaurant reviews with full text, use a Zomato scraper.

**Do I need a proxy?** Not usually. Swiggy's listing API answers without one; add your own if you hit blocks at high volume.

**My city isn't in the dropdown.** Put its coordinates in the `coordinates` input, one per line as `19.1136, 72.8697`. Add a name if you want it on every row (`19.1136, 72.8697, Andheri`), or simply paste a Google Maps URL and the coordinates are read out of it. Entries that are not usable are reported in the log with the reason, and a point outside India is flagged because Swiggy does not operate there.

**How many restaurants per city?** Swiggy reports roughly 2,000 per major city; a single listing call returns the first page, and keyword searches widen the net.

### Support

Found a bug or need another field? Open an issue on the Actor's Issues tab — it is monitored.

### 🤖 For AI Agents & LLM Apps

**Purpose:** Turn an Indian city or keyword into structured Swiggy restaurant rows with two independent ratings, pricing band and live offers. Browser-free.

**Minimal input (tested):**

```json
{ "cities": ["mumbai"], "maxItems": 20 }
```

**Behaviors agents should know:**

- One row per restaurant, de-duplicated by `restaurantId` across cities and queries.
- `rating` is Swiggy's (numeric); `googleRating` is a string and may be absent.
- Billing is `restaurant-result` at $0.002; bound spend with `maxItems`.
- `cities` is a fixed enum of 20 slugs (`mumbai`, `delhi`, `bangalore`, …); anything else belongs in `coordinates`, which take `"lat, lng"`, `"lat, lng, label"`, a Google Maps URL, or the `{lat,lng,label}` object form.
- Menus and review text are not available from Swiggy's public API.

### ⚠️ Disclaimer

This Actor collects only publicly available restaurant listing data from Swiggy — no logins, paywalls or access controls are bypassed, and its menu endpoint is deliberately left alone because Swiggy blocks automated access to it. Use the data in compliance with Swiggy's Terms of Service and applicable law. You are responsible for how you use the output.

### SEO Keywords

swiggy scraper, swiggy api, scrape swiggy, swiggy restaurant scraper, swiggy data extraction, india restaurant data, food delivery scraper, restaurant ratings india, mumbai restaurant data, bangalore restaurants, delhi food delivery, restaurant offers scraper, cost for two data, cuisine dataset india, restaurant lead generation, swiggy json, apify swiggy.

# Actor input Schema

## `cities` (type: `array`):

Pick the Indian cities to scrape. Swiggy operates in India only. For a neighbourhood or a town that is not listed, use "Custom coordinates" below instead.

## `queries` (type: `array`):

Keywords searched in each city, e.g. "pizza", "biryani". Leave empty to take the city's default restaurant listing.

## `coordinates` (type: `array`):

Exact points to scrape, for neighbourhoods or towns outside the city list. One per line, as "latitude, longitude" — for example 19.1136, 72.8697. You can add a name ("19.1136, 72.8697, Andheri") or paste a Google Maps URL and the coordinates are read from it. Swiggy covers India only.

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

Hard cap on restaurant rows for the whole run.

## `maxConcurrency` (type: `integer`):

Parallel requests. Swiggy blocks aggressive clients, so keep this low.

## `proxy` (type: `object`):

Off by default — Swiggy's listing API answers without a proxy. Add your own if you hit blocks at volume.

## Actor input object example

```json
{
  "cities": [
    "mumbai"
  ],
  "coordinates": [],
  "maxItems": 100,
  "maxConcurrency": 3,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "cities": [
        "mumbai"
    ],
    "coordinates": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/swiggy-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 = {
    "cities": ["mumbai"],
    "coordinates": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/swiggy-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 '{
  "cities": [
    "mumbai"
  ],
  "coordinates": []
}' |
apify call memo23/swiggy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/swiggy-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/Q4AmvIrswAFCZunR1/builds/aZX4znJy9vdO9qBek/openapi.json
