# Twitch Channel Scraper (`piotrv1001/twitch-channel-scraper`) Actor

Scrape Twitch channels by username, keyword or game: followers, live status and viewers, last stream, bio, business emails, socials and panel links. Add past broadcasts, top clips and full VOD chat replays. No login. Ideal for streamer discovery, influencer outreach and stream analytics.

- **URL**: https://apify.com/piotrv1001/twitch-channel-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 2 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 Channel Scraper

Easily extract Twitch channel data without an account. The **Twitch Channel Scraper** collects channels by username, keyword search or game category (the channels live right now), and returns followers, live status and viewers, last stream, bio, business emails, social and panel links. Optionally add each channel's past broadcasts, top clips, and the full chat replay of any VOD. Results are ready as JSON, CSV or Excel.

### ✨ Features

- 👤 **Channel profiles**: followers, partner/affiliate status, language, bio, profile and banner images, account creation date and total video count.
- 🔴 **Live status**: 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 panels, linked socials (YouTube, X, Instagram, TikTok, Discord…) and every panel link (merch, tips, sponsors).
- 🔍 **Channel search**: up to 100 channels per keyword.
- 🎮 **Live channels by game**: the most-watched live channels in any category, with up to 100 more for each stream language you add.
- 🎬 **Videos (VODs)**: past broadcasts, highlights and uploads with views, duration, game and publish date.
- ✂️ **Top clips**: most-viewed clips (all time, last month, week and day) with views, duration, who clipped them and the VOD moment they came from.
- 💬 **Chat replay**: every chat message of a past broadcast with its time in the video, user, badges and emotes.
- 🧹 **No duplicates**: a channel found through several searches or games is saved and charged once.
- ⚡ **No login, no browser**: fast and light.

### 🛠️ How It Works

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

### 📥 Input

| Field | Description |
| --- | --- |
| `channels` | Usernames or channel URLs. |
| `searchQueries` | Keywords to find channels, e.g. `valorant`, `cooking`. |
| `games` | Game or category names (`Fortnite`, `Just Chatting`) or category URLs. Returns the channels live there now. |
| `languages` | Optional language codes for the games, e.g. `en`, `es`, `de`. |
| `videosPerChannel` | Past broadcasts, highlights and uploads per channel, newest first (default `0` = none). |
| `clipsPerChannel` | Top clips per channel, most-viewed first (default `0` = none). |
| `chatVideoUrls` | VOD URLs (`https://www.twitch.tv/videos/2890960011`) or IDs for chat replay. |
| `maxChatMessagesPerVideo` | Stop each chat replay after this many messages (default 1000, `0` = the whole chat). |
| `maxItems` | Maximum channels + videos + clips for the whole run (default 50, `0` = no limit). |

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

### 💵 Pricing

Pay only for what you get, with no monthly fee:

| Event | Price |
| --- | --- |
| Channel | $0.002 per channel ($2 per 1,000) |
| Video | $0.0005 per video ($0.50 per 1,000) |
| Clip | $0.0005 per clip ($0.50 per 1,000) |
| Chat message | $0.00002 per message ($0.02 per 1,000) |
| Actor start | $0.00005 per run (per GB of memory) |

Examples: 100 channels cost $0.20; 100 channels with their 10 newest videos each cost $0.70. The full chat of a busy 3-hour broadcast (about 2,500 messages) costs about $0.05.

### 📊 Sample Output Data

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

```json
{
    "type": "channel",
    "id": "44445592",
    "login": "pokimane",
    "displayName": "pokimane",
    "url": "https://www.twitch.tv/pokimane",
    "description": "hi ♡ i stream sometimes 📧 Business inquiries: teampokimane@wmeagency.com",
    "followers": 9443737,
    "isPartner": true,
    "isAffiliate": false,
    "language": "en",
    "isLive": false,
    "streamTitle": null,
    "streamGame": null,
    "viewers": null,
    "streamStartedAt": null,
    "streamTags": [],
    "lastStreamAt": "2026-09-28T20:38:29.567135Z",
    "lastStreamTitle": "im sorry",
    "lastStreamGame": "Just Chatting",
    "videoCount": 583,
    "emails": ["teampokimane@wmeagency.com"],
    "socialLinks": [
        { "name": "instagram", "title": "Instagram", "url": "https://www.instagram.com/imane" },
        { "name": "youtube", "title": "YouTube", "url": "https://www.youtube.com/pokimane" },
        { "name": "tiktok", "title": "TikTok", "url": "https://www.tiktok.com/@poki" }
    ],
    "panelLinks": ["https://streamelements.com/pokimane/tip", "https://www.discord.gg/poki"],
    "panels": [{ "title": null, "description": null, "url": "https://streamelements.com/pokimane/tip" }],
    "profileImageUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/912232e8-9e53-4fb7-aac4-14aed07869ca-profile_image-300x300.png",
    "bannerImageUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/cfaf7ac8-56d9-4f3a-b5b0-328e90976ea3-profile_banner-480.jpeg",
    "createdAt": "2013-06-07T14:25:22.266478Z",
    "source": "channel",
    "sourceQuery": null,
    "scrapedAt": "2026-10-04T15:21:08.218Z"
}
```

A video, 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": 3907,
        "durationSeconds": 44292,
        "game": "AION 2",
        "language": "en",
        "publishedAt": "2026-10-03T18:18:00Z",
        "thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/…/thumb0-640x360.jpg"
    },
    {
        "type": "clip",
        "id": "2358589597",
        "url": "https://www.twitch.tv/shroud/clip/TangentialBillowingJalapenoYee-ccA2oB1pEYh4CHWJ",
        "title": "F Shroud",
        "channel": "shroud",
        "views": 563046,
        "durationSeconds": 28,
        "game": "Diablo IV",
        "clippedBy": "pato_bolado",
        "createdAt": "2023-06-02T11:41:50Z",
        "vodId": null,
        "vodOffsetSeconds": null
    },
    {
        "type": "chatMessage",
        "id": "1d66272e-b99f-46e8-8c18-3bfd7c6ae600",
        "videoId": "2890960011",
        "channel": "shroud",
        "offsetSeconds": 17,
        "postedAt": "2026-10-03T18:18:18.943Z",
        "username": "izzy_tv",
        "message": "OY",
        "emoteIds": [],
        "badges": ["subscriber/0", "nopixel-v-launch/1"],
        "userColor": "#FFCB00"
    }
]
```

| Field | Description |
| --- | --- |
| `followers`, `videoCount` | Totals at the time of the run. |
| `isLive`, `viewers`, `streamGame` | The live stream right now; `null` when offline. |
| `emails` | Email addresses written in the bio or panels. |
| `socialLinks`, `panelLinks` | The channel's linked socials, and every link from its About panels. |
| `videoType` | `archive` (past broadcast), `highlight` or `upload`. |
| `offsetSeconds` | When the chat message was sent, in seconds from the start of the video. |
| `source`, `sourceQuery` | How the channel was found: `channel`, `search` or `game`, and which keyword or game. |

### 💡 Good to Know

- **Twitch lists up to 100 results per view.** Search returns up to 100 channels per keyword, and a game returns its 100 most-watched live channels. Add languages, related keywords or more games for more. Videos combine the newest and most-viewed of each kind (up to a few hundred per channel), and clips combine the top 100 of each period.
- **Live data is a snapshot.** Schedule the run (e.g. hourly) to track viewers, live status and followers over time.
- **Chat replay** works for past broadcasts that are still available. In extremely busy seconds a few messages may be missed.
- Channels, games and videos that don't exist are skipped and **not charged**. The status message lists them.

Find streamers, track channels and analyse chat with **Twitch Channel Scraper** today! 🚀

# 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: up to 100 per category, or 100 per language when you set languages below.

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

Optional two-letter language codes for the games above (en, es, de). Each language returns its own top 100 live channels.

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

Past broadcasts, highlights and uploads to save for each channel, newest first. 0 = none. Twitch lists up to a few hundred per channel (the newest and most-viewed of each kind).

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

Top clips to save for each channel, most-viewed first (all time, last month, week and day combined). 0 = none.

## `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.

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

Maximum number of channels, videos and clips to save in total (chat messages are limited by the setting above). 0 = no limit.

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

Not needed for Twitch; leave as is.

## Actor input object example

```json
{
  "channels": [
    "shroud",
    "pokimane"
  ],
  "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/dsKGIMA9EcNjXiVpi/openapi.json
