# Twitch Scraper: Channels, VODs, Clips & Live Streams 🎮 (`tagadanar/twitch-scraper`) Actor

Twitch channels, VODs, clips and live streams by channel, category or search. Followers, live viewers, VOD and clip views, panel social links and public business emails in flat rows. $1.50 per 1,000 rows, $2.50 per 1,000 channels, $0.001/run, usage included. Up to 100 per list. No login.

- **URL**: https://apify.com/tagadanar/twitch-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Videos, Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 vod, clip, live stream or categories

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Twitch Scraper: channels, VODs, clips and live streams

Get Twitch channel profiles, past broadcasts (VODs), clips, live streams by category and the top categories as flat rows you can open in Excel or send to your CRM. Every channel row carries followers, partner or affiliate status, whether it is live right now (title, game, viewers, start time, tags), its last stream, its VOD count, the links from its panels (Twitter/X, YouTube, Instagram, TikTok, Discord) and any business email the streamer posts publicly. Up to 100 items per list, and up to 300 VODs per channel. No Twitch account, no API key, no login.

Pricing: **$1.50 per 1,000 rows** (VODs, clips, live streams, categories) and **$2.50 per 1,000 channel profiles**, platform usage included, plus $0.001 per run. Store discounts apply (down to $1.05 and $1.75 per 1,000 on Gold).

### What you get

One dataset, one row per item, a `type` column to filter on: `channel`, `vod`, `clip`, `stream` or `category`. Fields a type does not have are `null`.

| field | channel | vod | clip | stream | category |
|---|---|---|---|---|---|
| `channelLogin`, `channelName`, `channelId` | yes | yes | yes | yes | |
| `url` | channel page | VOD page | clip page | channel page | directory page |
| `title` | | VOD title | clip title | stream title | category name |
| `followers` | yes | | | yes | category followers |
| `broadcasterType` (partner, affiliate, none) | yes | | | yes | |
| `isLive`, `viewers`, `streamTitle`, `streamStartedAt`, `tags` | yes (when live) | | | yes | `viewers`, `tags` |
| `viewCount`, `durationSeconds` | | yes | yes | | |
| `vodType` (archive, highlight, upload) | | yes | | | |
| `game`, `gameId`, `language` | yes | yes | yes | yes | yes |
| `createdAt`, `publishedAt` | account creation | yes | yes | | |
| `clippedBy`, `vodId`, `vodOffsetSeconds`, `isFeatured` | | | yes | | |
| `lastStreamTitle`, `lastStreamGame`, `lastStreamAt`, `vodCount` | yes | | | | |
| `twitterUrl`, `youtubeUrl`, `instagramUrl`, `tiktokUrl`, `discordUrl`, `panelLinks` | yes | | | | |
| `emails` (business emails posted in the bio or panels) | yes | | | | |
| `profileImageUrl`, `bannerImageUrl`, `thumbnailUrl` | yes | thumbnail | thumbnail | preview | box art |
| `liveChannels`, `rank` | | | | `rank` | yes |

For a channel that is offline, `game` is the category it last set. Every row also has `source` (which input produced it) and `scrapedAt`.

### Who uses it

- **Influencer and sponsorship teams**: list the channels live in your game right now, with followers, partner status, language and the business email from their bio, then export to your outreach sheet.
- **Esports and gaming analysts**: snapshot the top categories and the most watched streams every hour on a schedule and chart viewers over time.
- **Agencies and talent managers**: track a roster of channels: followers, last stream, new VODs and the clips that took off this week.
- **Clip editors and content teams**: pull the most viewed clips of a channel or a category for the last 24 hours, 7 days, 30 days or all time, with the source VOD and the timestamp in it.
- **Researchers**: VOD history (views, durations, games, dates) for a set of streamers.

### How to use it

Fill in one or more of the sources, pick what you want back, run.

- **Channels**: usernames (`shroud`) or channel URLs. You can also paste a single VOD URL (`https://www.twitch.tv/videos/2906978606`) or a clip URL (`https://www.twitch.tv/shroud/clip/...` or `https://clips.twitch.tv/...`) and get that one item.
- **Categories**: names as Twitch shows them (`Just Chatting`, `Fortnite`) or directory URLs (`https://www.twitch.tv/directory/category/just-chatting`).
- **Channel search**: keywords; each returns up to 100 matching channels with their profile data.
- **Top live streams** and **Top categories**: switches, no input needed.

Then choose: channel profiles, VODs (all types, past broadcasts, highlights or uploads; newest or most viewed), clips (period), live streams in categories, and optionally a list of stream languages.

#### Example: a channel roster with VODs and this week's clips

```json
{
  "channels": ["shroud", "pokimane", "https://www.twitch.tv/xqc"],
  "includeVods": true,
  "includeClips": true,
  "clipPeriod": "LAST_WEEK",
  "maxItemsPerSource": 50
}
```

#### Example: French and Spanish streamers live in Fortnite right now

```json
{
  "categories": ["Fortnite"],
  "languages": ["fr", "es"],
  "includeLiveStreams": true,
  "maxItemsPerSource": 200
}
```

#### Example: the top categories and top live streams, for an hourly schedule

```json
{
  "topCategories": true,
  "topLiveStreams": true
}
```

#### Example: monitor a roster (fresh profiles, only new VODs and clips)

```json
{
  "channels": ["shroud", "pokimane"],
  "includeVods": true,
  "includeClips": true,
  "clipPeriod": "LAST_DAY",
  "onlyNew": true,
  "monitorKey": "my-roster"
}
```

With **Only new VODs and clips (monitoring)** on, each run returns one up-to-date profile row per channel (followers, live status, stream title, viewers) plus only the VODs and clips that earlier runs with the same monitoring list name did not deliver. Categories return one snapshot row each (viewers, live channels), the current live streams and only their new clips. A quiet day costs one channel row per channel ($2.50 per 1,000 on Free) plus the run start. Channel profiles are always on in this mode.

### Limits you should know

- **Up to 100 items per list.** Twitch shows logged-out visitors the first page of each list (a channel's videos, its clips, a category's live streams, a search) and asks for an extra integrity token for every page after that. This actor does not use such tokens, so it reads first pages only. To go further it uses lists Twitch shows anyway: with a per-list cap above 100, VODs come from each type's own first page (past broadcasts, highlights, uploads: up to 300 per channel) and live streams from the overall top 100 plus each language's top 100. When a list was cut by this rule, the run status says `FIRST_PAGE_ONLY` for that list.
- **Top live streams across all of Twitch: 30.** That is what Twitch shows a logged-out visitor.
- **Clips are the most viewed of the period**, not a full clip archive.
- **The channel's "social links" block is not offered.** Twitch asks for an integrity token for it from cloud servers. Social URLs come from the channel's panels and bio links instead, which most streamers fill.
- Not offered: subscriber counts (private to the streamer), chat logs, video downloads.
- Business emails are only what the streamer posted publicly in the bio or panels. Many channels post none.

### Pricing

| event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| VOD, clip, live stream or category row (per 1,000) | $1.50 | $1.35 | $1.20 | $1.05 |
| Channel profile row (per 1,000) | $2.50 | $2.25 | $2.00 | $1.75 |
| Run start | $0.001 | $0.001 | $0.001 | $0.001 |

Platform usage is included. You pay only for delivered rows: missing channels, rows dropped by your language filter and VODs or clips already delivered in monitoring mode are free. A 100-channel roster with profiles only costs $0.251 on Free (100 channels plus the run start).

### Run status

Every run ends with one line naming each list's outcome, for example `channel:shroud/vods: 100 row(s), FIRST_PAGE_ONLY`. Outcomes: `COMPLETE`, `FIRST_PAGE_ONLY`, `PROVEN_EMPTY` (Twitch returned an empty list), `NOT_FOUND` (no such channel, category, VOD or clip), `ALREADY_DELIVERED` (monitoring mode), `FILTERED_OUT`, and the failures `INTEGRITY_REQUIRED`, `THROTTLED`, `REFUSED`, `ORIGIN_ERROR`, `CLOCK_STOPPED`, `RESULT_CAP`, `CHARGE_LIMIT`. A run that delivers nothing fails with the reason, unless Twitch proved there was nothing new or nothing at all.

### FAQ

**How do I scrape Twitch VODs of a channel?** Put the username in Channels and switch on VODs. Choose past broadcasts, highlights or uploads, newest or most viewed.

**Can I get the Twitch clips of a game?** Yes. Put the game in Categories, switch on Clips and pick the period. You get the most viewed clips of that period with views, clipper, duration and the source VOD.

**How do I find Twitch streamers for sponsorships?** Put your game in Categories with Live streams on, filter by language, then feed the channel logins back as Channels to get their profiles and business emails. Or use Channel search with a keyword.

**Does it need a Twitch account or API key?** No. It reads what Twitch shows any logged-out visitor.

**Is there a Twitch API alternative without OAuth?** That is what this is: no client ID of your own, no OAuth app, no token.

**How fresh is the data?** Live: every run asks Twitch at that moment. Live viewers and follower counts are as of `scrapedAt`.

**Why did I get fewer than 100 live streams?** Twitch's first page sometimes returns a few under 100, and your language filter drops streams in other languages (counted in the status).

**Can I monitor new VODs and clips?** Yes: schedule the actor with Only new VODs and clips (monitoring) on. Each run returns a fresh profile row per channel plus only the new VODs and clips.

### Related actors

- [YouTube Channel Scraper](https://apify.com/tagadanar/youtube-channel-scraper): the same roster tracking for YouTube channels and videos.
- [Bilibili Scraper](https://apify.com/tagadanar/bilibili-scraper): Chinese video creators and trending videos.

Keywords: twitch scraper, twitch vod scraper, twitch clips scraper, twitch channel scraper, twitch live streams, twitch streamer emails, twitch followers, twitch top games, twitch category streams, twitch api alternative.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/twitch-scraper/changelog.md

# Actor input Schema

## `channels` (type: `array`):

Twitch usernames (shroud) or channel URLs (https://www.twitch.tv/shroud). You can also paste single VOD URLs (twitch.tv/videos/123) and clip URLs (twitch.tv/name/clip/slug or clips.twitch.tv/slug): each returns that one VOD or clip.

## `categories` (type: `array`):

Category names as shown on Twitch (Just Chatting, Fortnite) or directory URLs (https://www.twitch.tv/directory/category/just-chatting). Returns the live streams in each category, most watched first, and its top clips when Clips is on.

## `searchTerms` (type: `array`):

Keywords to find channels (valorant, cooking, asmr). Each term returns up to 100 matching channels with their profile data.

## `topLiveStreams` (type: `boolean`):

Add the 30 most watched live streams on all of Twitch right now (Twitch shows 30 to logged-out visitors).

## `topCategories` (type: `boolean`):

Add the most watched categories right now, with live viewers, live channels and followers (up to 100).

## `includeProfiles` (type: `boolean`):

One row per channel: followers, partner or affiliate, live now (title, game, viewers, start time, tags), last stream, VOD count, panel links, social URLs and any business email the channel posts publicly.

## `includeVods` (type: `boolean`):

Each channel's videos with views, duration, game, date and thumbnail.

## `includeClips` (type: `boolean`):

The most viewed clips of each channel and each category in the clip period below, with views, duration, game, clipper and the source VOD.

## `includeLiveStreams` (type: `boolean`):

For each category, the channels live in it now with viewers, title, language, tags, followers and partner status.

## `vodType` (type: `string`):

Which videos to return for channels.

## `vodSort` (type: `string`):

Newest videos or the most viewed ones.

## `clipPeriod` (type: `string`):

Clips created in this period, most viewed first.

## `languages` (type: `array`):

Keep only live streams in these languages (two-letter codes: en, es, fr, de, pt, ja, ko, ru, it, pl, tr, zh). Empty = all languages.

## `maxItemsPerSource` (type: `integer`):

Cap for each list: a channel's VODs, a channel's clips, a category's live streams or clips, one search. Twitch shows logged-out visitors the first 100 items of a list; above 100 the actor adds each VOD type's own list and, for live streams, each language's top 100.

## `maxResults` (type: `integer`):

Stops the run once this many rows were delivered. You pay only for delivered rows.

## `onlyNew` (type: `boolean`):

For scheduled monitoring: each run returns one up-to-date profile row per channel (followers, live status, stream title, viewers), one snapshot row per category, the current live streams, and only the VODs and clips that earlier runs with the same monitoring list name did not deliver. Channel profiles are always on in this mode.

## `monitorKey` (type: `string`):

Keeps separate only-new histories for separate schedules. Letters, digits, underscores and hyphens.

## Actor input object example

```json
{
  "channels": [
    "shroud"
  ],
  "categories": [
    "Just Chatting"
  ],
  "topLiveStreams": false,
  "topCategories": false,
  "includeProfiles": true,
  "includeVods": true,
  "includeClips": true,
  "includeLiveStreams": true,
  "vodType": "ALL",
  "vodSort": "TIME",
  "clipPeriod": "LAST_WEEK",
  "maxItemsPerSource": 10,
  "maxResults": 50,
  "onlyNew": false,
  "monitorKey": "default"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "channels": [
        "shroud"
    ],
    "categories": [
        "Just Chatting"
    ],
    "includeVods": true,
    "includeClips": true,
    "maxItemsPerSource": 10,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/twitch-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "channels": ["shroud"],
    "categories": ["Just Chatting"],
    "includeVods": True,
    "includeClips": True,
    "maxItemsPerSource": 10,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/twitch-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "channels": [
    "shroud"
  ],
  "categories": [
    "Just Chatting"
  ],
  "includeVods": true,
  "includeClips": true,
  "maxItemsPerSource": 10,
  "maxResults": 50
}' |
apify call tagadanar/twitch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/twitch-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6U6xgJveTN93aIoNW/builds/282QPnsAc7NHcEukJ/openapi.json
