# Twitch Scraper | Channels, Live Streams, VODs & Chat (`piotrv1001/twitch-channel-scraper`) Actor

Scrape Twitch channels by username, keyword or game, or the top live streams right now: followers, live viewers, stream title and tags, bio, business emails, socials and panel links. Add VODs, top clips and full chat replays. No login.

- **URL**: https://apify.com/piotrv1001/twitch-channel-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Social media, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 16 total users, 9 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 channels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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, Live Streams, VODs & Chat

Get **Twitch stats** for any channel without an account or API key. This **Twitch scraper** collects channels by username, keyword search, game category (the top streamers live there right now) or the **top live streams on all of Twitch**, and returns follower count, live status and viewer count, last stream, bio, business emails and panel links. Add each channel's VODs and top clips, and export the full chat logs of any past broadcast, as JSON, CSV or Excel.

### 🎯 Use Cases

- **Track Twitch stats over time**: schedule a run and log follower count, live viewers and stream titles for the channels you follow, your own Twitch analytics without a dashboard subscription.
- **Find the top streamers in any game**: list the most-watched live channels in Fortnite, Just Chatting or any category, or across all of Twitch, per stream language.
- **Export Twitch chat logs**: download every chat message of a past broadcast with its time in the VOD, user and badges, for moderation reviews, sentiment analysis or highlight finding.
- **Influencer outreach with Twitch emails**: collect business emails from bios and About panels, plus merch, tip and sponsor links, to build a streamer contact list.
- **Analyse Twitch VODs and clips**: see which past broadcasts and clips get the most views, how long streams run and which games a channel plays.
- **Replace a Twitch API integration**: get public channel data as a dataset or API call, with no app registration or OAuth tokens.

### ✨ Features

- **Channel profiles**: follower count, partner and affiliate status, language, bio, profile and banner images, account creation date and total video count.
- **Live status and viewers**: whether the channel is live, the stream title, game, viewer count, start time and tags, plus the last stream's date, title and game.
- **Contacts for outreach**: business emails found in the bio and About panels, the channel's linked socials (`socialLinks`: YouTube, X, Instagram, TikTok, Discord…) and every panel link (merch, tips, sponsors).
- **Channel search**: up to 100 channels per keyword.
- **Top streamers by game**: the most-watched live channels in any category, paged as deep as you set Max items (up to 2,000 per category and language), with one list per stream language you add. Filter by follower count to find smaller streamers.
- **Top live streams**: the most-watched live channels on all of Twitch right now (the top 30, or as many as Max items), overall or per stream language, no input needed. Each row has its `rank` in the list.
- **Twitch VODs**: every past broadcast, highlight and upload a channel lists, newest first, with views, duration, game and publish date.
- **Top clips**: most-viewed clips of all time, or of the last month, week or day, with views, duration, who clipped them and the VOD moment they came from.
- **Chat logs (chat replay)**: every chat message of a past broadcast with its time in the video, user, badges and emotes.
- **No duplicates**: a channel, video or clip found through several searches or games is saved and charged once.
- **Fair billing**: channels, games and videos that don't exist are skipped and not charged, and the run stops cleanly at your maximum cost per run.
- **No login**: no Twitch account or API key needed.

### 🛠️ How It Works

1. **Add channels, search keywords or games, or tick Top live streams**, in any mix, one per line. Channels work as `shroud`, `@shroud` or `https://www.twitch.tv/shroud`. Optionally set videos and clips per channel, or paste VOD URLs for chat logs.
2. **Set Max items**: the cap for channels, videos and clips across the whole run (50 in the form). Channels are taken from your lists in turn, so one search can't use up the whole limit.
3. **Run the scraper.** Rows land in the dataset, ready to download or to fetch via API, webhook or a scheduled run.

### ⚙️ Input

| Field | What it does |
| --- | --- |
| **Channels** (`channels`) | Usernames or channel URLs (also mobile, popout, embed and player links). Several on one line work too: `shroud, pokimane`. |
| **Search channels** (`searchQueries`) | Keywords to find channels, e.g. `valorant`, `cooking`. Up to 100 channels per keyword. |
| **Games / categories** (`games`) | Game or category names (`Fortnite`, `Just Chatting`) or category URLs. Returns the channels live there now, most-watched first: Twitch's first page (about 100) without Max items, as many as Max items with it (up to 2,000 per category and language). |
| **Top live streams** (`topLiveStreams`) | `true` adds the most-watched live channels on all of Twitch right now: the top 30 without Max items, as many as Max items with it, per language when you set languages. |
| **Stream languages** (`languages`) | Optional languages for the games and top live streams: codes such as `en`, `es`, `de`, `ja`, `ko`, `zh_hk`, or names such as `Spanish`. Each language returns its own list. |
| **Videos per channel** (`videosPerChannel`) | Past broadcasts, highlights and uploads per channel, newest first. Default `0` = none. Up to every video the channel lists (shroud: 1,616). |
| **Clips per channel** (`clipsPerChannel`) | Top clips per channel, most-viewed first. Default `0` = none. Twitch lists about 1,000 per period. |
| **Clips period** (`clipPeriod`) | `ALL_TIME` (default), `LAST_MONTH`, `LAST_WEEK` or `LAST_DAY`. |
| **Chat replay: video URLs** (`chatVideoUrls`) | VOD URLs (`https://www.twitch.tv/videos/2890960011`) or IDs for chat logs. |
| **Max chat messages per video** (`maxChatMessagesPerVideo`) | Stop each chat replay after this many messages. Default 1000, `0` = the whole chat. |
| **Min / Max followers** (`minFollowers`, `maxFollowers`) | Only save channels in this follower range; the rest are skipped and not charged. |
| **Max items** (`maxItems`) | Maximum channels + videos + clips for the whole run. `0` = no limit (live lists then stop at 2,000 per list and language). Left out (API), there is no total limit and live lists stop at Twitch's first page. Chat messages are limited by the setting above. |

```json
{
    "games": ["Just Chatting"],
    "languages": ["en", "es"],
    "videosPerChannel": 10,
    "maxItems": 500
}
```

The top live streams in English and Spanish, with their stream titles, games, viewers and tags:

```json
{
    "topLiveStreams": true,
    "languages": ["en", "es"],
    "maxItems": 60
}
```

An empty input runs a small example with `shroud` and `pokimane`.

### 💰 Pricing

Pay only for what you get, with no monthly rental.

| Event | Price | What you get |
| --- | --- | --- |
| **Channel** | $0.002 per channel ($2.00 per 1,000) | One channel with profile, followers, live status, emails and links |
| **Video** | $0.0005 per video ($0.50 per 1,000) | One past broadcast, highlight or upload |
| **Clip** | $0.0005 per clip ($0.50 per 1,000) | One clip |
| **Chat message** | $0.00002 per message ($0.02 per 1,000) | One chat replay message |
| **Actor start** | $0.00005 per run | Charged once when the run starts |

Examples:

- 100 channels = $0.20.
- 100 channels with their 10 newest VODs each = $0.20 + $0.50 = $0.70.
- The full chat log of a busy 3-hour broadcast (about 2,500 messages) = about $0.05.

### 📊 Sample Output: Twitch Stats, VODs, Clips and Chat Logs

Every row has a `type`: `channel`, `video`, `clip` or `chatMessage`. The Output tab has a separate view for each. A channel found through the `Fortnite` category (panels shortened):

```json
{
    "type": "channel",
    "id": "41245072",
    "login": "loserfruit",
    "displayName": "Loserfruit",
    "url": "https://www.twitch.tv/loserfruit",
    "description": "\"The streamer to watch when no one else is live....\" - Thomas Jefferson",
    "followers": 3048541,
    "isPartner": true,
    "isAffiliate": false,
    "language": "en",
    "isLive": true,
    "streamTitle": "Final Update of Season 4 | Obsession + Honey Sprite",
    "streamGame": "Fortnite",
    "viewers": 527,
    "streamStartedAt": "2026-10-15T09:44:02Z",
    "streamTags": ["English", "Australian", "crashout", "spritehunting", "giftsubsplease"],
    "lastStreamAt": "2026-10-15T09:44:07.578082Z",
    "lastStreamTitle": "Final Update of Season 4 | Obsession + Honey Sprite",
    "lastStreamGame": "Fortnite",
    "videoCount": 104,
    "emails": ["business@loserfruit.com", "loserfruit@gmail.com"],
    "socialLinks": [
        { "name": "discord", "title": "Discord", "url": "https://discord.gg/loserfruit" },
        { "name": "youtube", "title": "YouTube", "url": "https://www.youtube.com/user/TheLoserfruit" },
        { "name": "instagram", "title": "Instagram", "url": "https://www.instagram.com/loserfruit/" }
    ],
    "panelLinks": [
        "https://geni.us/lufu",
        "https://www.youtube.com/@GetRolledDND",
        "https://teampwr.gg/",
        "https://musclenation.org",
        "https://rog.gg/LufuDuo"
    ],
    "panels": [
        { "title": null, "description": null, "url": "https://geni.us/lufu" },
        {
            "title": null,
            "description": "… got business? send emails here...\nbusiness@loserfruit.com\nanything else?\nloserfruit@gmail.com (just me)",
            "url": null
        },
        "…"
    ],
    "profileImageUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/210e4120-b337-4ee1-af9b-731cccfca85c-profile_image-300x300.png",
    "bannerImageUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/447dc6f3-4588-4621-9aee-0032191d5474-profile_banner-480.jpeg",
    "createdAt": "2013-03-11T22:01:35.739177Z",
    "source": "game",
    "sourceQuery": "Fortnite",
    "rank": 12,
    "scrapedAt": "2026-10-15T10:03:32.473Z"
}
```

A VOD, a clip and a chat message:

```json
[
    {
        "type": "video",
        "id": "2890960011",
        "url": "https://www.twitch.tv/videos/2890960011",
        "title": "grinding to 2100 + crafting perhaps",
        "channel": "shroud",
        "videoType": "archive",
        "views": 3970,
        "durationSeconds": 44292,
        "game": "AION 2",
        "language": "en",
        "description": null,
        "publishedAt": "2026-10-03T18:18:00Z",
        "thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/…/thumb0-640x360.jpg",
        "scrapedAt": "2026-10-04T15:30:33.667Z"
    },
    {
        "type": "clip",
        "id": "3384387663",
        "slug": "StylishQuaintWoodpeckerResidentSleeper-431DngfrzjaQchSs",
        "url": "https://www.twitch.tv/pokimane/clip/StylishQuaintWoodpeckerResidentSleeper-431DngfrzjaQchSs",
        "title": "wow",
        "channel": "pokimane",
        "views": 488732,
        "durationSeconds": 35,
        "game": "Just Chatting",
        "language": "en",
        "clippedBy": "response97",
        "createdAt": "2022-09-01T19:22:23Z",
        "vodId": "1578987447",
        "vodOffsetSeconds": 1829,
        "thumbnailUrl": "https://static-cdn.jtvnw.net/twitch-video-assets/…/thumb-0000000000-1920x1080.jpg",
        "scrapedAt": "2026-10-20T15:21:35.142Z"
    },
    {
        "type": "chatMessage",
        "id": "1d66272e-b99f-46e8-8c18-3bfd7c6ae600",
        "videoId": "2890960011",
        "channel": "shroud",
        "offsetSeconds": 17,
        "postedAt": "2026-10-03T18:18:18.943Z",
        "username": "izzy_tv",
        "displayName": "izzy_tv",
        "userId": "60978459",
        "message": "OY",
        "emoteIds": [],
        "badges": ["subscriber/0", "nopixel-v-launch/1"],
        "userColor": "#FFCB00",
        "videoTitle": "grinding to 2100 + crafting perhaps"
    }
]
```

| Field | Description |
| --- | --- |
| `followers`, `videoCount` | Totals at the time of the run. |
| `isLive`, `viewers`, `streamGame` | The live stream right now; `null` when the channel is offline. |
| `emails` | Email addresses written in the bio or About panels. |
| `panelLinks`, `panels` | Every link from the channel's About panels, and each panel's text. |
| `videoType` | `archive` (past broadcast), `highlight` or `upload`. |
| `vodId`, `vodOffsetSeconds` | The VOD a clip was cut from and the second it starts at. |
| `offsetSeconds` | When the chat message was sent, in seconds from the start of the video. |
| `source`, `sourceQuery` | How the channel was found: `channel`, `search`, `game` or `top` (top live streams), and which keyword, game or language. |
| `rank` | The channel's position in its search, game or top live list (most-watched first for live lists); `null` for channels you entered. |

### 🔁 Schedule Twitch Stats Tracking and Integrate

Live data is a snapshot, so run it on a schedule to turn it into Twitch analytics: **hourly** to track viewer count and live status, **daily** to track follower count and new VODs, and once after each broadcast to save its chat log. Set it up in Apify **Schedules**, keeping the same input so every run is a dated row you can compare. Send the results to **Google Sheets**, **Zapier**, **Make**, **n8n** or a webhook with Apify **integrations**, so new stats land where your team already works.

### 🤖 Use with AI Agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "games": ["Valorant"], "languages": ["en"], "maxItems": 20 }
```

### ❓ Twitch Stats and API FAQ

**Does Twitch have an official API?** Yes, the Twitch Helix API. To use it you register an application, get a client ID and an OAuth token, and stay within its rate limits. It doesn't return some data that public Twitch pages show, such as a past broadcast's chat replay or a channel's About panels. This Actor needs no key, app or token and returns that data in one dataset: channel stats, VODs, clips, panel links and chat logs.

**Can I export the chat logs of a Twitch VOD?** Yes. Paste the VOD URL in Chat replay and set Max chat messages per video to `0` for the whole chat. Each message comes with its time in the video, the user, badges and emote IDs. It works for past broadcasts that are still available; in extremely busy seconds a few messages may be missed.

**How do I find the top streamers in a game?** Add the game or category name, e.g. `Fortnite`. You get its most-watched live channels right now: set Max items for as many as you need (up to 2,000 per language). Add stream languages for one list per language, and Min / Max followers to keep only streamers of a certain size.

**How do I get the top live streams on Twitch?** Tick Top live streams (`"topLiveStreams": true`). You get the most-watched live channels on all of Twitch right now, with stream title, game, viewers, start time and tags. Set Max items for more than the top 30, and stream languages for a list per language.

**Do I need a Twitch account?** No. Everything comes from public channel pages.

**Why is a field empty?** `viewers`, `streamTitle` and `streamGame` are `null` when the channel is offline. `emails` is empty when the channel writes no address in its bio or panels, and panel `title` or `description` is `null` for image-only panels. `videoCount` can occasionally be `null` when Twitch doesn't return it.

**Are there limits?** Search returns up to 100 channels per keyword. Live lists (games and top streams) go up to 2,000 channels per list and language, and Twitch itself stops a category's list at about 1,300 (Just Chatting: about 1,300 of 5,000+ live): add languages for more. VODs: every video the channel lists, newest first (shroud: 1,616). Clips: about 1,000 per period. The run's status message says when a list or channel had more than the run read.

### 🔗 Related Scrapers

- [YouTube Channel Videos Scraper](https://apify.com/piotrv1001/youtube-channel-videos-scraper): the same streamers' YouTube uploads with views and dates, next to their Twitch VODs.
- [YouTube Comments Scraper](https://apify.com/piotrv1001/youtube-comments-scraper): audience comments on YouTube videos, to pair with Twitch chat logs for sentiment analysis.
- [TikTok Profile Videos Scraper](https://apify.com/piotrv1001/tiktok-profile-videos-scraper): a creator's TikTok videos and stats, for cross-platform influencer research.
- [Snapchat Profile Scraper](https://apify.com/piotrv1001/snapchat-profile-scraper): public Snapchat creator profiles, for the same outreach lists.
- [Likee Videos Scraper](https://apify.com/piotrv1001/likee-videos-scraper): every video of a Likee creator with views and likes.

# Actor input Schema

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

Twitch channels, one per line: a username (shroud) or a channel URL (https://www.twitch.tv/shroud).

## `searchQueries` (type: `array`):

Find channels by keyword, one per line (valorant, cooking, asmr). Up to 100 channels per keyword, in Twitch's search order.

## `games` (type: `array`):

Game or category names (Fortnite, Just Chatting) or category URLs. Returns the channels live in that category right now, most-watched first. Without Max items you get Twitch's first page (about 100); with Max items the Actor pages on (up to 2,000 per category and language with 0). Set languages below for one list per language.

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

Add the most-watched live channels on all of Twitch right now, with stream title, game, viewers and tags. Without Max items you get the top 30; with Max items the Actor pages on (up to 2,000 per language with 0). Set languages below for one list per language. No channel, keyword or game needed.

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

Optional stream languages for the games and top live streams above: two-letter codes (en, es, de, ja, ko, pt, zh, zh_hk) or names (Spanish). Each language returns its own most-watched live channels.

## `videosPerChannel` (type: `integer`):

Past broadcasts, highlights and uploads to save for each channel, newest first. 0 = none. Pages through every video Twitch lists for the channel (shroud: 1,616).

## `clipsPerChannel` (type: `integer`):

Top clips to save for each channel, most-viewed first, from the period below. 0 = none. Twitch lists about 1,000 clips per period.

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

Which clips count as top clips: all time (default), or only clips made in the last month, week or day.

## `chatVideoUrls` (type: `array`):

Past broadcasts whose chat you want, one per line (https://www.twitch.tv/videos/2890960011 or just the ID). Every message with its time in the video, user, badges and emotes.

## `maxChatMessagesPerVideo` (type: `integer`):

Stop each chat replay after this many messages. 0 = the whole chat.

## `minFollowers` (type: `integer`):

Only save channels with at least this many followers (others are skipped and not charged). Leave empty for no minimum.

## `maxFollowers` (type: `integer`):

Only save channels with at most this many followers, e.g. to find smaller streamers in a game. Leave empty for no maximum.

## `maxItems` (type: `integer`):

Maximum number of channels, videos and clips to save in total (chat messages are limited by their own setting). 0 = no limit. Leave empty for no total limit: live lists then stop at Twitch's first page (100 per game, 30 top streams).

## `proxyConfiguration` (type: `object`):

Not needed for Twitch; leave as is.

## Actor input object example

```json
{
  "channels": [
    "shroud",
    "pokimane"
  ],
  "topLiveStreams": false,
  "videosPerChannel": 0,
  "clipsPerChannel": 0,
  "maxChatMessagesPerVideo": 1000,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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",
        "pokimane"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/twitch-channel-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",
        "pokimane",
    ],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/twitch-channel-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",
    "pokimane"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call piotrv1001/twitch-channel-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/twitch-channel-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/vRf2fJ9Wa7xn91XJs/builds/SxyRvREgWiuwvzyrx/openapi.json
