BookMyShow Scraper icon

BookMyShow Scraper

Scrape BookMyShow movies and live events by city, category or URL. Extract genres, languages, posters, synopsis, cast, show dates and cinema showtimes.…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

BookMyShow Scraper at a glance

BookMyShow Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, recordid, eventcode, url and title, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.90 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$1.90 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
27 options
Run success
95.5% of completed public runs in the last 30 days

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.

What BookMyShow Scraper can do

  • Three ways to find data. Search a city and category listing, paste exact BookMyShow links (movie pages, event pages, per-day showtimes pages or city explore links), or read the showings of chosen movies over a window of dates.
  • 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.

Choose what to collect

These inputs let you configure BookMyShow Scraper - Movies, Events & Showtimes. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch walks a city and category listing (movies, events, plays, sports, activities). URL mode reads the exact BookMyShow pages you paste. Showtimes mode returns one row per showing (cinema, time, seat-category prices, availability) for the movies and dates you choose.

Choices: search, url, showtimes

citystringSearch mode: the city slug, for example mumbai, national-capital-region-ncr, bengaluru, hyderabad, chandigarh, ahmedabad, pune, chennai, kolkata, kochi (the top ten on the site). Any other city slug from the site works too.
categorystringSearch mode: which listing to walk in the city.

Choices: movies, events, plays, sports, activities

languagesstringMovies only: comma-separated language codes, for example hindi, english, tamil, telugu, malayalam, marathi, gujarati, punjabi, kannada, assamese, korean. Unknown codes are dropped rather than silently ignored.
genresstringMovies only: comma-separated genre codes, for example action, drama, comedy, thriller, romantic, horror, sci-fi, animation, biography. Unknown codes are dropped rather than silently ignored.
formatsstringMovies only: comma-separated format codes, for example 2d, 3d, 4dx, imax-2d, 4dx-3d, epiq, mx4d, ice-3d. Unknown codes are dropped rather than silently ignored.
urlsarrayURL mode: BookMyShow pages to read, one per line. Movie pages (/movies/...) and live-show pages (/events/...) are one record each; per-day showtimes pages (buytickets links) are one record per showing; city explore links (/explore/...) are walked like search mode. Multi-value supported.
Show 20 more inputs
More input fields
InputWhat it controls
eventCodesarrayShowtimes mode: BookMyShow codes in any letter case, one per line, up to 25: ET followed by digits (movies, for example ET00451914) or the site's non-numeric form of ET plus 8 letters or digits; a full BookMyShow link containing a code also works. Showings are read from the movie showtimes pages, so use movie codes. Leave empty to use the top movies of the City's listing (see Movies to read). Ignored in search and URL mode.
maxMoviesintegerShowtimes mode with no movie codes: how many movies from the City's Now Showing listing to read, in listing order. 1 to 25.
dateModestringAUTO_DISCOVER reads today and the following days until the days run out (see Days ahead and Empty-day stop). EXPLICIT_DATES reads exactly the dates you list. DATE_RANGE reads every day from From date to To date inclusive; with no To date it reads the first day plus the 3 days after it (4 days).

Choices: AUTO_DISCOVER, EXPLICIT_DATES, DATE_RANGE

datesarrayExplicit dates mode: dates as YYYY-MM-DD, one per line, up to 14. Past dates are skipped (the site only serves today onward).
fromDatestringDate range mode: first day, YYYY-MM-DD. Defaults to today when empty or in the past.
toDatestringDate range mode: last day, YYYY-MM-DD, inclusive. The range is capped at 14 days. Empty reads the first day plus the 3 days after it (4 days).
maxDaysAheadintegerAuto discover: how many days after today to read at most. 1 to 14.
emptyDateStreakLimitintegerAuto discover: stop a movie after this many days in a row with no showings. 1 to 7.
maxItemsintegerStop after this many records (0 = no limit; the run then stops when the results run out).
maxPagesintegerUpper bound on pages walked per scope. This listing surface arrives in one server-rendered page, so the walk reads exactly that page; the bound exists for consistency and defaults wide open.
fetchDetailsbooleanRead each listing row's own page and merge the richer fields: synopsis, duration, censor, release date, formats, cast, director, and for live shows the date, time, venue details, price display and availability. Adds one detail read per returned row (a per-row surcharge applies); rows whose detail page is refused are pushed without the extra fields and never charged. Turn off to return the faster listing-shape rows only.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large pull without returning records already collected there.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. The poster image URL is excluded from change detection (it embeds a live like-count), so a poster churn alone is not an UPDATED row. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed).
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search and link settings.
emitUnchangedbooleanOff by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.
emitExpiredbooleanOff by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search.
ignoreFieldsForChangesarrayField names that must not count as a change in incremental mode, one per entry. Use dotted paths for nested values (for example showtimes.availability). A record whose only differences are in these fields stays UNCHANGED. The returned records still carry the live values. Leave empty to track every field.
mcpConnectorsarrayOptionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output.
notionParentPageUrlstringURL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

kindKind (text)
recordIdrecordId
eventCodeeventCode
urlUrl (link)
titleTitle (text)
posterUrlposterUrl
languageslanguages
genresgenres
categorycategory
regionCoderegionCode
venueNameVenue name (text)
venueCodevenueCode
Show 49 more fields
tagstags
synopsissynopsis
durationduration
censorcensor
releaseDatereleaseDate
formatsformats
castcast
directordirector
ratingrating
ratingTextratingText
ratingCountratingCount
priceDisplaypriceDisplay
availabilityavailability
dateTextdateText
timeTexttimeText
showDateCodeshowDateCode
showDateTimeShow date time (text)
sessionIdsessionId
availStatusavailStatus
infoLabelsinfoLabels
filtersfilters
sessionKeysessionKey
scrapedAtscrapedAt
citySlugcitySlug
regionNameregionName
regionSlugregionSlug
subCodesubCode
eventTitleeventTitle
venueChainvenueChain
venueUrlvenueUrl
showDateTimeUtcshowDateTimeUtc
eventLanguageeventLanguage
eventFormateventFormat
eventGenreeventGenre
censorRatingcensorRating
sessionStatussessionStatus
sessionAttributessessionAttributes
priceClassespriceClasses
priceClassCountpriceClassCount
minPriceminPrice
maxPricemaxPrice
currencycurrency
seatLayoutUrlseatLayoutUrl
cutOffAtUtccutOffAtUtc
isMTicketAvailableisMTicketAvailable
changeTypeChange type (text)
changedFieldschangedFields
firstSeenAtfirstSeenAt
lastSeenAtlastSeenAt

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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
}

Ways to use this data

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

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does BookMyShow Scraper return?

The documented output for BookMyShow Scraper includes kind, recordid, eventcode, url, title, posterurl, languages and genres. Availability of each field depends on the source page and the selected mode.

How much does BookMyShow Scraper cost?

It costs $1.90 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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.

Ready to collect with BookMyShow Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.