BookMyShow Scraper - Movies, Events & Showtimes
Pricing
from $1.20 / 1,000 movie, event or showtime records
BookMyShow Scraper - Movies, Events & Showtimes
Scrape BookMyShow movies and live events by city, category or URL. Extract genres, languages, posters, synopsis, cast, show dates and cinema showtimes. Includes incremental monitoring, resume support and MCP export.
Pricing
from $1.20 / 1,000 movie, event or showtime records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
BookMyShow Scraper: Movies, Events & Showtimes
BookMyShow Scraper turns BookMyShow India into a clean movies-and-events data feed. Get movie listings with cast, genres, languages and formats, live events such as concerts, comedy shows and plays with venue and pricing, and per-cinema showtimes for any city. Search a city and category, or paste exact links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two ways to find data. Search a city and category listing, or paste exact BookMyShow links: movie pages, event pages, per-day showtimes pages or city explore links.
- Three record kinds in one dataset. Movies, live events (concerts, comedy, workshops, plays, sports, activities) and per-cinema showtimes, discriminated by
kind. - Movie filters on the source's own codes. Language, genre and format narrow a search server-side; unknown codes are dropped instead of silently riding along.
- Detail enrichment on demand. Merge each listing row's synopsis, cast, director, formats and release date from its own page, with a small surcharge only on rows actually read.
- Built for monitoring. Incremental mode returns only new, updated and reappeared records on repeat runs, and unchanged records are never billed by default.
- Resume support. Continue a large pull without paying twice for records already collected.
- A refused run fails loudly instead of coming back as an empty, silent success.
Use Cases
- Cinema listing apps: feed movie showtimes, formats and availability for one or more cities into your own booking or discovery app.
- Event discovery and ticketing tools: track concerts, comedy shows, plays and sports events with venue, date, price and availability.
- Entertainment content and media teams: generate city guides, "what's on" roundups and movie previews automatically.
- Market research: monitor movie release patterns, formats and language mixes across Indian cities over time.
- Price and availability tracking: watch showtime availability status for specific movies or events on a schedule.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "movie" (also "event", "showtime") |
recordId | "movie:ET00000001" |
eventCode | "ET00000001" |
title | "Sample Movie Title" |
url | BookMyShow link to the movie, event or showtimes page |
posterUrl | poster image link (churns hourly; excluded from change detection) |
languages / genres | ["hindi", "english"] / ["drama", "action"] (movies) |
category | "movies" (also "events", "plays", "sports", "activities", "showtimes") |
regionCode | "SAMPLE" |
venueName / venueCode | "Sample Cinema" / "SAMP" (events and showtimes) |
listingSection | "Recommended Movies" (search-mode widget group; excluded from change detection) |
tags | ["2D", "UA"] |
synopsis | plot or event description (detail pages) |
duration / releaseDate | "2h 15min" / "2026-01-01" (movies, detail pages) |
censor | "UA" (movies, detail pages) |
formats | ["2D", "IMAX 2D"] (movies, detail pages) |
cast / director | ["Sample Actor"] / "Sample Director" (movies, detail pages) |
priceDisplay / availability | "Sample price display" / "Sample availability status" (events, detail pages) |
dateText / timeText | "1 Jan" / "7:00 PM" (events and showtimes) |
showDateCode / showDateTime | "20260101" / "202601011900" (showtimes only) |
sessionId / availStatus | "999999" / "1" (showtimes only) |
infoLabels / filters | ["Recliner"] / ["subtitled"] (showtimes only) |
changeType | "NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; incremental mode) |
changedFields / firstSeenAt / lastSeenAt | [] / ISO timestamp / ISO timestamp (incremental mode) |
Showtime records leave title, languages and genres empty since they represent one showing rather than the movie or event itself; movie and event records do not carry the showtime-only fields (showDateCode, showDateTime, sessionId, availStatus, infoLabels, filters).
How to Use
- Pick a mode:
search(a city and category listing) orurl(paste BookMyShow links). - For search mode, set City and Category; movies also accept language, genre and format filters. For URL mode, paste the links.
- Turn Fetch details on or off, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search movies in a city, filtered by language:
{"mode": "search","city": "mumbai","category": "movies","languages": "hindi,english","maxItems": 20}
Search live events in another city:
{"mode": "search","city": "bengaluru","category": "events","maxItems": 50}
Paste links (movie page, city explore link):
{"mode": "url","urls": ["https://in.bookmyshow.com/movies/mumbai/sample-movie-title/ET00000001","https://in.bookmyshow.com/explore/movies-pune"],"fetchDetails": true}
Incremental monitoring for a scheduled run:
{"mode": "search","city": "chennai","category": "movies","incrementalMode": true,"stateKey": "chennai-movies-daily","maxItems": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/bookmyshow-scraper").call(run_input={"mode": "search", "city": "mumbai", "category": "movies"})for record in client.dataset(run["defaultDatasetId"]).iterate_items():print(record["kind"], record["title"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/bookmyshow-scraper').call({ mode: 'search', city: 'mumbai', category: 'movies' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How the city listing is read
Each city and category serves its full listing in one page: there is no second page to walk. Max items trims how many of that page's records are returned (0 = no limit); it does not reveal more records. To get a different set, change the city, category, or the language, genre and format filters.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every record id already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same city, category and filters. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole listing, and only withemitExpired). The poster image URL and the listing widget group are excluded from change detection, so neither churning alone produces an UPDATED row.stateKeynames or shares the stored state; leave it empty to let the actor derive one automatically from the search or link settings. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (city and category listing) or url (paste BookMyShow links). |
city | string | mumbai | Search mode: the city slug, for example mumbai, national-capital-region-ncr, bengaluru, hyderabad, chandigarh, ahmedabad, pune, chennai, kolkata, kochi. Any other valid city slug from the site works. |
category | string | movies | Search mode listing: movies, events, plays, sports, or activities. |
languages | string | (none) | Movies only: comma-separated language codes, for example hindi, english, tamil. Unknown codes are dropped rather than silently ignored. |
genres | string | (none) | Movies only: comma-separated genre codes, for example action, drama, comedy. Unknown codes are dropped rather than silently ignored. |
formats | string | (none) | Movies only: comma-separated format codes, for example 2d, 3d, 4dx, imax-2d. Unknown codes are dropped rather than silently ignored. |
urls | array | sample explore link | URL mode: BookMyShow pages to read, one per line. Movie pages and live-show pages are one record each; per-day showtimes pages are one record per showing; city explore links are walked like search mode. |
maxItems | integer | 20 | Stop after this many records (0 = no limit; the run then stops when the results run out). |
maxPages | integer | 0 | Upper bound on pages walked per scope. This listing surface arrives in one server-rendered page, so a walk reads exactly that page; the bound exists for consistency and defaults wide open. |
fetchDetails | boolean | true | Read each listing row's own page and merge the richer fields (synopsis, duration, censor, release date, formats, cast, director, and for live shows date, time, venue, price display and availability). Adds a per-row surcharge only on rows actually read; refused reads are pushed without the extra fields and never charged. |
resumeFromRunId | string | (none) | Continue one interrupted run: paste a previous run ID or dataset ID. |
incrementalMode | boolean | false | Turn on for daily or recurring monitoring. Returns only new and changed records on repeat runs over the same scope. |
stateKey | string | (none) | Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to derive a key automatically from the search and link settings. |
emitUnchanged | boolean | false | Also return (and bill) records that have not changed since the last run. |
emitExpired | boolean | false | Also return (and bill) records that were present before but are no longer found. Only produced once a run has fully scanned the tracked search. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
proxyConfiguration | object | Residential, India | Apify Proxy settings. Every run uses residential India exits by default: the lane the site reliably serves. You can bring your own proxy here. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "movie","recordId": "movie:ET00000001","eventCode": "ET00000001","title": "Sample Movie Title","url": "https://in.bookmyshow.com/movies/sample-city/sample-movie-title/ET00000001","posterUrl": "https://assets-in.bmscdn.com/discovery-catalog/events/sample-poster.jpg","languages": ["hindi", "english"],"genres": ["drama", "action"],"category": "movies","regionCode": "SAMPLE","venueName": null,"venueCode": null,"listingSection": "Recommended Movies","tags": ["2D", "UA"],"synopsis": "A sample synopsis describing the plot in general terms.","duration": "2h 15min","censor": "UA","releaseDate": "2026-01-01","formats": ["2D", "IMAX 2D"],"cast": ["Sample Actor One", "Sample Actor Two"],"director": "Sample Director","priceDisplay": null,"availability": null,"dateText": null,"timeText": null}
Plan Requirement
This actor runs on the residential proxy group by default, scoped to India: that is the lane the site serves reliably, and it works out of the box without extra setup. The default groupless datacenter pool is refused on a large share of its exits, so switching away from residential is not recommended unless you bring your own proxy under Connection.
FAQ
How much does it cost?
You pay per movie, event or showtime record returned, plus a small surcharge for each row whose own detail page was read (only when Fetch details is on and the read succeeds). The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape BookMyShow?
This actor collects only publicly available listing data. You are responsible for how you use it: follow BookMyShow's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Posters, synopses and other creative assets may be subject to third-party rights.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records for the same city, category and filters, and unchanged ones are not billed by default.
Why did a run return fewer records than expected?
Each city and category listing serves its full page in one response; there is no second page to walk. Max items trims how many of that page's records come back, it does not reveal more. If you expected more, check the spelling of the city slug, clear the language, genre or format filters, or raise Max items.
Why did my run fail instead of returning an empty dataset?
If every request to the site is refused, the run stops with a clear message so "this city has nothing on today" is never confused with "nothing could be read". Run it again in a few minutes. If only some links or scopes could be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more sports data?
Pair this actor with these related scrapers from the same team:
| โฝ Eventim Scraper Scrape CTS Eventim Germany and EU event catalogue: concerts, festivals, comedy, sports... | โฝ JioHotstar Scraper Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes... |
| โฝ Sportsbook Odds Scraper (1xBet, Melbet, Linebet, Paripulse) Collect live and prematch betting odds from 1xBet, Melbet, Linebet and Paripulse. Give it... | โฝ Whatnot Scraper Scrape Whatnot live and upcoming shows, queued items and lots, and seller profiles... |
| โฝ FotMob Scraper โฝ Match Details, Stats, Lineups & Players From $0.8/1K. Pull structured football data from FotMob: match details with scores, team... | โฝ SofaScore Scraper โฝ Live Scores, Stats, Players & Odds From $1/1K. Pull structured sports data from SofaScore across football, basketball... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.