Twitch Search & Streams Scraper avatar

Twitch Search & Streams Scraper

Pricing

$1.30 / 1,000 result extracteds

Go to Apify Store
Twitch Search & Streams Scraper

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

Crikit

Maintained by Community

Actor 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:

IndexDepthNotes
channels~1,000 per termLive and offline, with follower counts
videos~700 per termVODs with view counts and duration
games~29 per termTwitch'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 scrapedAt and 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_results row explaining why, rather than an empty dataset you cannot distinguish from a broken run.
  • maxItems is a hard cost ceiling. It must be 1 or more; 0 is refused rather than silently reinterpreted.