Twitch Search & Streams Scraper
Pricing
$1.30 / 1,000 result extracteds
Twitch Search & Streams Scraper
Search Twitch channels, live streams, VODs and categories, no OAuth needed. Keyword search runs to Twitch's natural end (~1,000 channels per term, not 30) and category runs slice by language to beat Twitch's 30-row cap. Returns followers, viewers, uptime, category, tags, partner status.
Pricing
$1.30 / 1,000 result extracteds
Rating
0.0
(0)
Developer
Crikit
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
14 days ago
Last modified
Categories
Share
Search Twitch channels, live streams, VODs and categories. No OAuth token, no login, no browser — this talks to Twitch's public GraphQL endpoint directly, which is why it is fast and cheap.
$1.30 per 1,000 results. Pay only for rows you receive; duplicates are removed before you are billed.
What makes this different
Every other Twitch scraper stops at Twitch's first page. Twitch caps a directory request at 30 rows and gates deeper paging behind an anti-bot check, so a scraper that asks the obvious way gets 30 streams and calls it a day.
This one goes further, two ways:
- Keyword search runs to Twitch's natural end.
"minecraft"returns 982 channels across 34 pages, not 30. Videos go about 700 deep per term. - Category runs slice the directory by broadcaster language. Each language is a separate 30-row window, so sweeping twelve of them returns ~200–250 live streams per category instead of 30, with no duplicates across slices.
If you are doing influencer discovery, esports monitoring or audience research, that difference is the whole product — the 31st result is where the mid-tier streamers you can actually afford to work with begin.
Three modes
Search — keyword search across Twitch
{"mode": "search","searchTerms": ["valorant", "speedrun"],"searchIndex": "channels","maxItems": 500}
searchIndex picks what you get back:
| Index | Depth | Notes |
|---|---|---|
channels | ~1,000 per term | Live and offline, with follower counts |
videos | ~700 per term | VODs with view counts and duration |
games | ~29 per term | Twitch's category index does not paginate |
Category — live streams in a directory category
{"mode": "category","categories": ["Just Chatting", "VALORANT"],"languages": ["EN", "ES", "PT"],"maxItems": 500}
Category names, slugs (just-chatting) and directory URLs all work. Leave languages
empty to sweep the twelve languages carrying the most Twitch inventory.
Set sortBy to VIEWER_COUNT_ASC to surface the smallest live channels first — the usual
ask for sponsorship prospecting.
Channels — look up specific channels
{"mode": "channels","channels": ["shroud", "https://www.twitch.tv/kaicenat", "@ninja"],"maxItems": 100}
Returns the same row shape whether the channel is live or offline, so you can re-run it on a schedule and diff.
Filters
onlyLive— drop channels that are not broadcasting right now.minViewers— drop live channels under a concurrent-viewer floor.
Both filters run before billing. You are never charged for a row a filter removed.
Output
One flat row per result. Channels, category streams and direct lookups all share the same
shape, so you can union all three into one table keyed on login without reconciling
schemas.
{"recordType": "channel","id": "598903130","login": "valorant_americas","displayName": "VALORANT_Americas","url": "https://www.twitch.tv/valorant_americas","description": "Official VALORANT Champions Tour Broadcast Channel.","followers": 940598,"isPartner": true,"isAffiliate": false,"isLive": true,"streamTitle": "LEV vs MIBR - VCT Americas Stage 2","viewersCount": 6930,"streamStartedAt": "2026-08-08T20:30:24Z","streamUptimeSeconds": 13865,"gameName": "VALORANT","gameSlug": "valorant","broadcasterLanguage": "EN","tags": ["Esports", "English"],"thumbnailUrl": "https://static-cdn.jtvnw.net/previews-ttv/live_user_valorant_americas-640x360.jpg","accountCreatedAt": "2020-10-23T01:23:36.264718Z","lastBroadcastStartedAt": "2026-08-08T20:30:29.349559Z","searchQuery": "valorant","position": 1,"scrapedAt": "2026-08-09T00:21:29.086Z"}
Offline channels still carry streamTitle, gameName, followers and
lastBroadcastStartedAt, so a dormant-channel sweep is one sort away.
Measured on a 300-row run: every field above populated on 100% of rows, and every stream-specific field populated on 100% of the rows that were actually live.
What this does not do
- Chat, clips and subscriber counts. Not covered.
- Deeper than ~1,000 channels per search term. That is Twitch's own end of results, not a limit here. Use more, narrower terms.
- More than ~30 streams per category per language. Twitch gates deeper directory paging behind an anti-bot check that would need a browser farm to clear. Language slicing is the workaround, and it is why a category run returns 200+ rather than 30.
- Historical data. Viewer counts and uptime are true as of
scrapedAtand nothing else.
Notes
- Runs on Apify's default datacenter proxy. Residential is not needed and would cost roughly ten times more.
- A search that legitimately matches nothing writes a single
no_resultsrow explaining why, rather than an empty dataset you cannot distinguish from a broken run. maxItemsis a hard cost ceiling. It must be 1 or more;0is refused rather than silently reinterpreted.