# District Movie Showtimes Scraper — Seats, Prices & Box Office (`yugenox/district-movie-showtimes`) Actor

Every movie showtime on District (Zomato) for any Indian city: cinema, screen, format, seat-class prices, seats sold vs available, occupancy % and estimated gross, plus daily box-office summaries per movie. PVR, INOX, Cinepolis and 2,400+ cinemas. No login.

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

## Pricing

from $1.50 / 1,000 showtimes

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

## District Movie Showtimes, Seats & Box Office Scraper (India)

Get **every movie showtime on District** for any Indian city, with the cinema, screen, format, **seat-class prices**, **seats sold vs available**, **occupancy %** and **estimated gross collection** for each show. The scraper also adds **daily box-office summaries** per movie and city.

It covers PVR, INOX, Cinepolis, Miraj, MovieMax and 2,400+ other cinemas in 1,100+ Indian cities. One run can sweep a whole city (or several) across every movie, every cinema and several days of advance booking.

### What you can do with it

- **Track box office and advance bookings.** Schedule it daily and chart occupancy and estimated gross per movie, city and day, the way trade trackers do. Use *Summaries only* for a compact feed.
- **Monitor ticket prices.** Get prices per seat class (Executive, Royal, Recliner, IMAX, 4DX, and so on) by chain and city, including weekday vs weekend.
- **Plan releases and screens.** See how many shows and cinemas each title gets, the format split (2D / 3D / IMAX / 4DX / MX4D) and which chains carry it.
- **Analyse cinemas.** Get every show at a specific cinema with a per-movie breakdown, or pull a full cinema directory with addresses, coordinates and amenities.
- **Power a showtimes app, bot or newsletter** with clean, structured JSON.

### Input

| Field | What it does |
|---|---|
| **What to scrape** | `showtimes` (default), `movies` (now-showing list), or `cinemas` (cinema directory). |
| **Cities** | e.g. `mumbai`, `delhi-ncr`, `bengaluru`, `hyderabad`, `chennai`, `pune`, `kolkata`, `ahmedabad`. Common names such as Bangalore, Delhi and Gurugram work too. `top` = District's 12 top cities, `all` = every city (capped by *Max cities*). |
| **Movies** | Optional. A title or part of one (`Vvaan`), a District movie URL, or a content id. Leave empty for all movies. |
| **Cinemas** | Optional. District cinema URLs or ids. Returns every show at those cinemas. |
| **Days ahead / Specific dates** | Today only by default. Dates are India time. |
| **Languages / Screen formats / Cinema chains** | Optional filters, e.g. `Tamil`, `IMAX`, `PVR`. |
| **Daily box-office summaries** | Adds one summary row per movie, city and date. On by default. |
| **Summaries only** | Returns only the summary rows. |
| **Include seat classes** | Adds the per-class price and seat breakdown to each show. |
| **Max results** | Stops after this many rows. |

#### Example: every show in Mumbai today

```json
{ "cities": ["mumbai"] }
```

#### Example: advance booking for one film across the top cities, summaries only

```json
{ "cities": ["top"], "movies": ["The Vvaan"], "daysAhead": 7, "summariesOnly": true }
```

#### Example: IMAX and 4DX shows at PVR/INOX in Delhi-NCR this weekend

```json
{ "cities": ["delhi-ncr"], "formats": ["IMAX", "4DX"], "chains": ["PVR", "INOX"], "dates": ["2026-09-26", "2026-09-27"] }
```

#### Example: all shows at one cinema for the next 3 days

```json
{ "cinemaIds": ["https://www.district.in/movies/pvr-market-city-kurla-w-mumbai-in-mumbai-CD1022270"], "daysAhead": 3 }
```

### Output

Every row has a `type` field: `showtime`, `summary`, `movie` or `cinema`.

#### Showtime row

```json
{
  "type": "showtime",
  "city": "Hyderabad", "cityKey": "hyderabad", "showDate": "2026-09-25",
  "movieName": "Avengers Endgame: Encore", "movieCode": "exr876o4uso", "contentId": 227928,
  "language": "English", "screenFormat": "3D", "censor": "UA16+", "genres": ["Action", "Adventure", "Fantasy"],
  "runtimeMin": 185, "releaseDate": "2026-09-25",
  "cinemaId": 126, "cinemaName": "Cinepolis CCPL Mall, Malkajgiri, Hyderabad", "chain": "Cinepolis",
  "address": "CCPL Mall, Vimala Devi Nagar Colony, Malkajgiri, Secunderabad, Telangana 500047, India",
  "pincode": "500047", "lat": 17.457209, "lon": 78.53692,
  "screen": "AUDI 4", "experience": null, "subtitle": null,
  "showTime": "2026-09-25T08:50", "showTimeIso": "2026-09-25T08:50:00+05:30", "showTimeUtc": "2026-09-25T03:20:00Z",
  "availability": "available",
  "totalSeats": 147, "availableSeats": 132, "soldSeats": 15, "occupancyPct": 10.2,
  "minPrice": 240, "maxPrice": 290, "estimatedGrossINR": 4350, "seatDataComplete": true,
  "seatClasses": [
    { "label": "EXECUTIVE", "price": 240, "totalSeats": 24, "availableSeats": 24, "soldSeats": 0, "availability": "available" },
    { "label": "PREMIUM", "price": 290, "totalSeats": 123, "availableSeats": 108, "soldSeats": 15, "availability": "available" }
  ],
  "maxTicketsPerBooking": 6,
  "movieUrl": "https://www.district.in/movies/avengers-endgame-encore-movie-tickets-in-hyderabad-MV227928",
  "cinemaUrl": "https://www.district.in/movies/cinepolis-ccpl-mall-malkajgiri-hyderabad-in-hyderabad-CD126",
  "scrapedAt": "2026-09-24T08:10:44.645Z"
}
```

#### Summary row (one per movie, city and date)

```json
{
  "type": "summary", "scope": "movie",
  "city": "Delhi-NCR", "showDate": "2026-09-24", "movieName": "Hanuman Ansh", "language": "Hindi",
  "shows": 652, "cinemas": 125, "totalSeats": 132541, "soldSeats": 12075, "availableSeats": 120466,
  "occupancyPct": 9.1, "estimatedGrossINR": 3249870, "grossComplete": true, "avgTicketPrice": 269,
  "minPrice": 99, "maxPrice": 1200, "soldOutShows": 0, "fillingFastShows": 10,
  "formats": { "2D": 652 }, "chains": { "PVR": 303, "Cinepolis": 115, "miraj": 53, "Wave": 23 },
  "firstShow": "2026-09-24T13:35", "lastShow": "2026-09-24T23:55",
  "movieUrl": "https://www.district.in/movies/hanuman-ansh-movie-tickets-in-delhi-ncr-MV225612"
}
```

*(chains trimmed to the top 4 here; the real row lists every chain)*

With **Cinemas** input, the summary is one row per cinema and date, with a `movies` breakdown (shows, sold seats and estimated gross per movie).

**Movies mode** returns the now-showing list per city: title, language, format, censor rating, genres, runtime, release date, popularity rank, session count, poster and link.
**Cinemas mode** returns the directory: name, chain, address, pincode, coordinates, amenities and session count.

### How the numbers work

- **Sold seats** = total seats minus seats still bookable online at the moment of the scrape. Some cinemas, especially single screens, keep part of the house for counter sales, so for them "sold" means *not available online*.
- **Estimated gross** = the sum over seat classes of sold seats × ticket price. It is an estimate: it excludes convenience fees and taxes and does not include offers or counter sales. When a show has incomplete seat data, its gross is `null` and `seatDataComplete` is `false`, never a guess.
- **Show times** are Indian Standard Time: `showTime` is the local wall-clock time, `showTimeIso` carries the `+05:30` offset and `showTimeUtc` is the same moment in UTC. `showDate` is the booking date the show is listed under.
- **Today's list only has upcoming shows.** Once a show starts, District stops listing it. To capture a whole day, scrape it before the first show (the night before or early morning). Or run several times a day and keep the latest snapshot of each show (`cinemaId` + `sessionId`).
- **Occupancy changes all day.** Schedule runs at fixed times so days compare like for like.

### FAQ

**Which cities are covered?** Every city District lists for movies (1,100+). The big ones are Mumbai, Delhi-NCR, Bengaluru, Hyderabad, Chennai, Kolkata, Pune, Ahmedabad, Jaipur, Lucknow, Kochi, Chandigarh and more. Gurgaon, Noida and New Delhi return the same cinemas as Delhi-NCR. When cities share cinemas, each show is output once.

**How far ahead can I scrape?** As far as District has opened bookings. That is usually the coming week, and several weeks for big releases. Dates without shows are skipped.

**Why does a summary count more shows than the showtime rows?** Summaries always cover the whole movie and day. If *Max results* stops the run early, fewer individual showtimes are output than the summary counts.

**How fast is it?** A whole city for one day (40–60 movies, 1,000–3,000 shows) takes 10–40 seconds. Three big cities over two days (8,000+ shows) take about a minute. A 200-row sample finishes in about 10 seconds.

**Do I need a proxy?** The default Apify datacenter proxy works. If requests start getting blocked, the actor switches to Indian residential proxies automatically.

**What happens when District is slow or down?** The run still finishes successfully with whatever it collected and a status message that says exactly what happened (for example "Partial — stopped before the run timeout: 1,199 showtimes, 14 summaries"). Requests are retried on fresh IPs with backoff; the run stops shortly before its timeout (20 % of the timeout, 75 s at most) so results are always saved. If your timeout is too short for any data to arrive, the run says so and which timeout to use — 0 items, no charge. A one-city run usually finishes in 5–30 s, so a 60 s timeout or more is safe. You are only ever charged for rows that are in the dataset. A `RUN_REPORT` record in the run's key-value store lists counts, failures and proxy details.

**Field names.** `maxResults`, `limit`, `city`, `movie`, `date`, `days`, `language`, `format` and `chain` are accepted as aliases for the documented inputs; mode names are case-insensitive (`theatres` works for `cinemas`).

**Can I get the seat map (which exact seats are free)?** No. The actor reports seat counts per class, not individual seat positions.

**Is it legal to scrape District?** This actor collects only public information that District shows to every visitor without an account: movie titles, showtimes, cinema names and addresses, ticket prices and seat availability counts. Scraping publicly available data is generally legal, but you are responsible for how you use the results: follow the laws that apply to you (such as GDPR, PIPEDA or CCPA) and District's terms, and check with a lawyer if you are unsure. Read more in Apify's guide [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. The actor needs no District account, login, cookie or phone number, and never sees anyone's bookings, payment details or personal information. It reads the same public showtime listings the District website shows to a visitor who is not logged in. Seat numbers are totals per show and seat class, not who bought them.

**How much does it cost?** You pay per row delivered to your dataset: $1.50 per 1,000 showtimes, $5 per 1,000 daily box-office summaries, and $1 per 1,000 movie or cinema rows in the Movies and Cinemas modes. There is no start fee, and failed requests, skipped cities and rows beyond your charge limit are never billed. For example, all of Mumbai for one day (about 1,000 showtimes and 40 summaries) costs about $1.70, and *Summaries only* for every movie in District's top 12 cities costs about $1.60 per show date.

# Actor input Schema

## `mode` (type: `string`):

<b>Showtimes</b>: every show with seats, prices, occupancy and estimated gross (plus per-movie daily summaries). <b>Movies</b>: now-showing list per city. <b>Cinemas</b>: cinema directory per city (address, chain, coordinates, amenities).

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

Indian cities as shown on District, e.g. <code>mumbai</code>, <code>delhi-ncr</code>, <code>bengaluru</code>, <code>hyderabad</code>, <code>chennai</code>, <code>pune</code>, <code>kolkata</code>. Common names like Bangalore, Delhi or Gurugram are understood. Use <code>top</code> for District's 12 top cities or <code>all</code> for every city (capped by Max cities).

## `movies` (type: `array`):

Only these movies. Each entry can be a title or part of it (<code>Vvaan</code>), a District movie page URL, or a District content id. Leave empty for every movie showing in the city.

## `cinemaIds` (type: `array`):

Scrape every show at specific cinemas instead of by movie. Paste District cinema page URLs (…-in-mumbai-CD1022270) or cinema ids (the city then comes from Cities). Get ids from the <b>Cinemas</b> mode.

## `daysAhead` (type: `integer`):

How many days to cover, starting today (India time). 1 = today only. District opens advance booking several weeks out for big releases.

## `dates` (type: `array`):

Exact show dates as YYYY-MM-DD (India time). Overrides Days ahead.

## `languages` (type: `array`):

Only shows in these languages, e.g. Hindi, English, Tamil, Telugu, Kannada, Malayalam.

## `formats` (type: `array`):

Only these formats (partial match), e.g. <code>IMAX</code>, <code>4DX</code>, <code>3D</code>, <code>MX4D</code>, <code>2D</code>.

## `chains` (type: `array`):

Only these chains or cinema names (partial match), e.g. <code>PVR</code>, <code>INOX</code>, <code>Cinepolis</code>, <code>Miraj</code>, <code>MovieMax</code>.

## `emitSummaries` (type: `boolean`):

Add one summary row per movie, city and date: shows, cinemas, seats, sold, occupancy %, estimated gross (INR), price range, formats and chain split. For Cinemas input: one summary per cinema and date with a per-movie breakdown.

## `summariesOnly` (type: `boolean`):

Output only the summary rows (no individual showtimes) — the cheapest way to track advance bookings and estimated collections.

## `includeSeatClasses` (type: `boolean`):

Add the per-class breakdown (e.g. Executive / Royal / Recliner with price, total and available seats) to every showtime.

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

Stop after this many dataset rows (showtimes + summaries). 0 = no limit.

## `maxCities` (type: `integer`):

Cap on the number of cities. With <code>all</code> it defaults to 50 (most of District's 1,100+ towns have no cinemas).

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

Parallel requests.

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

Apify Proxy is required. The default datacenter proxy works; the actor switches to Indian residential proxies automatically if it gets blocked.

## Actor input object example

```json
{
  "mode": "showtimes",
  "cities": [
    "mumbai"
  ],
  "daysAhead": 2,
  "emitSummaries": true,
  "summariesOnly": false,
  "includeSeatClasses": true,
  "maxItems": 200,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped showtimes and box-office summaries.

## `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 = {
    "cities": [
        "mumbai"
    ],
    "daysAhead": 2,
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/district-movie-showtimes").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"],
    "daysAhead": 2,
    "maxItems": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/district-movie-showtimes").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"
  ],
  "daysAhead": 2,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/district-movie-showtimes --silent --output-dataset

```

## MCP server setup

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

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/TBB0V17yWLhIzQMjq/builds/V3D8XjrZ4Q2YuAJuS/openapi.json
