Twitch Scraper - Channels, Live Streams, Clips & VODs avatar

Twitch Scraper - Channels, Live Streams, Clips & VODs

Pricing

from $1.80 / 1,000 twitch item delivereds

Go to Apify Store
Twitch Scraper - Channels, Live Streams, Clips & VODs

Twitch Scraper - Channels, Live Streams, Clips & VODs

Scrape Twitch channel profiles (followers, partner status, socials, live viewers), live streams by category and language, clips by channel or category, VODs and categories with viewer counts. Public GraphQL, no login. US$ 2.50 per 1,000 items; channels not found are free.

Pricing

from $1.80 / 1,000 twitch item delivereds

Rating

0.0

(0)

Developer

Scrapewise Data

Scrapewise Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Twitch Scraper turns Twitch's public data into clean, flat rows: channel profiles with followers, partner status, bio and social links, the live streams running right now by category and language, clips by channel or category, past broadcasts (VODs) and the category directory with live viewers and broadcaster counts. It is built for influencer marketing agencies, brand sponsorship teams and streaming analytics products that need Twitch numbers without a developer app, without an OAuth token and without a browser.

  • Influencer agencies: check followers, partner status, socials and what a creator streamed last before pitching a campaign, thirty channels per request.
  • Sponsors and brand teams: list the most watched live streams in your category and language every hour, with viewer counts, tags and thumbnails, and see who is live right now.
  • Streaming analytics: track category viewers, VOD views, clip performance and the top of the directory over time with a schedule, and feed dashboards, BI or AI agents.

Price: US$ 2.50 per 1,000 rows on the Free plan, down to US$ 2.00 on Gold and above. No monthly fee and no fee per run start. Channels that do not exist, filters with no match and blocked requests are free. AI agents can call it through the Apify MCP server.

At a glance

This Actorautomation-lab/twitch-scraper (best measured competitor)easyapi/twitch-channel-scraper
Price per 1,000 channel rows, Free planUS$ 2.50US$ 3.45US$ 4.99
Price per 1,000 channel rows, Gold plan and aboveUS$ 2.00US$ 1.80US$ 4.99 (same on every plan)
Price per 1,000 live stream, clip or category rows, Free planUS$ 2.50US$ 2.30US$ 4.99
Fee per run startNoneUS$ 5 per 1,000 run startsUS$ 90 per 1,000 run starts
Modes in one Actor6 (channels, live streams, clips, VODs, categories, search)6 (channels, search, top streams, game streams, top games, clips)1 (search channels)
Filter by stream languageYesNoNo
Filter by minimum viewers and by tagYesNoNo
Rows that could not be scrapedFree, with an errorCodeNot stated on its pageNot stated on its page
Users in the last 30 days1 (published 2026-09-16)3519
Store ratingNo reviews yetNo reviews yet4.56 (3 reviews)
Public run success, last 30 daysNo public runs yet; 18 of our 18 cloud test runs succeeded100.0% (4,942 runs)99.4% (321 runs)

Competitor figures were read from the public Apify API (api.apify.com/v2/store?search=twitch) on 2026-09-16, counting success as succeeded divided by succeeded plus failed plus timed out. They change every day and the Store page always shows the live number. Across the five searches we measured, prices in this niche run from US$ 0.57 to US$ 200 per 1,000 rows, and most of the cheap ones charge an extra fee on every run start.

One real row

Minimal input, which is also the default input:

{ "mode": "channels", "channelNames": ["ibai", "kaicenat"] }

A real row from a cloud run of 2026-09-16, trimmed. One full example per type is under "Output" below.

{
"type": "channel",
"channelName": "ibai",
"channelUrl": "https://www.twitch.tv/ibai",
"channelId": "83232866",
"displayName": "ibai",
"followersCount": 20326381,
"isPartner": true,
"isLive": false,
"lastBroadcastTitle": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
"lastBroadcastAt": "2026-09-15T18:40:12.076035Z",
"lastCategory": "League of Legends",
"twitter": "https://twitter.com/IbaiLlanos",
"instagram": "https://www.instagram.com/ibaillanos/",
"tiktok": "https://www.tiktok.com/@ibaillanos",
"scrapedAt": "2026-09-16T04:21:55.612Z"
}

What you can scrape

ModeInputOne row perTypical use
channelschannel logins or URLschannelcreator vetting, follower tracking, live checks
liveStreamsoptional categories, languages, minimum viewers, tagslive streamtop streams now, sponsor discovery
clipschannels or categories, plus a periodclipviral moments, highlight research
videoschannel logins or URLspast broadcast, highlight or uploadviews and duration of recent streams
categoriesnothing for the top of the directory, or category slugscategoryviewers and broadcasters leaderboard
searchkeywordschannelfind streamers by name, with the full profile

Every row carries a type field (channel, livestream, clip, video, category) and a scrapedAt timestamp, so you can mix modes in one pipeline and split them later.

Input examples

Channel profiles, which is also the default input:

{
"mode": "channels",
"channelNames": ["ibai", "https://www.twitch.tv/kaicenat", "@jynxzi"]
}

The 100 most watched live streams in Portuguese, Spanish and German:

{
"mode": "liveStreams",
"languages": ["pt", "es", "de"],
"maxResults": 100
}

Live streams in one category with at least 10 viewers, and the 50 most viewed clips of a channel in the last 30 days:

{
"mode": "liveStreams",
"categories": ["grand-theft-auto-v"],
"minViewers": 10,
"maxResults": 40
}
{
"mode": "clips",
"channelNames": ["ibai"],
"clipPeriod": "month",
"clipSort": "views",
"maxResults": 50
}

The top 60 categories by live viewers, and a channel search with followers and live status:

{ "mode": "categories", "maxResults": 60 }
{ "mode": "search", "searchQueries": ["valorant", "gta rp"], "maxResults": 20 }

Coming from another Twitch scraper?

The input names used by the other Twitch Actors in the Store also work, so you can switch without touching your integration:

  • mode: channel, channel_info, channel_details, topStreams, top_streams, live_streams, gameStreams, game_streams, searchChannels, search_channels, channel_videos, topGames, top_games, topClips, subcategories
  • also read from scrapeType and action, so {"scrapeType": "top_games"} works
  • channels: channelNames, channelUsernames, channels, logins, targets, streamers, channelUrls, startUrls, twitchUrls
  • keywords: searchQueries, searchTerms, keywords, query; categories: categories, categorySlug, gameName, gameSlug, game
  • limits: maxResults, maxItems, limit; filters: minViewers, languages, clipPeriod, period, videoType

Output names follow the convention the market already uses (channelName, displayName, followersCount, isLive, currentViewers, currentCategory, viewers, thumbnailUrl), so most field mappings keep working.

Output

Real rows from cloud runs on the Apify platform on 16 September 2026.

Channel

{
"type": "channel",
"channelName": "ibai",
"channelUrl": "https://www.twitch.tv/ibai",
"channelId": "83232866",
"displayName": "ibai",
"bio": "Si lees esto que sepas que te aprecio",
"avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/574228be-01ef-4eab-bc0e-a4f6b68bedba-profile_image-300x300.png",
"followersCount": 20326381,
"isPartner": true,
"accountCreatedAt": "2015-02-20T16:47:56.548434Z",
"isLive": false,
"currentViewers": null,
"currentStreamTitle": null,
"currentCategory": null,
"lastBroadcastTitle": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
"lastBroadcastAt": "2026-09-15T18:40:12.076035Z",
"lastCategory": "League of Legends",
"broadcastLanguage": "ES",
"socialLinks": {
"youtube": "https://www.youtube.com/channel/UCaY_-ksFSQtTGk0y1HA_3YQ",
"twitter": "https://twitter.com/IbaiLlanos",
"instagram": "https://www.instagram.com/ibaillanos/",
"tiktok": "https://www.tiktok.com/@ibaillanos"
},
"scrapedAt": "2026-09-16T04:21:55.612Z"
}

When the channel is live, isLive is true and currentViewers, currentStreamId, currentStreamTitle, currentCategory, currentCategorySlug, currentStreamLanguage, currentStreamTags, startedAt and thumbnailUrl are filled.

Live stream

{
"type": "livestream",
"rank": 1,
"channelName": "caseoh_",
"channelUrl": "https://www.twitch.tv/caseoh_",
"channelId": "267160288",
"displayName": "caseoh_",
"followersCount": 9033842,
"isPartner": true,
"livestreamId": "321448783450",
"title": "LOSING MY MIND",
"viewers": 52263,
"category": "ROBLOX",
"categorySlug": "roblox",
"categoryId": "23020",
"language": "EN",
"tags": ["English"],
"streamType": "live",
"startedAt": "2026-09-16T02:05:02Z",
"thumbnailUrl": "https://static-cdn.jtvnw.net/previews-ttv/live_user_caseoh_-640x360.jpg",
"isLive": true,
"scrapedAt": "2026-09-16T04:05:56.648Z"
}

Clip

{
"type": "clip",
"clipId": "3058333305",
"channelName": "ibai",
"displayName": "ibai",
"title": "kamet0 es un mierda ???",
"url": "https://www.twitch.tv/ibai/clip/LachrymosePiliableKoupreyStrawBeary-lxxZ4KupfZMmtTNN",
"views": 8787,
"duration": 22,
"durationFormatted": "0:22",
"language": "ES",
"category": "League of Legends",
"categorySlug": "league-of-legends",
"videoId": "2859730034",
"videoOffsetSeconds": 14050,
"createdAt": "2026-08-29T18:36:36Z",
"scrapedAt": "2026-09-16T04:02:06.615Z"
}

videoId and videoOffsetSeconds point at the exact second of the source VOD, which is what you need to rebuild the moment on a timeline.

VOD (past broadcast)

{
"type": "video",
"videoId": "2874817330",
"channelName": "ibai",
"channelUrl": "https://www.twitch.tv/ibai",
"title": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
"url": "https://www.twitch.tv/videos/2874817330",
"views": 290809,
"duration": 17585,
"durationFormatted": "4:53:05",
"language": "es",
"category": "Just Chatting",
"categorySlug": "just-chatting",
"videoType": "ARCHIVE",
"createdAt": "2026-09-15T13:47:02Z",
"publishedAt": "2026-09-15T13:47:02Z",
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/.../thumb0-640x360.jpg",
"scrapedAt": "2026-09-16T04:03:13.976Z"
}

Category

{
"type": "category",
"rank": 1,
"categoryId": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"url": "https://www.twitch.tv/directory/category/just-chatting",
"viewers": 209853,
"broadcastersCount": 4405,
"followersCount": 53198449,
"tags": ["IRL"],
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-285x380.jpg",
"scrapedAt": "2026-09-16T04:03:48.063Z"
}

Rows that are not charged

A channel that does not exist, an invalid login, a category with no live streams or a blocked request becomes a row with errorCode and error, and is not charged:

{
"type": "channel",
"input": "zzznaoexiste987654",
"channelName": "zzznaoexiste987654",
"error": "channel not found on Twitch",
"errorCode": "CHANNEL_NOT_FOUND"
}

Error codes: CHANNEL_NOT_FOUND, INVALID_CHANNEL, CATEGORY_NOT_FOUND, INVALID_CATEGORY, CATEGORY_NOT_SUPPORTED, NO_RESULTS, BLOCKED. The run only fails when nothing at all could be delivered because Twitch blocked every retry, so one bad login in a list of 500 never ruins the run.

Field reference

FieldTypesDescription
typeallchannel, livestream, clip, video or category
channelNamechannel, livestream, clip, videochannel login, as in twitch.tv/
displayNamechannel, livestream, clipdisplay name with capitalization and non latin characters
channelUrl, channelIdchannel, livestream, clip, videolink and numeric id
followersCountchannel, livestream, clip, categoryfollowers of the channel, or of the category
isPartner, isAffiliate, verifiedchannel, livestreamTwitch partner and affiliate flags
bio, avatarUrl, bannerUrl, primaryColor, accountCreatedAtchannelpublic profile
socialLinks, twitter, instagram, youtube, tiktok, discordchannellinks the streamer published on the channel page
isLive, currentViewers, currentStreamTitle, currentCategory, currentStreamLanguage, currentStreamTags, startedAtchannelthe live stream running at scrape time, if any
lastBroadcastTitle, lastBroadcastAt, lastCategory, broadcastLanguagechannelthe previous broadcast, useful when the channel is offline
rank, viewers, title, language, tags, streamType, livestreamIdlivestreamone live stream, ranked by viewers
clipId, clipSlug, views, duration, durationFormatted, videoOffsetSecondsclipclip stats and its position in the source VOD
videoId, views, duration, durationFormatted, videoType, publishedAtvideoVOD, highlight or upload
category, categorySlug, categoryIdlivestream, clip, videocategory of the content
name, slug, viewers, broadcastersCount, tags, boxArtUrlcategoryone category of the directory
url, thumbnailUrllivestream, clip, video, categorypage link and image
inputallthe input line that produced the row
error, errorCodeerror rowswhy nothing was delivered, never charged
scrapedAtallUTC time of the scrape

Pricing

US$ 2.50 per 1,000 rows on the Free plan, no monthly rental and no fee per run start. One charge is one row, whatever the mode.

Apify planPrice per rowPer 1,000 rows
FreeUS$ 0.0025US$ 2.50
BronzeUS$ 0.0023US$ 2.30
SilverUS$ 0.0021US$ 2.10
Gold and aboveUS$ 0.0020US$ 2.00

Examples at the Free plan price: 100 creator profiles cost US$ 0.25. The top 500 live streams every hour for a day is 12,000 rows, US$ 30. A weekly clip report for 20 channels at 50 clips each is 1,000 rows, US$ 2.50. Error rows are free, and you can cap spending with the maximum cost per run in the Apify Console.

Speed and cost, measured

Our own cloud runs on the Apify platform, 2026-09-16, 512 MB of memory. "Platform cost" is what the run consumed in Apify usage. The percentage is that cost against what the Actor charges for the same rows.

RunRowsTimePlatform cost% of the charge
Top live streams, no filter50033 sUS$ 0.00350.28%
Top live streams, three languages6024 sUS$ 0.00100.69%
Live streams in one category, minimum 10 viewers368 sUS$ 0.00020.20%
Most viewed clips of one channel, last 30 days507 sUS$ 0.00050.41%
VODs of two channels599 sUS$ 0.00060.43%
Category directory587 sUS$ 0.00050.37%
Search, two keywords407 sUS$ 0.00050.47%
Two channel profiles25 sUS$ 0.00035.8%

Eighteen cloud test runs, eighteen successes, 962 rows charged, US$ 0.0099 of platform cost in total, which is US$ 0.0103 per 1,000 rows or 0.41% of the price. Small runs carry the fixed cost of starting the container, which is why two channel profiles look expensive as a percentage and five hundred live streams do not. The Actor makes plain HTTP calls to the same public GraphQL endpoint the Twitch site uses, with no browser and no login, and reads up to thirty channel profiles per request.

How to use it

Apify Console

  1. Pick a mode and fill in channels, categories, languages or keywords.
  2. Click Start. Results appear in the Output tab, with one table view per type.
  3. Export as JSON, CSV, Excel or HTML, or copy the API link.

API

curl -X POST "https://api.apify.com/v2/acts/scrapewise~twitch-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "liveStreams", "languages": ["en"], "maxResults": 100}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("scrapewise/twitch-scraper").call(run_input={
"mode": "channels",
"channelNames": ["ibai", "kaicenat"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["channelName"], row.get("followersCount"), row.get("isLive"))

Schedules and integrations

  • Schedule liveStreams every 15 or 60 minutes to build a viewer history per channel and per category.
  • Send results to Google Sheets, Slack, Airtable, BigQuery, S3 or a webhook, or call it from n8n, Make or Zapier with the Apify app.

AI agents and MCP

The Actor works as a tool in the Apify MCP server, so Claude, ChatGPT, Cursor and other MCP clients can call it:

https://mcp.apify.com/?actors=scrapewise/twitch-scraper

Ask things like "Who are the twenty most watched Portuguese streamers live on Twitch right now?" or "Compare followers, partner status and last category for these thirty Twitch creators". The flat output with a type on every row keeps it easy for an agent to read without parsing anything.

Limits and honest notes

  • Page size. Twitch's public endpoint refuses deep pagination without a browser generated integrity token, so each query returns one page: up to 30 rows for the global live directory, and up to 100 rows for streams inside a category, clips, VODs, categories and search. To go past that in liveStreams the Actor walks the most watched categories and merges the result, which is how a request for 500 live streams is served. For clips and VODs the ceiling is 100 per channel or category per run.
  • Live streams are a snapshot of the moment the run happens, so schedule the Actor to build history. Category and language filters are applied by Twitch, and minViewers and tags on top of the result.
  • Language filter. Twitch filters by the language set on the channel, so a handful of rows can report a different language value than the one you asked for.
  • Clip order. Twitch sorts clips by views inside a period or by trending, and offers no sort by creation date, so clipSort: "trending" is the closest thing to newest.
  • VODs expire on Twitch after 7 to 60 days depending on the channel's plan.
  • Social links are the one field Twitch serves only to residential IPs. A batch that comes back without them is retried once on a residential IP, and includeSocials: false turns that off.
  • Gambling, casino and betting categories are not collected in any mode. Slots, Virtual Casino and Poker are three of the largest categories on Twitch and none of them is returned.
  • Chat messages are not collected, and the viewer who created a clip is not included. The Actor only returns public data about channels and their content.
  • Requests go through the Apify datacenter proxy and blocked requests are retried on new IPs automatically.

If something breaks or you need a field, open an issue on the Issues tab. Issues are answered the same day.

FAQ

Do I need a Twitch account, a developer app or an API key? No. The Actor reads the same public GraphQL endpoint the Twitch website uses, with no login, no OAuth token and no cookies.

How fast is it? In cloud runs, 500 live streams took 33 seconds and 30 channel profiles come back in one request in about 3 seconds.

How do I get the most watched streams in one category? Use liveStreams with categories: ["just-chatting"], taking the slug from the twitch.tv/directory/category URL. Add languages to narrow it down by audience and minViewers to drop the long tail.

Can I monitor whether a streamer is live? Yes. Run channels on a schedule. isLive, currentViewers, currentStreamTitle and currentCategory show the live state at that moment, and lastBroadcastAt tells you when the channel was last on air.

Why did I get fewer rows than maxResults? The channel has fewer clips or VODs than you asked for, fewer streams match the filters right now, or one of Twitch's own ceilings applies (30 rows for the global live directory, 100 for everything else per query). You are only charged for rows actually delivered.

Are invalid or missing channels charged? No. They come back as a row with errorCode and are free, so a list with typos costs nothing extra.

Can I export to CSV or Excel? Yes, from the Output tab or the dataset API with format=csv or format=xlsx.

Does it collect chat, viewers or personal data? No. Chat messages and any data about regular viewers are out of scope. Only public channel, stream, clip, VOD and category data is returned.

Can I use the input of another Twitch Actor? Yes. mode values such as channel, top_streams, gameStreams, channel_videos and topGames are accepted, as are scrapeType and action, and field names like channelUsernames, logins, targets, streamers, keywords, gameName and maxItems.

Is scraping Twitch legal? The Actor collects only public data that anyone can see on twitch.tv without an account. You are responsible for how you use it, under Twitch's terms and your local data protection law.

Why are gambling and casino categories missing? They are blocked on purpose, in every mode, by slug, by category name and by the gambling content tag Twitch itself applies. A category asked for explicitly returns a free CATEGORY_NOT_SUPPORTED row. Games that only look like gambling by name, such as Buckshot Roulette, PokeRogue and Dicey Dungeons, are collected normally.

How do I build a viewer history instead of a snapshot? Save the liveStreams or categories input as a task and attach an Apify schedule. Each run appends a dated snapshot, and viewers plus scrapedAt is all a chart needs.

Can I match a Twitch creator with their other social profiles? Yes, through socialLinks and the flat twitter, instagram, youtube, tiktok and discord fields, which carry whatever the streamer published on the channel page. That is usually enough to find the same person on another platform.

Can an AI agent call it? Yes, through the Apify MCP server. The input is short, every field has a description, and every row carries a type, so an agent can mix modes in one conversation.

Changelog

  • 2026-09-16 (0.1.2): social links retried on a residential IP when Twitch withholds them from datacenter IPs, plus the includeSocials switch.
  • 2026-09-16 (0.1): first version. Modes channels, liveStreams, clips, videos, categories and search; batch of 30 channel profiles per request; input names of other Twitch scrapers accepted; gambling and casino categories blocked in every mode; error rows free; live streams ranked by viewers across the directory.

This Actor only collects public data and respects the site's terms.

Em português

Twitch Scraper extrai perfis de canais (seguidores, parceiro, bio, redes sociais, viewers ao vivo), as lives com mais audiência por categoria e idioma, clipes por canal ou categoria, VODs e o diretório de categorias com viewers, tudo sem login e sem chave de API. Serve para agências de marketing de influência, patrocinadores e produtos de analytics de streaming.

  • Agências: conferir seguidores, status de parceiro e redes de uma lista de criadores, 30 canais por requisição.
  • Patrocinadores: ver as lives mais assistidas da categoria e do idioma agora, com viewers, tags e miniatura.
  • Analytics: acompanhar viewers por categoria, views de VODs e desempenho de clipes com agendamento.

Preço: US$ 2,50 por 1.000 linhas no plano Free (US$ 2,00 no Gold), sem mensalidade e sem taxa por execução. Canal inexistente, filtro sem resultado e requisição bloqueada voltam como linha gratuita com errorCode. Categorias de aposta, cassino e jogo de azar não são coletadas em nenhum modo. Mensagens de chat ficam fora do escopo.

Keywords: twitch scraper, twitch api, twitch channel scraper, twitch streamers, twitch live streams, twitch viewers, twitch clips, twitch vods, twitch categories, twitch directory, twitch followers, streamer analytics, influencer marketing, esports data, twitch search, live streaming data.