How to scrape Twitch and Kick for creator and sponsorship research
Key Takeaways
Why does the Twitch approach differ so much from the Kick approach? Twitch exposes a public GraphQL endpoint with the same data any visitor's browser loads — follower counts, live status, viewer counts — so it supports genuine research at scale. Kick doesn't publish an equivalent public data surface, so the practical use case there is retrieving actual video content (VODs, clips) rather than structured channel metrics.
Can you check whether a streamer is live right now, or only historical data?
Both, on Twitch — channel profile mode returns isLive and currentViewers as of the moment you run it, alongside historical fields like follower count and account creation date.
Does "top streams for a game" only show the single top stream, or a ranked list?
A ranked list — gameStreams mode returns every live stream in that category ordered by current viewer count, up to maxResults (max 100), which is what you want for finding mid-tier or up-and-coming streamers in a niche rather than just the single top name.
Two Platforms, Two Different Jobs
| Job | Platform | Actor |
|---|---|---|
| Shortlist and rank streamers by audience size | Twitch | Twitch Scraper |
| Track a streamer's growth and content over time | Twitch | Twitch Scraper |
| Pull an actual video for review once shortlisted | Kick | Kick Video Downloader |
Twitch: Six Modes for Creator Research
The Twitch Scraper reads Twitch's public GraphQL API — no login, no API key — with six modes covering different research angles:
{
"login": "examplestreamer",
"displayName": "ExampleStreamer",
"followersCount": 84213,
"isPartner": true,
"isLive": true,
"currentViewers": 3421,
"lastBroadcastTitle": "Ranked grind to Diamond",
"recentVideos": [{ "title": "Full VOD - Ranked Session", "viewCount": 12043 }]
}
channels mode profiles up to 1,000 named channels at once — feed it a sponsorship shortlist and get follower count, partner/affiliate status, and live status for the whole list in one run. gameStreams ranks every live stream in a specific category by current viewers, useful for finding creators actively streaming a specific game or niche right now rather than searching by name. clips mode pulls each channel's top clips over a chosen window (LAST_DAY through ALL_TIME), which is a faster way to gauge a channel's most engaging moments than watching full broadcasts.
Sponsorship Shortlisting in Practice
async function shortlistStreamers(gameName, minFollowers = 5000) {
const streams = await runActor("twitch-scraper", { mode: "gameStreams", gameName, maxResults: 100 });
const channels = await runActor("twitch-scraper", {
mode: "channels",
channelUsernames: streams.map((s) => s.broadcasterLogin),
includeVideos: true,
});
return channels.filter((c) => c.followersCount >= minFollowers && !c.isPartner);
}
Filtering to !c.isPartner here specifically targets affiliate-tier streamers rather than established partners — a common sponsorship strategy, since affiliate-level creators are typically more responsive to outreach and cost less than a partnered streamer with an existing sponsorship roster.
Kick: Pulling the Actual Content
Once a Kick streamer is on your radar — from community mentions, cross-posted clips, or manual browsing, since Kick has no equivalent public research API — the Kick Video Downloader retrieves the actual VOD, stream recording, or clip for review:
{
"url": "https://kick.com/video/a1b2c3d4",
"title": "24 Hour Charity Stream",
"channel": "examplestreamer",
"quality": "1080p60",
"duration": 5412000,
"download_url": "https://api.apify.com/v2/key-value-stores/.../video.mp4"
}
It accepts VOD, direct video, and clip URLs in one batch, downloads at up to 1080p60, and needs no proxy for most downloads — useful for building an internal review archive of a shortlisted creator's actual content quality and audience engagement style before committing to a sponsorship, rather than judging by follower count alone.
FAQ
Does the Twitch Scraper need a Twitch account or developer API key? No — it reads Twitch's public GraphQL endpoint, the same data a logged-out visitor's browser loads.
What happens if a Kick video URL points to a deleted or private video?
The download fails for that row and is reported with a status: "error" in the output rather than silently skipped, so a batch run of several URLs still returns results for the ones that succeeded.
Browse ParseBird's Social Media category for more platform research tools.