# Bookmyshow Scraper (`mrdoe/bookmyshow-scraper`) Actor

- **URL**: https://apify.com/mrdoe/bookmyshow-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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

Search BookMyShow by Indian city and category — concerts, plays, sports, activities, and movies — then pull full event details including venue, date, and ticket pricing where BookMyShow itself publishes it.

### What it does

This Actor has two modes:

- **Search a city/category** — pick a city (Mumbai, Delhi NCR, Bengaluru, and every other city BookMyShow covers) and a category, and it returns everything currently listed: title, venue, category tags, a starting price where shown, and a link to the full page.
- **Get event or movie details** — give it one or more BookMyShow page URLs (your own, or copied straight from this Actor's own search results) and it returns the full record: description, cover image, full venue address with coordinates, date/time, language/genre, and ticket-tier pricing when the event page publishes it.

Covers all of BookMyShow's own categories: concerts & events, movies, plays & theatre, sports, and activities.

### Why use it

- Build or feed a local/regional India events calendar or discovery app
- Track when concerts, sporting fixtures, or shows go on sale in a given city, and at what price
- Monitor movie and event coverage across multiple Indian cities in one run
- Get venue name, full address, and latitude/longitude for mapping or venue intelligence
- Pull ticket-tier pricing (e.g. Platinum/Gold/Standing) for events that publish it, not just a single headline price

### What makes this different

- **India-first, not a generic ticketing wrapper** — built specifically around BookMyShow's own city and category structure, the dominant way Indian audiences discover concerts, sports, theatre and movies.
- **Two clean operations** instead of one do-everything crawl — search cheaply across a city, then only fetch full details for the events you actually care about.
- **Venue intelligence built in** — venue name, full address, and latitude/longitude on every detail row, not just a text address.
- **Real ticket-tier pricing** for events that publish it — every seating/ticket category with its own price, not just a single "from" number.
- Honest output: fields BookMyShow itself doesn't publish for a given listing come back as `null`, never guessed.

### Data table

| Field                                                                                            | Search | Details          |
| ------------------------------------------------------------------------------------------------ | ------ | ---------------- |
| `id`, `title`, `url`, `type`, `category`, `image`                                                | ✅     | ✅               |
| `venueName`                                                                                      | ✅     | ✅               |
| `venueAddress`, `venueCity`, `venueRegion`, `venuePostalCode`, `venueLatitude`, `venueLongitude` | —      | ✅               |
| `startDate`, `endDate`, `doorTime`, `duration`                                                   | —      | ✅               |
| `description`, `language`, `genre`                                                               | —      | ✅               |
| `priceFrom` (best-effort), `tags`                                                                | ✅     | —                |
| `priceFrom`, `priceTo`, `currency`, `ticketTiers`, `availability`                                | —      | ✅ (events only) |

### How to use

1. [Sign up](https://apify.com/sign-up) for a free Apify account.
2. Open this Actor and click **Try for free** (or **Start**).
3. Choose an **Operation**:
   - **Search a city/category** — pick a **City** (e.g. `mumbai`, `delhi-ncr`, `bengaluru`) and a **Category**.
   - **Get event or movie details** — paste one or more **Event/movie URLs**.
4. Leave **Proxy configuration** on (required for reliable results).
5. Click **Start** and export results as JSON, CSV, Excel, or via the API.

### Input

| Field                | Type    | Required | Default     | Description                                                                                                                                                                                                                 |
| -------------------- | ------- | -------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `operation`          | string  | Yes      | `search`    | `"search"` or `"productDetails"`.                                                                                                                                                                                           |
| `category`           | string  | No       | `events`    | `"events"`, `"movies"`, `"plays"`, `"sports"`, or `"activities"` (used when `operation` is `"search"`).                                                                                                                     |
| `city`               | string  | No       | `mumbai`    | BookMyShow city slug, e.g. `mumbai`, `delhi-ncr`, `bengaluru`, `pune`, `hyderabad`, `chennai`, `kolkata`.                                                                                                                   |
| `cities`             | array   | No       | `[]`        | Multiple city slugs in one run; overrides `city` when provided.                                                                                                                                                             |
| `urls`               | array   | No       | `[]`        | BookMyShow event/movie page URLs (used when `operation` is `"productDetails"`). Leave empty to auto-fetch details for a live sample result instead.                                                                         |
| `maxItems`           | integer | No       | `20`        | Maximum rows returned per city/category search. `0` = unlimited (still capped by however many BookMyShow itself lists for that city/category). Not applied to `"productDetails"` - every URL you provide is always fetched. |
| `proxyConfiguration` | object  | Yes      | Residential | Apify Proxy is required; Residential is used by default for reliable results.                                                                                                                                               |

### Output

Each dataset item is one event or movie. A `_operation` field marks which mode produced it, and `type` marks whether the row is a `"movie"` or a ticketed `"event"` (concert/play/sport/activity) - see the [Data table](#data-table) for which fields each mode fills in.

#### Example item (`productDetails`, event)

```json
{
    "_operation": "productDetails",
    "status": "ok",
    "type": "event",
    "id": "ET00511865",
    "title": "LEGACY WORLD TOUR - UDIT NARAYAN X ADITYA NARAYAN",
    "url": "https://in.bookmyshow.com/events/udit-narayan-live-in-concert/ET00511865",
    "category": "events",
    "image": "https://assets-in.bmscdn.com/nmcms/events/banner/desktop/udit-narayan.jpg",
    "city": "Mumbai",
    "venueName": "Dublin Square, Phoenix Marketcity: Mumbai",
    "venueAddress": "Dublin Square, Lal Bahadur Shastri Marg, Kurla West, Mumbai, Maharashtra 400070, India",
    "venueCity": "Mumbai",
    "venueRegion": "MH",
    "venuePostalCode": "400070",
    "venueLatitude": 19.0863,
    "venueLongitude": 72.8888,
    "startDate": "2026-10-10T19:00:00+05:30",
    "endDate": "2026-10-10T22:00:00+05:30",
    "doorTime": "19:00",
    "duration": "PT3H",
    "language": ["Hindi"],
    "priceFrom": 1199,
    "priceTo": 9999,
    "currency": "INR",
    "ticketTiers": [
        { "name": "EB SILVER STANDING TICKET", "price": 1199, "currency": "INR", "availability": "InStock" },
        { "name": "P1 GOLD SEATING", "price": 2999, "currency": "INR", "availability": "InStock" },
        { "name": "P1 PLATINUM SEATING", "price": 3499, "currency": "INR", "availability": "InStock" },
        { "name": "MEET AND GREET", "price": 9999, "currency": "INR", "availability": "InStock" }
    ],
    "availability": "InStock",
    "scrapedAt": "2026-09-15T03:09:36.725Z",
    "errorMessage": null
}
```

### Usage examples

**Browse concerts and events in a city:**

```json
{ "operation": "search", "category": "events", "city": "mumbai", "maxItems": 30 }
```

**Browse now-showing movies in a city:**

```json
{ "operation": "search", "category": "movies", "city": "delhi-ncr" }
```

**Search several cities in one run:**

```json
{ "operation": "search", "category": "sports", "cities": ["mumbai", "bengaluru", "chennai"] }
```

**Get full details for a specific event:**

```json
{
    "operation": "productDetails",
    "urls": [{ "url": "https://in.bookmyshow.com/events/udit-narayan-live-in-concert/ET00511865" }]
}
```

### Known Limitations

- Search returns BookMyShow's own city/category listing as-is - typically 20-35 items per city/category. There is no further "load more" surface behind it, so `maxItems` above that ceiling won't produce more rows than BookMyShow itself is currently listing for that combination.
- Ticket-tier pricing (`ticketTiers`, `priceFrom`/`priceTo`) is published for most concerts, plays, sports and activities, but not for movies - a movie's own showtime/seat pricing is only shown once a specific cinema and showtime are selected, which is out of scope for a details page. `priceFrom` on search rows is best-effort and only present when BookMyShow's own listing card shows a starting price.
- A city/category combination with genuinely nothing on sale (e.g. a smaller city with no current activities listings) returns zero rows - this is real BookMyShow inventory, not a scraper failure.
- City names must match BookMyShow's own URL slugs (e.g. `delhi-ncr`, not `delhi` or `new delhi`) - check a city's URL on bookmyshow.com if a search returns nothing unexpectedly.

### FAQ

**Is this legal?** This Actor only collects publicly available event and movie listing data from BookMyShow's own pages. It is not affiliated with or endorsed by BookMyShow. You are responsible for complying with BookMyShow's Terms of Service and applicable data-protection law for your use case.

**Which cities are supported?** Any city BookMyShow itself covers - use the same city slug BookMyShow uses in its own URLs (e.g. `mumbai`, `delhi-ncr`, `bengaluru`, `pune`, `hyderabad`, `chennai`, `kolkata`, `ahmedabad`, `chandigarh`, `jaipur`, `kochi`).

**Can I search and get full details in one run?** Run `search` first to discover events cheaply, then feed the `url` values you want into a `productDetails` run - this keeps costs down since you only pay for full detail on events you actually need.

**Why is ticket pricing sometimes missing?** BookMyShow doesn't publish structured ticket pricing for every listing - movies in particular only show pricing once a cinema and showtime are picked. This Actor never fabricates a price; it returns exactly what the page itself publishes.

Found a bug or have a feature request? Use the Issues tab on this Actor's Apify Store page.

### Legal

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by BookMyShow. It collects only publicly available data. Use of the output is your responsibility, including compliance with BookMyShow's Terms of Service and any applicable laws.

# Actor input Schema

## `operation` (type: `string`):

"search" browses a city + category listing. "productDetails" fetches full details for specific BookMyShow page URLs.

## `category` (type: `string`):

Which BookMyShow listing to browse (used when operation is "search").

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

BookMyShow city slug, e.g. "mumbai", "delhi-ncr", "bengaluru", "pune", "hyderabad", "chennai", "kolkata", "ahmedabad", "chandigarh", "jaipur", "kochi", "lucknow", "indore", "goa". Used when operation is "search".

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

Optional list of city slugs to run the same category search across. Overrides "City" when provided.

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

BookMyShow event or movie page URLs to fetch full details for (used when operation is "productDetails"). Copy these from BookMyShow or from this Actor's own search results. Leave empty to auto-fetch details for the top result of a default search instead.

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

Maximum number of rows to return per city/category search. Set to 0 for unlimited (BookMyShow's own listing page still caps the real ceiling, typically 20-35 per city/category). Not applied to "productDetails" - every requested URL is always fetched.

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

Proxy settings for the run. BookMyShow runs bot-detection that a Residential proxy clears far more reliably than datacenter IPs at sustained volume, so Residential is used by default.

## Actor input object example

```json
{
  "operation": "search",
  "category": "events",
  "city": "mumbai",
  "cities": [],
  "urls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "operation": "search",
    "category": "events",
    "city": "mumbai",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/bookmyshow-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 = {
    "operation": "search",
    "category": "events",
    "city": "mumbai",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/bookmyshow-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 '{
  "operation": "search",
  "category": "events",
  "city": "mumbai",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mrdoe/bookmyshow-scraper --silent --output-dataset

```

## MCP server setup

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