# Swiggy Dineout Scraper — Restaurants, Deals, Phones & Hours (`yugenox/swiggy-dineout-scraper`) Actor

Scrape Swiggy Dineout restaurants anywhere in India: ratings, cost for two, cuisines, walk-in and pre-book discounts, bank and UPI offers, photos — plus optional business phone, full address, pincode, GPS coordinates and weekly opening hours. No login.

- **URL**: https://apify.com/yugenox/swiggy-dineout-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** Lead generation, Travel, E-commerce
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 restaurants

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?

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

## Swiggy Dineout Scraper: Restaurants, Deals, Phones & Hours

Get every **Swiggy Dineout** restaurant in any Indian city as a clean table. Each row has the rating, cost for two, cuisines, photos, and **today's dine-in deals**: walk-in and pre-book discounts, coupon codes, bank and UPI cashback, and Swiggy One offers.

Turn on **business details** to also get:

- the restaurant's **phone number**
- the **full street address with pincode**
- exact **GPS coordinates**
- **weekly opening hours** and whether it is open now
- category, amenities, popular dishes, menu images and upcoming events

You don't need a login, a cookie or an API key. Type a city and press Start.

### What you can do with it

- **Restaurant lead lists.** POS, SaaS, supplies and marketing teams can build call lists of dine-in restaurants by city, locality, cuisine, price band or rating. Each lead comes with a phone number, full address and pincode.
- **Deal tracking and aggregation.** See which restaurants run walk-in or pre-book discounts today, how big they are, and which bank and UPI offers apply. Track changes by scheduling daily runs.
- **Market research.** Map the dine-out scene of a city: cost-for-two distribution, cuisine mix, share of bars, pure-veg and pet-friendly places, and how many restaurants run Swiggy's festival deals.
- **Competitive monitoring.** Follow a fixed list of restaurants by link and see when their offers, ratings or hours change.
- **Maps and location analytics.** Every detailed row carries latitude, longitude and pincode, ready for GIS tools.

### Input

| Field | What it does |
|---|---|
| **Locations** | Cities (`Bangalore`, `Mumbai`, `Delhi`, `Gurgaon`, `Hyderabad`, `Pune`, `Chennai`, `Kolkata`… 63 cities built in, and any other place is looked up), neighbourhoods or landmarks (`Koramangala, Bangalore`, `Bandra West, Mumbai`), GPS coordinates (`19.0760, 72.8777`) or Swiggy city links. |
| **Restaurant URLs** | Optional. Swiggy Dineout restaurant links or ids, when you need full details for specific restaurants. |
| **Coverage** | *Around each location* returns the ~1,000–1,200 restaurants Swiggy shows near that spot and is fast. *Whole city / area* searches a grid of points across the city and merges the results with duplicates removed, which gives complete city lists of several thousand restaurants. |
| **Area radius (km)** | Optional, for whole-city mode. Defaults to the city's size. |
| **Max restaurants** / **per location** | Caps on the number of rows. `0` means no limit. |
| **Add business details** | Adds the phone, full address, pincode, coordinates, hours, category, amenities, popular dishes, menu images, all payment offers with coupon codes and terms, and events. It costs one extra request per restaurant. |
| **Filters** | Minimum rating, maximum cost for two, cuisines, must-have features (e.g. `Alcohol served`, `Pure veg`, `Valet parking`, `Pet friendly`), only restaurants with an offer, and skip sponsored placements. |

Example:

```json
{
  "locations": ["Bangalore", "Bandra West, Mumbai"],
  "maxItems": 500,
  "includeDetails": true,
  "minRating": "4.0",
  "cuisines": ["Italian", "Japanese"]
}
```

### Output

Each row is one restaurant. Here is a sample, shortened:

```json
{
  "id": "1390598",
  "name": "Pixi",
  "url": "https://www.swiggy.com/restaurants/pixi-ashok-nagar-bangalore-1390598/dineout",
  "city": "Bangalore",
  "locality": "Ashok Nagar",
  "fullAddress": "Shop No. 22, Ground Floor, Church Street, Shanthala Nagar, Ashok Nagar, Bangalore, Karnataka",
  "pincode": "560001",
  "latitude": 12.9751852,
  "longitude": 77.6042906,
  "businessPhone": "9108245830",
  "rating": 4.4,
  "ratingCount": 235,
  "costForTwo": 2000,
  "cuisines": ["Asian", "Indian Cuisine"],
  "category": "Nightlife",
  "facilities": ["Alcohol served", "Reservation available", "Valet parking", "SwiggyPay accepted"],
  "bestOffer": "Flat 10% off on pre-booking",
  "preBookDiscount": "Flat 10% off",
  "preBookDiscountPercent": 10,
  "preBookDealType": "Pre-Book",
  "dealAvailability": "Available today",
  "couponOffer": "Get extra ₹100 off using PAYTMUPI",
  "couponCode": "PAYTMUPI",
  "bankOfferSummary": "Up to 10% off with bank offers",
  "offers": ["Flat 10% off on pre-booking", "Get extra ₹100 off using PAYTMUPI", "Up to 10% off with bank offers", "₹150 Off above ₹1500 with Swiggy One"],
  "paymentOffers": [
    { "title": "Flat 10% off", "subtitle": "use HDFCINFINIA", "code": "HDFCINFINIA", "minBill": 3500, "terms": ["Applicable twice per user per calendar month", "…"] }
  ],
  "dineCashOffer": "10% cashback on every bill payment",
  "openStatus": "Open till 1AM",
  "isOpenNow": true,
  "openingHours": [{ "day": "Monday", "hours": "Noon - 1AM" }, { "day": "Tuesday", "hours": "Noon - 1AM" }],
  "menuPageCount": 24,
  "imageUrl": "https://dineout-media-assets.swiggy.com/swiggy/image/upload/…JPG",
  "images": ["…"],
  "isSponsored": true,
  "distanceKm": 6.7,
  "searchLocation": "Koramangala, Bangalore",
  "detailsIncluded": true,
  "scrapedAt": "2026-09-24T06:37:00.162Z"
}
```

These fields are filled only when **Add business details** is on: `fullAddress`, `pincode`, `latitude`, `longitude`, `businessPhone`, `category`, `openStatus`, `isOpenNow`, `openingHours`, `popularDishes`, `menuImages`, `paymentOffers`, `dineCashOffer` and `events`. Without details they are `null` or empty.

The dataset has three ready-made views: **Restaurants**, **Business details** and **Deals & offers**. You can export any of them to CSV, Excel or JSON, or pull them through the API.

### How many restaurants will I get?

- **Around each location:** about 1,000–1,200 restaurants in large cities, and fewer in smaller towns. These are the restaurants Swiggy Dineout shows near that point, within roughly 5–10 km.
- **Whole city / area:** thousands. For example, a 9 km radius around central Pune returned **2,415 unique restaurants**.
- Duplicates are removed across all locations and search points in a run.

### Speed

A single location with no limit takes about 15–25 seconds for roughly 1,100 restaurants, and several locations run in parallel (three metros, 3,500+ restaurants: about a minute). Business details add roughly one second for every 5 restaurants. A whole-city grid of a mid-size city (Pune, 19 search points) takes about 2 minutes.

### FAQ

**Do I need a Swiggy account?** No. The actor doesn't use a login, cookie or phone.

**Is it legal to scrape Swiggy Dineout?** The actor collects only public information that Swiggy Dineout shows to anyone without logging in: restaurant names, ratings, prices, deals, addresses, opening hours and business contact numbers. Collecting publicly available data is generally legal, but what you do with it matters. A restaurant's contact number can be the owner's own mobile, so treat phone numbers as personal data: have a legitimate reason to use them, and follow the privacy laws that apply to you (India's DPDP Act, GDPR, PIPEDA, CCPA or similar) as well as Swiggy's terms. If you're not sure, check with a lawyer. Apify's guide [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) is a good starting point.

**Does it access any private data?** No. The actor doesn't log in and uses no account, cookie or saved session. It reads only the restaurant listings and restaurant pages that Swiggy Dineout shows publicly to every visitor. It never sees diners' accounts, bookings, orders, payment details or reviews, and no row contains a diner's name.

**Which cities work?** Every city where Swiggy Dineout operates, which covers all major Indian metros and many tier-2 cities. If a location has no Dineout restaurants, the run finishes normally with a note saying so.

**Is the phone number a person's number?** It is the restaurant's business contact number, as listed on its Swiggy Dineout page.

**Are the ratings from Swiggy?** Swiggy Dineout displays Google ratings. You get the score and the number of ratings (`ratingCount`). Restaurants with too few ratings have `rating: null`.

**What is "GIRF"?** It is Swiggy's *Great Indian Restaurant Festival*. `preBookDealType` tells you whether a pre-book deal is a regular one, a festival (GIRF) deal, or a Prime deal.

**Can I run it every day?** Yes. Schedule the actor in Apify to track how deals, ratings and opening hours change over time.

**Why did a neighbourhood resolve to a different spot?** Free-text places are looked up with Swiggy's own place search. The run log shows exactly what each location resolved to. For precise control, use coordinates.

**Why was my location skipped?** A place is only used when Swiggy's place search finds an Indian city, area or landmark with that name. A name that only matches a shop, or a place outside India (for example "Toronto", which would otherwise match a shawarma stall in Punjab), is skipped, and the log lists the closest matches. Add the city ("Starbucks, Jaipur") or use coordinates.

**Can I use a Swiggy food-delivery link?** No. Delivery links (without `/dineout` at the end) use different restaurant ids. The actor detects a mismatched name and skips the link rather than returning the wrong restaurant.

**What do the status messages mean?** Every run finishes with a message that starts with a code, and the same information is saved as `RUN_REPORT` in the run's key-value store:

| Code | Meaning |
|---|---|
| `[OK]` | Finished normally. |
| `[PARTIAL]` | Stopped early (run time limit, your spending limit, a Swiggy block or network errors on some points). Every row saved is a complete row; nothing else is charged. |
| `[NO-RESULTS]` | Swiggy answered, but nothing is listed there or nothing matched your filters. No charge. |
| `[BAD-INPUT]` | Nothing usable in the input — the message says what to add. No charge. |
| `[BLOCKED]` / `[DATA-FORMAT]` / `[API-CHANGED]` | Swiggy refused or changed its app API. 0 rows, no charge; try again later. |

The run never fails because of bad input or Swiggy problems: you always get what could be collected, and you only pay for rows written to the dataset.

**I'm calling the API from a script — do I have to use the exact field names?** The canonical names in the input schema are recommended, but common alternatives are understood too: `maxResults` / `limit` for `maxItems`, `city` / `query` for `locations`, `startUrls` (with `{ "url": … }` objects) / `urls` / `ids` for `restaurantUrls`, `details` for `includeDetails`, `mode: "whole city"` for `coverage`, `rating` for `minRating`, `cuisine`, `features`. The log lists every alias that was reinterpreted.

# Actor input Schema

## `locations` (type: `array`):

Where to look for restaurants. Each line can be a city ("Bangalore", "Mumbai", "Delhi", "Gurgaon", "Pune"…), a neighbourhood or landmark ("Koramangala, Bangalore", "Bandra West, Mumbai", "Cyber Hub Gurgaon"), GPS coordinates ("19.0760, 72.8777") or a Swiggy city link. Each location returns the restaurants Swiggy Dineout lists around that spot — about 1,000–1,200 in big cities.

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

Optional. Swiggy Dineout restaurant links (e.g. https://www.swiggy.com/restaurants/muro-ashok-nagar-bangalore-829411/dineout) or just the restaurant ids. Returns full details for exactly these restaurants — handy for tracking deals at a fixed list of places.

## `coverage` (type: `string`):

"Around each location" returns the ~1,000–1,200 restaurants Swiggy shows near that spot (within roughly 5–10 km) — fast. "Whole city / area" searches a grid of points across the entire city or area and merges the results (duplicates removed), for complete city lists of several thousand restaurants.

## `areaRadiusKm` (type: `integer`):

Optional, for "Whole city / area". How far from each location to search. Leave empty to use the city's size (e.g. 18 km for Bangalore, 20 km for Mumbai, 8 km for smaller cities).

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

Stop after this many restaurants in total. 0 = no limit.

## `maxItemsPerLocation` (type: `integer`):

Optional. Cap each location separately, so a multi-city run gets some results from every city.

## `includeDetails` (type: `boolean`):

Adds the restaurant's business phone number, full street address with pincode, exact latitude/longitude, weekly opening hours and open-now status, restaurant category (Casual Dining, Nightlife, Café…), all amenities, popular dishes, menu images, every bank/UPI/card offer with its coupon code and terms, and upcoming events. One extra request per restaurant.

## `minRating` (type: `string`):

Keep only restaurants rated at least this (Google rating shown on Swiggy Dineout).

## `maxCostForTwo` (type: `integer`):

Optional. Keep only restaurants whose "cost for two" is at most this many rupees, e.g. 1500.

## `cuisines` (type: `array`):

Optional. Keep only restaurants serving one of these cuisines, e.g. "North Indian", "Chinese", "Italian", "Cafe", "Desserts" (partial, case-insensitive match).

## `facilities` (type: `array`):

Optional. Keep only restaurants with ALL of these features, e.g. "Alcohol served", "Pure veg", "Valet parking", "Parking available", "Free wifi", "Smoking area", "Pet friendly", "Vegan food", "Jain food", "Halal for meat", "Reservation available" (partial, case-insensitive match).

## `onlyWithOffers` (type: `boolean`):

Skip restaurants that have no walk-in, pre-book, coupon or bank offer right now.

## `skipSponsored` (type: `boolean`):

Leave out restaurants that appear as paid (sponsored) placements.

## `tileSpacingKm` (type: `integer`):

For "Whole city / area": distance between search points. Smaller = more complete but slower. 4 km finds nearly everything.

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

How many pages to fetch at the same time.

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

Apify Proxy is required. The default (automatic datacenter proxy) works; the run switches to residential proxies on its own if datacenter IPs get blocked.

## Actor input object example

```json
{
  "locations": [
    "Bangalore"
  ],
  "coverage": "nearby",
  "maxItems": 50,
  "includeDetails": false,
  "minRating": "any",
  "onlyWithOffers": false,
  "skipSponsored": false,
  "tileSpacingKm": 4,
  "maxConcurrency": 16,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped restaurants.

## `run` (type: `string`):

Status and statistics for this run.

# 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 = {
    "locations": [
        "Bangalore"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/swiggy-dineout-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 = {
    "locations": ["Bangalore"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/swiggy-dineout-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 '{
  "locations": [
    "Bangalore"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/swiggy-dineout-scraper --silent --output-dataset

```

## MCP server setup

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