District Seat Availability Scraper avatar

District Seat Availability Scraper

Pricing

from $50.00 / 1,000 seat map reads

Go to Apify Store
District Seat Availability Scraper

District Seat Availability Scraper

Reads the live seat map for a District (district.in) movie showtime — every seat's row, number, price class and whether it's booked — and an occupancy summary per showtime.

Pricing

from $50.00 / 1,000 seat map reads

Rating

0.0

(0)

Developer

Monk N Warriors

Monk N Warriors

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

District Cinema Seat Availability & Occupancy Scraper

Read the live seat map for a District (district.in) movie showtime — every seat's row, number, seating class, and whether it's free — plus an occupancy summary for the whole showtime.

Built to pair with the District Movie Showtimes & Cinema Schedule Scraper: it puts a ready-made seat_layout_ref on every showtime row — paste that column in here.


What you can do with it

  • Measure true occupancy of a showtime, seat by seat, not just a rough count.
  • Track how a show fills up over hours or days by re-running on the same showtimes.
  • See which rows / classes sell first (front vs back, recliner vs classic).
  • Spot block bookings and seating patterns.
  • Locate a screen's wheelchair-accessible seats.

Input

FieldDescription
ShowtimesThe showtimes to read. Paste the seat_layout_ref values — or whole rows — from the District Movie Showtimes Scraper's output. Up to 200 per run.
Level of detailOne grain per run: Seat by seat (default), Occupancy by price class, or Occupancy summary.
Retries per showtime / Pause between showtimesReliability knobs (defaults 2 and 1.5s).
ProxyResidential, India by default — District only serves Indian IPs.

Minimal input:

{
"showtimes": [
{
"cinemaId": 1023314, "sessionId": "20668", "providerId": 1707,
"moviecode": "OB7YWB", "movieFormatCode": "n5N_fTqZr8", "contentId": "181196",
"cityKey": "mumbai", "sessionDate": "2026-09-08", "screenFormat": "2D"
}
]
}

Output

The dataset is flat — no nested columns — so it opens cleanly in Excel / Google Sheets. Pick one grain with the Level of detail input; the whole dataset is that grain, so every column has data (no empty columns to scroll past):

  • SEAT_MAP (default) — one row per physical seat: its class, price, row, number and status.
  • OCCUPANCY_BY_CLASS — one row per seating class per showtime: occupied / available per class.
  • OCCUPANCY_SUMMARY — one row per showtime: whole-screen occupancy.

Every row carries the movie / cinema / showtime identity — session_key, movie_title, …, cinema_address, latitude, longitude, screen_name, show_datetime_ist — read straight from District's response, so they're filled even for a bare pipe-string reference. Each showtime's occupancy also lands in the run's RUN_REPORT.

Two availability numbers — read this

District exposes seat availability two ways and they don't always agree:

  • the seat-selection layout — the grid its booking page renders and you click seats on. This scraper reads it: seat_status / seat_is_open per seat, tallied into seats_open / area_seats_open / class_seats_open.
  • District's own availability badge — the "N seats available" figure on the showtime list. Carried as the district_* columns (district_seats_available, district_class_available, …).

For most cinemas they match. For PVR / INOX, District marks the layout representational (layout_is_representational = true) — the arrangement may not match the auditorium and the two counts can differ by a handful of seats. Both are in every row so you can compare and pick whichever your own spot-check of district.in agrees with.

SEAT_MAP grain — one row per seat

{
"row_type": "SEAT",
"session_key": "district|mumbai|225612|1023314|20693|2026-09-09",
"movie_title": "Hanuman Ansh",
"cinema_name": "MovieMax Andheri (E), Mumbai",
"show_datetime_ist": "2026-09-09T05:50:00+05:30",
"area_code": "MR", "area_label": "PRIME PLUS ROWS",
"area_price": 99.0, "area_currency": "INR",
"phys_row": "N",
"seat_number": "17",
"seat_status": "0",
"seat_kind": "standard",
"seat_is_open": true,
"seat_is_taken": false,
"is_accessible": false,
"class_seats_open": 40, "class_seats_total": 44,
"district_class_available": 40, "district_class_total": 44,
"layout_is_representational": true
}
FieldMeaning
area_code / area_labelSeating class, e.g. CLASSIC ROWS, PRIME ROWS, RECLIINER ROWS.
area_price / area_currencyThe price of this seat's ticket.
phys_row / seat_numberThe seat's row label and number.
seat_statusDistrict's raw code from the seat layout (see table).
seat_kindstandard, occupied, wheelchair, wheelchair_companion, accessible, unknown.
seat_is_open / seat_is_takenOpen (selectable) / taken in District's seat layout.
is_accessibleWheelchair / companion seat.
class_seats_open / class_seats_totalThis seat's class, tallied from the layout.
district_class_available / district_class_totalDistrict's own count for the class — compare with class_seats_open.
layout_is_representationaltrue for PVR / INOX (layout approximate — see above).

Seat status values (from District's messages map):

seat_statusMeaning
0Open in the layout
1Taken in the layout
1000Wheelchair-reserved seat — bookable
1001Wheelchair companion seat — bookable
1002Accessibility seat — bookable

OCCUPANCY_BY_CLASS grain — one row per class per showtime

{
"row_type": "AREA",
"session_key": "district|mumbai|181196|1023314|20668|2026-09-08",
"area_code": "QR", "area_label": "PRIME ROWS",
"area_price": 300.0,
"area_currency": "INR",
"area_in_seat_grid": true,
"area_seats_total": 206,
"area_seats_taken": 184,
"area_seats_open": 22,
"area_occupancy_pct": 89.32,
"area_status_color": "Y",
"district_seats_available": 79, "district_seats_total": 206,
"layout_is_representational": true
}
FieldMeaning
area_code / area_labelThe seating class.
area_price / area_currencyIts ticket price.
area_in_seat_gridfalse for a class District priced but didn't return per-seat (PVR "PICTURE PERFECT") — the grid columns are then blank; district_* kept.
area_seats_total / _taken / _open / _accessibleTallied from District's seat layout.
area_occupancy_pcttaken / total for the class, from the layout.
area_status_colorThat class's own fill indicator (G / Y / R / D).
district_seats_available / district_seats_totalDistrict's own count for the class — compare with the grid columns.

OCCUPANCY_SUMMARY grain — one row per showtime

{
"row_type": "SUMMARY",
"session_key": "district|mumbai|181196|1023314|20668|2026-09-08",
"screen_name": "SCREEN 3",
"seats_total": 330,
"seats_taken": 271,
"seats_open": 59,
"seats_accessible": 2,
"occupancy_pct": 82.12,
"full_seats_total": 358,
"class_count": 5,
"classes_missing_from_grid": "PICTURE PERFECT",
"layout_is_representational": false,
"district_seats_total": 358,
"district_seats_available": 128,
"district_occupancy_pct": 64.25
}
FieldMeaning
seats_totalSeats in District's returned layout (full_seats_total reconciles any missing class).
seats_taken / seats_openTaken / open in the layout. seats_open includes bookable accessibility seats.
seats_accessibleWheelchair + companion seats.
occupancy_pctseats_taken / seats_total, from the layout.
full_seats_totalScreen capacity — seats_total plus any class missing from the map. Matches the capacity District states.
class_countNumber of AREA rows for this showtime.
classes_missing_from_gridComma-separated names of classes District priced but didn't return per-seat. Empty string when none.
district_seats_total / district_seats_available / district_occupancy_pctDistrict's own screen badge — compare with the layout counts above.
screen_nameAuditorium label.

Also written to the run's key-value store: RUN_REPORT — every showtime requested, whether it succeeded, its seat count and occupancy, and the reason for any failure.

Views

  • Overview — the run's grain, key columns only (the Console hides the columns that don't apply).

Known limitation: PVR premium tiers

For PVR cinemas, the "PICTURE PERFECT" centre-block class is not included in the seat map District returns. It still appears as an AREA row (area_in_seat_grid = false, class and size known, per-seat availability not) and is named in the SUMMARY row's classes_missing_from_grid. Every other seat on the screen is covered — typically ~90%+. Non-PVR chains (INOX, Cinepolis, MovieMax, Citylight, City Gold, …) return the full map.


Notes

  • A showtime whose booking window has already closed is reported as a failure in RUN_REPORT and is not charged.
  • Seat data is live at the moment of capture — re-run to track fill-up.
  • India only. Keep the proxy on Residential / India.

Pairs with

District Movie Showtimes & Cinema Schedule Scraper — its output has a seat_layout_ref column ready to paste straight into this Actor's input.