BookMyShow Scraper - Movies, Events & Showtimes avatar

BookMyShow Scraper - Movies, Events & Showtimes

Pricing

from $1.20 / 1,000 movie, event or showtime records

Go to Apify Store
BookMyShow Scraper - Movies, Events & Showtimes

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

Abot API

Maintained by Community

Actor 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.

FieldExample
kind"movie" (also "event", "showtime")
recordId"movie:ET00000001"
eventCode"ET00000001"
title"Sample Movie Title"
urlBookMyShow link to the movie, event or showtimes page
posterUrlposter 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"]
synopsisplot 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

  1. Pick a mode: search (a city and category listing) or url (paste BookMyShow links).
  2. For search mode, set City and Category; movies also accept language, genre and format filters. For URL mode, paste the links.
  3. Turn Fetch details on or off, and set Max items to control run size and cost.
  4. 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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole listing, and only with emitExpired). The poster image URL and the listing widget group are excluded from change detection, so neither churning alone produces an UPDATED row. stateKey names 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.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestringsearchsearch (city and category listing) or url (paste BookMyShow links).
citystringmumbaiSearch 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.
categorystringmoviesSearch mode listing: movies, events, plays, sports, or activities.
languagesstring(none)Movies only: comma-separated language codes, for example hindi, english, tamil. Unknown codes are dropped rather than silently ignored.
genresstring(none)Movies only: comma-separated genre codes, for example action, drama, comedy. Unknown codes are dropped rather than silently ignored.
formatsstring(none)Movies only: comma-separated format codes, for example 2d, 3d, 4dx, imax-2d. Unknown codes are dropped rather than silently ignored.
urlsarraysample explore linkURL 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.
maxItemsinteger20Stop after this many records (0 = no limit; the run then stops when the results run out).
maxPagesinteger0Upper 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.
fetchDetailsbooleantrueRead 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.
resumeFromRunIdstring(none)Continue one interrupted run: paste a previous run ID or dataset ID.
incrementalModebooleanfalseTurn on for daily or recurring monitoring. Returns only new and changed records on repeat runs over the same scope.
stateKeystring(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.
emitUnchangedbooleanfalseAlso return (and bill) records that have not changed since the last run.
emitExpiredbooleanfalseAlso return (and bill) records that were present before but are no longer found. Only produced once a run has fully scanned the tracked search.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
proxyConfigurationobjectResidential, IndiaApify 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.

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.