Twitch Scraper at a glance
Twitch Scraper is a ready-to-run Apify actor from abotapi for collecting videos data. Its documented output includes type, id, change type (incremental mode), login and display name, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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
- Videos, Social Media, Developer Tools
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 22 options
- Run success
- 97.7% of completed public runs in the last 30 days
From $1/1K. Scrape Twitch data at scale, including channels, live streams, clips, VODs, and top games. Extract HLS m3u8 stream URLs, clip MP4 downloads in multiple qualities, chapter markers, and metadata. Supports keyword search with rich, analytics-ready output.
What Twitch Scraper can do
- Ten modes in one actor. Channel profile (with clips and VODs attached), live streams by game, a game-streams alias, top games, unified search, clips, VOD lists, VOD metadata with chapters, VOD chat replay, and a URL mode that auto-detects what you paste.
- Playable media links as a default field. Each live stream and VOD metadata record carries a ready-to-play HLS playlist URL, and each clip carries direct MP4 download links in 1080p, 720p, 480p, and 360p.
- Chat history without pulling the archive yourself. VOD chat-replay records come back with the commenter, the message text, the timestamp offset, and any badges or emotes already parsed out.
- VOD chapter markers. Game-change segments with position and duration, useful for building highlight timestamps.
- Two ways to avoid re-collecting data. Resume one interrupted run by pasting its run or dataset ID, or turn on incremental mode for scheduled runs that return only new, updated, or expired records.
- Built for automation. Pipe results into Notion, Linear, Airtable, or your other Apify integrations straight from the run.
Choose what to collect
These inputs let you configure Twitch Scraper - Streams, Clips, VODs & Channel Data. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | What to scrape. Each mode reads only the inputs in its own section below. Mode precedence: the selected mode alone decides what runs; inputs in other mode sections are ignored, and URL mode reads only urls. |
channelsarray | Twitch usernames (the part after twitch.tv/) or pasted channel URLs, one per line. Example: shroud, ninja, https://www.twitch.tv/pokimane. Defaults to shroud so a bare API call in channel mode returns data. |
clipPeriodstring | Time window for clips collection. |
gameSlugstring | Category slug (from twitch.tv/directory/category/SLUG) or the category name, e.g. valorant, just-chatting or 'Just Chatting'. A name that matches no category fails the run with a clear message. |
streamSortstring | Sort order for the live stream list. |
searchQuerystring | Free-text keyword. |
keywordsarray | Search mode: run several queries in one run. Combined with Search query. Each keyword tags its rows in the keyword output field. The Max results limit applies to each keyword, so a run can return up to keywords x Max results records. |
Show 15 more inputs
| Input | What it controls |
|---|---|
videoIdsarray | Numeric video IDs (the trailing segment of a twitch.tv/videos/ID URL), one per line. Example: 2767213751. |
urlsarray | Paste any twitch.tv URLs, one per line. Mixing kinds is fine. Left untouched, 10 example URLs cover every supported URL shape (the channel-path clip form is the same as the clips.twitch.tv form): Max results is split evenly across the URLs (at least 1 each while the total allows; the run still stops at Max results, so set it to at least the number of URLs to cover every URL). |
includeMediaUrlsboolean | When true, each live stream record carries an HLS m3u8 URL and each VOD carries an HLS playlist. Adds ~1 extra request per live-stream record (other modes incur negligible extra cost). Clip MP4 URLs are always included at no extra charge. |
maxResultsinteger | Maximum records to return. 0 = the hard cap of 100000 (still capped by maxPages). In search mode with several keywords the limit applies to each keyword, so a run can return up to keywords x Max results records. In url mode it is split evenly across the URLs, at least 1 each while the total allows. |
maxItemsinteger | Alias of Max results; takes precedence when set (hard cap 100000). 0 or empty = use Max results. In search mode with several keywords it applies to each keyword, so a run can return up to keywords x Max results records. |
maxPagesinteger | Pages to walk for paginated modes (~30 items per page). 0 = walk until the source is exhausted or maxResults is hit, with a hard cap of 1000 pages. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning or charging for records already collected there. Use this after an interrupted run, or when continuing a large crawl in another run. For recurring monitoring of the same mode+filters, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED records. A record is UPDATED when any content field changes (title, game, status, tags, etc.). Live counters (viewersCount, viewCount, followersCount), rotating thumbnail URLs, signed clip media URLs, HLS playlist URLs and scrapedAt are never compared and never listed in changedFields, but stay in the output. Add more with "Ignore fields when detecting changes". Turn on "Emit unchanged" or "Emit expired" only when you also want those records returned (and billed). State is kept separately for each mode+filters setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
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 and its filters, different searches then never mix state with each other. |
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 the 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, marked EXPIRED. Only produced once a run has fully scanned the tracked scope, not when Max results/Max pages capped it, when Resume was used, or when a channel/game has more clips or videos than this run's per-target budget. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (or dotted paths such as stream.title) that are NOT compared when deciding whether a record changed; they stay in the output but never make a record UPDATED or appear in changedFields. Counters, thumbnails, signed media URLs and scrapedAt are already ignored. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. 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 item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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.
recordTypeType (text)idID (text)changeTypeChange type (incremental mode) (text)loginLogin (text)displayNameDisplay name (text)urlURL (link)titleTitle (text)viewersCountViewers (number)viewCountTotal views (number)followersCountFollowers (number)gameNameGame (text)gameSlugGame slug (text)Show 36 more fields
createdAtCreated (date)thumbnailUrlThumbnail (image)profileImageUrlProfile pic (image)boxArtUrlBox art (image)isLiveLive (boolean)isPartnerPartner (boolean)isAffiliateAffiliate (boolean)streamHlsUrlHLS playlist URL (link)clipMp4UrlsClip MP4 URLs (object)durationSecondsDuration (s) (number)nameName (text)messageTextMessage (text)commenterLoginCommenter login (text)commenterDisplayNameCommenter display name (text)contentOffsetSecondsOffset (s) (number)videoUrlVideo URL (link)videoIdVideo ID (text)channelLoginChannel login (text)channelDisplayNameChannel display name (text)commenterIdCommenter ID (text)userColorUser color (text)changedFieldsChanged fields (incremental mode) (object)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)channelIdChannel ID (text)profileImageURLProfile pic (alias) (image)streamCurrent stream (object)latestVideoLatest video (object)topClipTop clip (object)nextScheduleNext scheduled stream (object)keywordSearch keyword (text)scrapedAtScraped at (date)descriptiondescription (text)broadcastLanguageBroadcast language (text)broadcastersCountLive channels (number)publishedAtpublishedAt (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordType": "live_stream",
"id": "123456789",
"login": "examplelogin",
"displayName": "Example Display",
"url": "https://www.twitch.tv/examplelogin",
"title": "Sample stream title",
"viewersCount": 12345,
"createdAt": "2026-01-01T00:00:00Z",
"streamType": "live",
"gameName": "Sample Game",
"gameSlug": "sample-game",
"gameId": "000000",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/000000-285x380.jpg",
"thumbnailUrl": "https://static-cdn.jtvnw.net/previews-ttv/live_user_examplelogin-0000x0000.jpg",
"broadcasterId": "00000000",
"broadcasterDescription": "Sample broadcaster bio.",
"profileImageUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/0000-profile_image-70x70.png",
"isPartner": true,
"isAffiliate": false,
"followersCount": 100000,
"tags": [
"English",
"FPS"
],
"streamHlsUrl": "https://usher.ttvnw.net/api/channel/hls/examplelogin.m3u8?sig=0000&token=%7B...%7D",
"scrapedAt": "2026-05-09T00:00:00.000Z"
}Ways to use this data
- Stream discovery tools: surface currently live channels in a game, sorted by viewers, for a directory or alert bot.
- Channel and esports tracking: monitor a roster of channels' VOD history, clip performance, and follower counts over time.
- Highlight and clip curation: pull top clips per channel with direct MP4 URLs for re-use or archiving.
- Chat research: collect VOD chat-replay messages for sentiment, moderation, or community studies.
- Category and trend monitoring: track which games are trending right now with top games, per-category viewer, follower and live-channel (broadcastersCount) counts.
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 Twitch Scraper return?
The documented output for Twitch Scraper includes type, id, change type (incremental mode), login, display name, url, title and viewers. Availability of each field depends on the source page and the selected mode.
How much does Twitch Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 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 records on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, reappeared, or (if enabled) expired records, and unchanged ones are not billed.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run: it skips whatever that run already delivered. Incremental mode (incrementalMode) is for running the same mode and filters again and again on a schedule and getting only what changed since last time. They solve different problems and can be combined for a first run.
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.
