# Swiggy Dineout Restaurants Scraper (`maximedupre/dineout`) Actor

Find public Dineout restaurant listings for one location. Get names, public pages, cuisines, addresses, ratings, cost for two, offers, distance, and image links when published. Narrow the search by cuisine or dish, or show only venues with dining offers.

- **URL**: https://apify.com/maximedupre/dineout.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Travel, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.45 / 1,000 restaurant listings

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

### 🍽️ Find Dineout restaurants by location

Restaurant researchers, local teams, and developers can use Dineout to find public restaurant listings for one location. Save structured rows with names, public pages, locations, cuisines, ratings, cost for two, offers, distance, and public media when those details are published.

Start with one of these focused runs:

- Find public Dineout listings for one location with **[Dineout Restaurant Listings](https://apify.com/maximedupre/dineout/examples/dineout-restaurant-listings)**.
- Compare cost-for-two details across venues with **[Restaurant Listings With Prices](https://apify.com/maximedupre/dineout/examples/restaurant-listings-with-prices)**.
- Keep only venues with current dining offers with **[Restaurants With Offers](https://apify.com/maximedupre/dineout/examples/restaurants-with-offers)**.
- Narrow a location search by cuisine or dish with **[Restaurants By Cuisine](https://apify.com/maximedupre/dineout/examples/restaurants-by-cuisine)**.
- Browse public restaurant listings in New Delhi with **[Restaurants In New Delhi](https://apify.com/maximedupre/dineout/examples/restaurants-in-new-delhi)**.

#### 📍 Dineout restaurant listing data

The default dataset contains structured restaurant listing rows for the selected location. Each row keeps public venue details together so you can review locations, cuisines, prices, ratings, offers, and media in one place when the source publishes them.

#### ▶️ Run a Dineout location search

**Run flow**

1. Enter one location such as `Bangalore`.
2. Add one optional cuisine or dish keyword to narrow the search.
3. Turn on **Dining offers only** to keep venues with a currently published dining offer.
4. Set **Maximum listings**, or leave it empty to return all available listings until the source is exhausted.
5. Start the run and open the default dataset or its API link.

The Actor uses public listing data and does not require source credentials or private account access. Results depend on what Dineout publishes for the selected location.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `location` | string | One location to search for public Dineout restaurant listings. |
| `keyword` | string | Optional cuisine or dish keyword to narrow results for the selected location. |
| `offersOnly` | boolean | When true, keep only venues with a currently published dining offer. When false, include all matching venues. |
| `maxItems` | integer | Optional cap on eligible public listings. Leave it empty to return all available listings until the source is exhausted. |

**Successful default input**

This example is copied from the public input of a successful hosted default-input run.

```json
{
  "location": "Bangalore",
  "offersOnly": false,
  "maxItems": 20
}
```

#### 🧾 Output

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Link to the default dataset that contains the restaurant listing rows. |

**Restaurant listing fields**

| Field | Type | What it does |
| --- | --- | --- |
| `name` | string | Public restaurant name. |
| `publicPageUrl` | string | Public Dineout page URL for the restaurant. |
| `location` | object | Public address and place details. |
| `location.city` | string | Public city, when published. |
| `location.neighborhood` | string | Public neighborhood, when published. |
| `location.address` | string | Public street address. |
| `location.coordinates` | object | Public geographic coordinates, when published. |
| `location.coordinates.latitude` | number | Public latitude. |
| `location.coordinates.longitude` | number | Public longitude. |
| `location.distanceFromLocation` | object | Public distance from the selected location, when published. |
| `location.distanceFromLocation.value` | number | Published distance value. |
| `location.distanceFromLocation.unit` | string | Unit for the distance, such as `m` or `km`. |
| `cuisines` | array of string | Public cuisine labels. |
| `costForTwo` | object | Public cost for two, when published. |
| `costForTwo.amount` | number | Published cost amount for two people. |
| `costForTwo.currency` | string | Currency for the published cost amount. |
| `ratings` | object | Public rating context, when published. |
| `ratings.overall` | object | Public overall rating and review count. |
| `ratings.overall.score` | number | Published overall rating score. |
| `ratings.overall.reviewCount` | integer | Published number of overall reviews. |
| `paymentAvailable` | boolean | Whether the public listing indicates payment is available, when published. |
| `highlights` | array of string | Public highlights shown for the restaurant, when available. |
| `offerHeadings` | array of string | Public headings for dining offers shown by the listing, when available. |
| `venueTypes` | array of string | Public venue type labels, when available. |
| `serviceAvailability` | object | Public service availability signals, when available. |
| `serviceAvailability.dining` | boolean | Whether the public listing indicates dining service is available. |
| `media` | object | Public image links and source-published image counts, when available. |
| `media.imageUrls` | array of string | Public image URLs for the restaurant. |
| `media.imageCount` | integer | Image count published by the source. |

**Example restaurant row**

This shortened row is copied from a successful hosted default-input run. The live row had 53 image URLs, so `media.imageUrls` uses the JSON string `"..."` as an omission marker. The other shown values are genuine, so this is not a complete row.

```json
{
  "name": "Plan B",
  "publicPageUrl": "https://www.swiggy.com/restaurants/plan-b-ashok-nagar-bangalore-14360/dineout",
  "location": {
    "city": "Bangalore",
    "neighborhood": "Ashok Nagar",
    "address": "Thomas Building, Ashok Nagar, Bangalore",
    "distanceFromLocation": {
      "value": 5.1,
      "unit": "km"
    },
    "coordinates": {
      "latitude": 12.9696394,
      "longitude": 77.60653272
    }
  },
  "cuisines": [
    "American",
    "Italian"
  ],
  "costForTwo": {
    "amount": 1300,
    "currency": "INR"
  },
  "ratings": {
    "overall": {
      "score": 4.1,
      "reviewCount": 5084
    }
  },
  "paymentAvailable": true,
  "highlights": [
    "Alcohol served",
    "Reservation available",
    "Parking available",
    "Valet parking",
    "Smoking area",
    "SwiggyPay accepted",
    "Spicy Potato Wedges",
    "Juicy Lucy",
    "Crispy Bacon",
    "Cheesy Garlic Fries"
  ],
  "offerHeadings": [
    "Flat 50% off",
    "TODAY’S \nDISCOUNT",
    "Get extra ₹100 off using PAYTMUPI",
    "Flat 50% off on Total Bill",
    "Flat 45% off on Total Bill",
    "Flat 40% off on Total Bill",
    "Flat 5% off on Total Bill",
    "Flat 10% off on total bill"
  ],
  "venueTypes": [
    "RESTAURANT_TYPE_PARTICIPATING"
  ],
  "serviceAvailability": {
    "dining": true
  },
  "media": {
    "imageUrls": "...",
    "imageCount": 53
  }
}
```

#### 💳 Pricing

**Per-listing charge**

The Actor uses pay-per-event pricing. You pay $0.00445 for each successfully saved public restaurant listing. A run with no saved listing does not trigger this event.

#### 🔌 Integrations

**Dataset and API**

Open the default dataset from the run or use the Apify dataset API to read the structured rows.

**Video walkthrough**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I search more than one location in one run?

No. Each run takes one location. Use separate runs for separate locations.

##### Can I narrow the search by cuisine or dish?

Yes. Enter one optional keyword to narrow restaurant listings for the selected location.

##### What does Dining offers only do?

When enabled, the dataset keeps venues with a currently published dining offer. It does not book or pay for a meal.

##### Will every listing include ratings, distance, and images?

Not always. These fields appear when Dineout publishes them for a listing. Required identity, address, and cuisine fields follow the public schema.

##### What happens if public Dineout data is unavailable?

Results are not guaranteed for every location. If public access or listing extraction fails, the Actor does not emit partial or diagnostic venue rows.

##### Do I need a Dineout login or API key?

No. The Actor uses public listing data and does not ask for source credentials or private account access.

### 📝 Changelog

**v0.0** (19-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~dineout/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[OpenTable + Resy Scraper](https://apify.com/maximedupre/opentable-resy-scraper)**: Export public restaurant profiles, ratings, prices, and photos from OpenTable and Resy.
- **[Google Maps Shared List Scraper](https://apify.com/maximedupre/google-maps-shared-list-scraper)**: Turn public saved place lists into structured restaurant and venue rows.
- **[Yelp Business Review Scraper](https://apify.com/maximedupre/yelp-business-reviews)**: Collect full-text public Yelp reviews and ratings for restaurant research.
- **[DoorDash Reviews Scraper](https://apify.com/maximedupre/doordash-reviews-scraper)**: Extract public review previews from DoorDash store pages.
- **[NYC + Chicago Restaurant Inspections Scraper](https://apify.com/maximedupre/restaurant-inspections)**: Search public restaurant inspections, grades, scores, and violations in New York City or Chicago.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `location` (type: `string`):

Enter one location for the Dineout restaurant listing search.

## `keyword` (type: `string`):

Optionally enter one cuisine or dish keyword to narrow results for the selected location.

## `offersOnly` (type: `boolean`):

When enabled, return only venues with a currently published dining offer. When off, include all matching venues.

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

Optionally stop after this many eligible public restaurant listings. Leave it blank to collect all available listings for the location until the source is exhausted.

## Actor input object example

```json
{
  "location": "Bangalore",
  "offersOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (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 = {
    "location": "Bangalore",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/dineout").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 = {
    "location": "Bangalore",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/dineout").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 '{
  "location": "Bangalore",
  "maxItems": 20
}' |
apify call maximedupre/dineout --silent --output-dataset

```

## MCP server setup

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

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/NuFyecVjx7vHZsw1T/builds/cBDmrsrLRNmKdhrxo/openapi.json
