Twitch Scraper: Streamers, Followers, Live Viewers & Clips
Pricing
from $3.04 / 1,000 channels
Twitch Scraper: Streamers, Followers, Live Viewers & Clips
Find Twitch streamers by game, language or name with followers, live viewers, public social links, recent videos, clips and follower growth for creator research. About $0.0038 per channel: 100 cost $0.38; streams, clips and videos $0.0018 each. No login.
Pricing
from $3.04 / 1,000 channels
Rating
0.0
(0)
Developer
fortbrand
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Security
Limited permissionsShare
For gaming marketers, esports agencies and game publishers finding public Twitch creators and monitoring them over time. A channel profile costs about $0.0038, so 100 profiles cost about $0.38. Each live stream, video or clip costs $0.0018. A first run with 20 live streams costs about $0.04. No Twitch login or API key is needed.
Find creators by game, language or name. Collect public profiles, followers, viewers, social links and media. Compare followers in a private watch history. Independent tool; no affiliation with or endorsement from Twitch.
What you get
| Row | Fields you can use |
|---|---|
| Channel | Stable channel ID, login, display name, followers, partner and affiliate flags, description, broadcast language, live status, current game and viewers, last broadcast start, available archive frequency, public social links and profile URL |
| Stream | Stable stream ID, channel ID and login, title, game name and ID, current viewers, channel followers, start time, public tags, language and channel URL |
| Video | Stable video ID, source channel, title, views, duration in seconds, creation and publication timestamps, category, thumbnail and source URL |
| Clip | Stable clip ID and slug, source channel, title, views, duration, creation timestamp, category, language, thumbnail and source URL |
| Summary | Useful row counts by type, source queries, exclusions, unchanged rows, source notes and whether the spending limit stopped delivery |
Every row starts with verdict and includes type and scrapedAt. Missing source values are null, never invented zeros.
Start in three steps
- Keep the prefilled Minecraft game and 20 live-stream rows, or enter channels, exact game names or channel-search words.
- Choose the row types in
include. Set a language or minimum live-viewer count if useful. - Start the Actor and open the dataset. Export JSON, CSV or Excel, or read the summary for coverage notes.
The cloud prefill returned 20 streams in 6.4 seconds on 29 October 2026 at 512 MB. Network conditions vary; profile enrichment can take longer.
Typical jobs
Studios can shortlist creators; agencies can track followers; analysts can build time series; content teams can compare clips.
Viewer counts are per channel; collaboration headers can show a larger shared total.
Inputs
| Input | Meaning and example |
|---|---|
channels | Array of channel names, @handles or channel URLs, such as ["twitch", "warframe"] |
games | Array of exact category names, such as ["Minecraft", "Just Chatting"], or Twitch category URLs |
searchTerms | Array of channel-name search words, such as ["esport"]; Twitch ranks these by relevance |
languages | Optional array of broadcast language codes, such as ["en", "de"] |
minViewers | Minimum current live viewers; default 0 keeps offline channels, while any positive value excludes them |
maxItems | Total useful rows across all selected types, from 1 to 1,000; default 20 |
include | Any combination of channel, liveStream, recentVideos, clips |
onlyChangedSinceLastRun | Suppress identical observations using a stable watchId; default false |
watchId | Your private comparison-history name, using letters, digits, underscores or hyphens |
proxyConfiguration | Optional Apify Proxy or custom proxy configuration; datacenter is the default |
If there is no source input, the Actor uses Minecraft. When include is omitted, game-only jobs return live-stream rows; channel and search jobs return channel profiles. The prefilled editor explicitly selects liveStream, so change that selection when switching to a profile job.
Sources are combined and deduplicated. maxItems is shared across types; profiles and streams come before media. Search samples up to maxItems candidate channels per term, then applies filters. Game discovery uses the first 100 public source slots per category; restricted game cursors are not used. Fewer matches can mean fewer rows. Discovery is bounded to three times maxItems, at most 2,000 candidate channels, to keep memory predictable. Narrow source lists for coverage.
Find live streams by game
{"games": ["VALORANT"],"languages": ["en"],"minViewers": 100,"maxItems": 20,"include": ["liveStream"]}
Inspect creator profiles
{"channels": ["twitch", "riotgames", "warframe"],"maxItems": 3,"include": ["channel"]}
Collect clips or archived broadcasts
{"channels": ["warframe"],"maxItems": 40,"include": ["clips"]}
Use recentVideos instead for recent archived broadcasts. Clips are ranked over all time; there is no date-range input in this version. Videos are past broadcasts, excluding uploads and highlights. Media uses the first 100 public source slots per type per channel; unavailable slots can reduce the count. Restricted media cursors are not used. Videos and clips are interleaved when both are selected.
Channel fields and honest interpretation
| Field | Interpretation |
|---|---|
followers | Source-provided total at the observation time; browser pages often show a rounded number |
currentViewers | Individual channel viewers, or null when offline |
lastStreamedAt | Source-reported last broadcast start, with an ISO timestamp |
streamsPerWeek | Available archived broadcasts started in the last seven days, sampled from at most 20 recent archives |
streamsPerWeekMethod | Explains that archive counts can undercount actual streams |
archiveSampleTruncated | True when the 20-item sample ends inside the seven-day observation window |
avgViewersRecent | Null: public video view totals do not establish average live viewers |
socialLinks | Structured public links shown in the channel's About area, when available |
descriptionLinks | URLs explicitly written in the public description, kept separately from structured social links |
upcomingSchedule | Public schedule segments when Twitch supplies them; otherwise null |
previousFollowers | Prior delivered follower total for this channel under the same watch |
followersChange | Current followers minus the prior total, including negative changes |
previousObservedAt | Observation time associated with the prior follower total |
Missing or deleted archives can undercount streaming frequency. Empty archives leave streamsPerWeek null. Public schedule segments are separate.
Monitor followers every day
Create an Apify task with your channel list and a distinct watchId, such as publisher-watch. Run it once with include: ["channel"] to establish a baseline. Then use the same ID and set onlyChangedSinceLastRun: true on sequential runs.
{"channels": ["twitch", "warframe"],"include": ["channel"],"maxItems": 2,"watchId": "publisher-watch","onlyChangedSinceLastRun": true}
The first run delivers a baseline. Later changes to followers, live status, viewers, game, description, public links or media views can trigger delivery. Timestamps and comparison fields alone do not trigger changes.
History belongs to the running user and this Actor. Different watch IDs keep independent histories. Only delivered results update it. The most recent 10,000 unique row fingerprints and 10,000 channel follower records are retained; older evicted results can appear again. An unfinished run blocks the same watch ID so its recovery cannot overwrite another run's baseline. Resume that original run or choose a new ID. Runs sharing an ID must be sequential; simultaneous starts are not supported.
Set a task schedule in Apify after verifying its first result. Retain datasets for long-term charts.
Example output
A shortened channel observation from the real cloud tests on 29 October 2026:
{"verdict": "twitch: offline, 2,484,858 followers.","type": "channel","channelId": "12826","login": "twitch","followers": 2484858,"isPartner": true,"isAffiliate": false,"language": "en","isLive": false,"currentViewers": null,"lastStreamedAt": "2026-10-23T17:51:13.310Z","streamsPerWeek": 1,"avgViewersRecent": null,"previousFollowers": null,"url": "https://www.twitch.tv/twitch"}
The overview, channel, stream and media views share one dataset; filter type downstream. Every run also writes a free SUMMARY dataset row and a SUMMARY key-value record. Summary and input-note rows are additional to maxItems and have no data-row charge.
Pricing and spending limits
| Unit | List price | Bronze | Silver | Gold and higher |
|---|---|---|---|---|
| Channel | $0.0038 | $0.00361 | $0.00342 | $0.00304 |
| Stream | $0.0018 | $0.00171 | $0.00162 | $0.00144 |
| Video | $0.0018 | $0.00171 | $0.00162 | $0.00144 |
| Clip | $0.0018 | $0.00171 | $0.00162 | $0.00144 |
The platform start fee is $0.00005 per GB, with a minimum of one start unit. Platform usage is included in the Actor price. Failed requests, invalid inputs, unchanged suppressed rows, duplicates, empty results and summaries have no data charge. The start fee still applies when no data is delivered.
At list prices, 100 profiles cost about $0.38; 100 clips cost about $0.18; 100 profiles plus 500 clips cost about $1.28, plus the small start fee. Choosing more row types can increase your total, because each delivered type is a separate useful row. Check maxItems and Apify's maximum charge before starting a larger job.
The Actor checks available budget before delivery and stops cleanly when the next row does not fit. A result is saved before its charge. Durable row IDs, charge receipts and per-row billing keys protect recovery after a migration or reboot. An ambiguous recovery state stops further billing rather than guessing.
API use
Use an Apify token in the authorization header. No Twitch token is required.
curl -X POST 'https://api.apify.com/v2/acts/vant47~twitch-streamer-scraper/run-sync-get-dataset-items' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"games":["Minecraft"],"include":["liveStream"],"maxItems":20}'
For larger jobs, use asynchronous runs and read the dataset after completion. Keep tokens in secret configuration.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("vant47/twitch-streamer-scraper").call(run_input={"channels": ["warframe"], "include": ["clips"], "maxItems": 20})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row.get("type") == "clip":print(row["url"], row["views"])
Use with AI agents (MCP)
Connect an MCP-capable client to https://mcp.apify.com and allow this Actor. Ask the assistant to find Twitch streamers for a named game and language, choose a row cap, run the Actor and inspect the summary before interpreting the data. For example: “Collect 20 English-speaking VALORANT streams with at least 100 viewers, then group them by current viewers.”
Agents should retain timestamps and links, distinguish video views from live viewers, and mention missing fields. Sponsorship suitability and private demographics are not inferred.
Limits and troubleshooting
The source is Twitch's signed-out GraphQL endpoint. Requests are serial and paced, transient errors receive fresh-session retries, and Retry-After is honored. Datacenter proxy is used first. Refused social fields and other failed requests can receive an ordinary residential retry. No account cookies, login, challenge solving or integrity-token generation is used. With proxy disabled, the Actor uses the run's address and does not add a residential fallback.
Twitch can change or restrict fields. Partial results are retained, missing values stay null and the summary explains problems. Search is relevance-ranked, not exhaustive. Live feeds move between pages; deduplication cannot make them a simultaneous census.
Only public channel and content metadata is collected. Chat participants, messages, subscriber lists, private contacts, video files and historical live averages are excluded. Twitch's terms restrict automated access; review them for your use case.
FAQ
Why fewer rows than maxItems? Check the summary for finite feeds, filters, offline channels, unchanged observations or the spending limit.
Why different website numbers? Twitch rounds interface counts and live values change. Compare channel metrics and times; collaboration headers can show a shared audience. Twitch explains Shared Viewership.
Can I search stream titles? No. searchTerms searches channels. Use games, languages and minimum viewers for live discovery.
Do deleted or unavailable channels cost a channel charge? No. They produce a source note without a useful channel row. Incorrect input that reaches the Actor also becomes a free note; the input editor can reject invalid types before a run starts.
Can free-plan users run larger jobs? Yes. There is no artificial free-plan result cap. All users share the same 1,000-row input maximum and the limits of their own Apify budget.
Where is follower growth? Include channel for comparison fields; stream-only jobs return live observations.
What if a run is interrupted? Resume it to reconcile saved rows and continue. Keep the same watch ID sequential.