JioHotstar Scraper at a glance
JioHotstar Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, kind, title, show and show id, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 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
- $2.00 per 1,000 results (Free plan), from $1.70 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 14 options
Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes, sports, clips and live content, with one structured record per catalog URL including title, show name, content IDs and source URL.
What JioHotstar Scraper can do
- One record per catalog URL. The row kind, humanized title, parent show title, show id and content id are all read straight from the URL the platform itself publishes for its index, so there is no guessing about what a page might contain.
- Walk the catalog by type. Episodes, shows, movies, sport landings, live pages, clips, channels, genres and languages are all selectable, and the episode surface alone carries hundreds of thousands of rows.
- Stable, resolvable identity. Every record is a real URL you or your own systems can revisit, join against, or fetch again later.
- Built for change tracking. Incremental mode remembers a previous walk of the same catalog scope: the first run returns everything as new, later runs return only what the platform added or dropped.
- Resume a capped or interrupted walk. Point a new run at a previous run id and it skips everything already collected there, so a very large catalog type does not have to be paid for twice.
- Optional MCP export. Pipe a summary of each record into Notion, Linear, Airtable or Apify without changing what lands in the dataset.
Choose what to collect
These inputs let you configure JioHotstar Scraper - Movies, Shows, Sports & Episodes. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How the run finds catalog rows. 'sitemap' walks the site's own published catalog URL lists (the index at hotstar.com/in/new-sitemap.xml, as linked from the site's robots.txt): one content URL per row, filtered by the catalog type below. 'url' processes the content URLs you paste instead: each catalog URL returns one record, and rows are read out of the URL itself (show, show id, episode title, content id). |
mapTypestring | Which of the site's own catalog datasets to walk. EPISODE (the largest, tens of thousands of rows per map) is the default; SHOWS and MOVIE carry the show and movie landings; SPORT-related types carry the sport pages; the rest carry the smaller catalog surfaces (channels, genres, languages). |
urlsarray | Paste hotstar.com catalog URLs: show pages (https://www.hotstar.com/in/shows/show-name/000), episode pages (https://www.hotstar.com/in/shows/show-name/000/episode-name/000/watch), or movie pages (https://www.hotstar.com/in/movies/movie-name/000). Each pasted URL returns one record read out of the URL itself; the Max items cap stops the walk if you paste many. Also accepted: browse category pages (https://www.hotstar.com/in/browse/category/name/000), sport landing pages (https://www.hotstar.com/in/sports/cricket), and clip, movie, live TV and sport match /watch pages (for example https://www.hotstar.com/in/sports/cricket/match-name/000/video/highlights/watch; live, replay and highlights match pages all work, and a live match link stops existing once the event ends). The prefilled list has one example of each shape. |
maxItemsinteger | Stop after collecting this many records across all catalog maps and URLs. Set 0 for unlimited. |
maxPagesinteger | Safety bound on how many catalog map files (each up to 50,000 rows) to download per run. Leave empty (0) for no map limit: the run then stops at Max items, not here. Does not impose a separate cap below Max items. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same catalog walk, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or weekly recurring monitoring of the same catalog walk, for example to watch what the platform adds or drops from the catalog. The first run returns everything as NEW. Later runs normally return only NEW and EXPIRED records: the catalog is static per URL, so a previously seen URL never reports UPDATED. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per mode, catalog type and URL setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
Show 7 more inputs
| Input | What it controls |
|---|---|
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode, catalog type and URLs, so two different walks never mix state. |
emitUnchangedboolean | Off 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, so leave it off unless you specifically want a full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found in the catalog, marked EXPIRED. Only produced once a run has fully scanned the mapped catalog: not when Max items capped it, not when Resume was used, and not when the run was refused. This returns, and bills, extra synthetic rows, so leave it off unless you need removal tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must NOT count as a change when incremental mode compares a record with the previous run, for example showTitle or description. A plain name matches that field at any depth (also inside nested lists and objects); use dotted paths such as a.b for one specific nested field. Ignored fields are still returned in the output, they just never make a row UPDATED or appear in changedFields. Changing this list does not mark everything as UPDATED. Always ignored already: scrapedAt, detailCarriedForward. |
mcpConnectorsarray | Optionally 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 page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on records 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.
recordIdID (text)kindKind (text)titleTitle (text)showTitleShow (text)showIdShow ID (text)contentIdContent ID (text)urlURL (link)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordId": "1000200000",
"url": "https://www.hotstar.com/in/shows/sample-show/500000/sample-episode-title/1000200000/watch",
"kind": "episode",
"title": "Sample Episode Title",
"showTitle": "Sample Show Name",
"showId": "500000",
"contentId": "1000200000",
"scrapedAt": "2026-01-01T00:00:00Z"
}Ways to use this data
- Streaming catalog monitoring: track what the platform adds or removes, by show, movie or episode, on a recurring schedule.
- App and index builders: power your own search or deep-link feature with a lightweight id and title index instead of maintaining your own catalog crawl.
- Content research and archiving: build a historical record of what was listed, and when a title disappeared from the catalog.
- Catalog QA teams: confirm that a newly published show or episode URL is actually listed in the site's own catalog before announcing it elsewhere.
- Data pipelines and joins: feed stable show and content ids into a downstream system that already tracks the same titles by name.
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 JioHotstar Scraper return?
The documented output for JioHotstar Scraper includes id, kind, title, show, show id, content id, url and change type (incremental mode). Availability of each field depends on the source page and the selected mode.
How much does JioHotstar Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 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 removed titles on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode, with Emit expired records on if you also want to know what was removed. Unchanged rows are not billed.
Why did my pasted URL come back empty?
URL mode only understands catalog content pages (shows, movies, episodes, sport, clips, channels, genres, languages). Account pages and the site's search results are not catalog URLs and are reported as unread rather than guessed at.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear message so "nothing in this catalog type" is never confused with "nothing could be read". Run it again in a few minutes. If only some catalog map files could not 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.
