# Bookmyshow Seat Availability Scraper (`monknwarriors/bookmyshow-seat-availability-scraper`) Actor

Paste BookMyShow showtime links, get back exactly which seats are free and which are booked — seat by seat, or as an occupancy summary per showtime.

- **URL**: https://apify.com/monknwarriors/bookmyshow-seat-availability-scraper.md
- **Developed by:** [Monk N Warriors](https://apify.com/monknwarriors) (community)
- **Categories:**
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 showtime seats reads

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

## BookMyShow Cinema Seat Availability & Occupancy Scraper

Paste BookMyShow showtime links, get back exactly which seats are free and
which are booked — seat by seat, with category, row, seat number, price, and
seat type (including BookMyShow's "Best Seat" picks) — or as a simple
occupancy summary per showtime. Every row also carries the cinema chain,
movie language, format, and censor rating.

Built for cinema analysts, dynamic-pricing tools, film distributors tracking
opening-weekend demand, and anyone who needs occupancy signals that
BookMyShow's own app doesn't expose in bulk.

### How to use it

1. Get a showtime link from BookMyShow — the page you land on after picking
   a showtime and clicking through to choose seats. It looks like:
   `https://in.bookmyshow.com/movies/city/seat-layout/ET00XXXXXX/PPAM/38561/20260906`
   (The **BookMyShow Movie Showtimes & Cinema Schedule Scraper** produces
   these links ready-made, in its "Seat layout link" column — the two
   Actors are designed to be used together.)
2. Paste one or more of these links into **Showtime links**.
3. Run it.

### What you get

**Pick one grain with the *Level of detail* input; the whole dataset is
that grain**, so it's flat and every column has data (no empty columns, no
nested `by_category/0/…` that breaks a CSV):

- **`SEAT_MAP`** (default) — one row per seat: category, row, number,
  price, seat type, status (`AVAILABLE` / `BOOKED`). "Best Seat" and
  accessible seats count as `AVAILABLE`.
- **`OCCUPANCY_BY_CATEGORY`** — one row per seat category per showtime:
  total / booked / available / occupancy %.
- **`OCCUPANCY_SUMMARY`** — one row per showtime: whole-screen totals plus
  a readable `by_category` line.

(The old `SEATS_AND_SUMMARY` / `SUMMARY_ONLY` names still work.)

#### Example `SEAT_MAP` row

```json
{
  "row_type": "SEAT",
  "event_title": "Mirzapur: The Movie",
  "movie_language": "Hindi",
  "movie_format": "2D",
  "censor_rating": "A",
  "city": "Mumbai",
  "venue_name": "Cinepolis: Nexus Seawoods, Nerul, Navi Mumbai",
  "venue_chain": "Cinepolis",
  "venue_chain_code": "CNPL",
  "show_time": "10:00 AM",
  "category": "RECLINER",
  "row": "K",
  "seat_no": "9",
  "status": "AVAILABLE",
  "seat_type": "Best Seat",
  "price": "800"
}
```

#### Example `OCCUPANCY_BY_CATEGORY` row

```json
{
  "row_type": "CATEGORY",
  "event_title": "Mirzapur: The Movie",
  "city": "Mumbai",
  "venue_name": "Cinepolis: Nexus Seawoods, Nerul, Navi Mumbai",
  "venue_chain": "Cinepolis",
  "show_time": "10:00 AM",
  "category": "RECLINER",
  "total_seats": 14,
  "booked_seats": 2,
  "available_seats": 12,
  "occupancy_pct": 14.29
}
```

#### Example `OCCUPANCY_SUMMARY` row

```json
{
  "row_type": "SUMMARY",
  "event_title": "Mirzapur: The Movie",
  "city": "Mumbai",
  "venue_name": "Cinepolis: Nexus Seawoods, Nerul, Navi Mumbai",
  "venue_chain": "Cinepolis",
  "show_time": "10:00 AM",
  "total_seats": 197,
  "booked_seats": 10,
  "available_seats": 187,
  "occupancy_pct": 5.08,
  "category_count": 4,
  "by_category": "RECLINER 2/14 | PREMIUM 8/117 | EXECUTIVE 0/51 | NORMAL 0/15"
}
```

### A note on failed links

Not every link will succeed — a showtime may have sold out its browsing
window, been rescheduled, or hit a temporary block. Failed links **cost you
nothing** and never produce a row in the results; instead, they show up in
the **run report** with a reason. Check there if your row count is lower
than the number of links you provided.

### Inputs at a glance

| Field | Required | Description |
|---|---|---|
| Showtime links | ✓ | Up to 100 BookMyShow seat-layout links |
| Level of detail | – | Seat by seat (default), occupancy by category, or occupancy summary |

Full field list and defaults are in the Input tab.

### Pricing

This Actor uses **pay-per-event pricing** — you're charged per showtime
successfully read, not for compute time, retries, or failed links. See the
Pricing tab for the current rate.

### Good to know

- Data reflects **public seat-availability information** shown to any
  BookMyShow user browsing that showtime — no login or personal data is
  accessed.
- This Actor is **not affiliated with, endorsed by, or sponsored by
  BookMyShow**. It's an independent tool for aggregating publicly displayed
  availability data.
- Occupancy changes constantly as people book — treat each run as a
  snapshot at the time it ran, not a live feed.
- A small number of cinemas don't show a complete seat map upfront and need
  a category picked first — these may not return seat data.
- You're responsible for using the data in a way that complies with
  BookMyShow's Terms of Service and applicable law in your jurisdiction.

### Questions or issues?

Use the **Issues** tab on this Actor's page, or the developer contact link on
this page, if a run behaves unexpectedly or you'd like a feature added.

# Actor input Schema

## `showtimeUrls` (type: `array`):

Paste one or more BookMyShow seat-layout links — the page you land on after picking a showtime and clicking through to choose seats. Looks like https://in.bookmyshow.com/movies/ahmedabad/seat-layout/ET00505635/PPAM/38561/20260906. Up to 100 per run. The BookMyShow Movie Showtimes & Cinema Schedule Scraper's output has these ready-made in its "Seat layout link" column.

## `outputMode` (type: `string`):

One grain per run, so every column has data. "Seat by seat": one row per seat (category, row, number, status, price). "Occupancy by category": one row per seat category per showtime. "Occupancy summary": one row per showtime.

## `sessionRetries` (type: `integer`):

Extra attempts if reading a showtime's seats fails the first time — residential proxy connections occasionally drop mid-load, and a retry with a fresh page usually clears it.

## `sessionDelay` (type: `number`):

A short cooldown between showtimes to avoid being rate-limited.

## `pageRecycleEvery` (type: `integer`):

Keeps memory use in check on long runs. 0 disables this.

## `blockHeavyAssets` (type: `boolean`):

None of these carry seat data, and skipping them cuts data usage (and your cost) substantially. Only turn this off if a run starts failing to load pages properly.

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

Leave this on the default (Residential, India) — BookMyShow expects requests to come from an Indian IP address and blocks ones that don't.

## Actor input object example

```json
{
  "outputMode": "SEAT_MAP",
  "sessionRetries": 2,
  "sessionDelay": 1.5,
  "pageRecycleEvery": 25,
  "blockHeavyAssets": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# Actor output Schema

## `seatAvailability` (type: `string`):

The default dataset. One row per seat (category, row, seat number, booked or available) in the default mode, or one row per showtime with occupancy totals in Summary mode.

## `seatAvailabilityCsv` (type: `string`):

The same data as a spreadsheet-friendly CSV file.

## `runReport` (type: `string`):

Which showtime links succeeded, which failed and why, and which weren't attempted — one entry per link you provided.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("monknwarriors/bookmyshow-seat-availability-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("monknwarriors/bookmyshow-seat-availability-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 '{}' |
apify call monknwarriors/bookmyshow-seat-availability-scraper --silent --output-dataset

```

## MCP server setup

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