# Twitch Scraper: Channels, Live Streams, Videos & Clips (`rjmacarthy/twitch-scraper`) Actor

Scrape Twitch channels (followers, live status, last stream, social links), live streams by category or across Twitch, VODs, clips and top categories. Language and viewer filters. No login, API key or browser. Pay per result, no start fee.

- **URL**: https://apify.com/rjmacarthy/twitch-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Social media, Videos, Lead generation
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 92.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 channel profile scrapeds

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, Videos & Clips

Scrape Twitch in one run: **channel profiles** with followers, partner status, live status, last stream and **public social links** (X/Twitter, YouTube, Instagram, TikTok, Discord...; see [Social links](#social-links) for how they are collected), **live streams** by category or across all of Twitch with language and viewer filters, channel **videos (VODs)** and **top clips**, and the **top categories** right now. Most Twitch scrapers do one of these jobs. This Actor does all of them in one run, so you can find who is live in your niche and get each streamer's profile and links for outreach. It reads Twitch's public website API: no login, no API key, no browser. You pay per result with **no start fee**: $2 per 1,000 channel profiles and $0.50 per 1,000 streams, videos, clips or categories.

### What data can you get?

| Item (`type`) | Fields |
|---|---|
| **channel** | login, display name, URL, bio, **followers**, partner / affiliate, created date, **live now** (stream title, category, viewers, start time, tags, language, preview image), current title / category / language settings, mature flag, **last broadcast** (title, category, date), total videos, **social links** (a list plus ready-made `twitterUrl`, `youtubeUrl`, `instagramUrl`, `tiktokUrl`, `discordUrl` and `facebookUrl` columns) and `socialLinksStatus` (where they came from), About panels (optional), profile, banner and offline images |
| **stream** | stream ID, URL, title, **viewers**, started at, language, tags, category, preview image, broadcaster login / name / **followers** / partner status, rank |
| **video** | video ID, URL, title, type (past broadcast, highlight, upload, premiere), **views**, duration, created and published dates, category, language, thumbnail, channel |
| **clip** | clip ID, slug, URL, embed URL, title, **views**, duration, created date, category, language, thumbnail, who clipped it, source VOD and offset, channel |
| **category** | name, slug, URL, **current viewers**, **live channels**, followers, tags, release date, box art, rank |

Every item has `type`, `id`, `url` and `scrapedAt`. Dates are ISO 8601, counts are numbers, and missing values are `null`. Each type has its own table view in the Output tab.

### Use cases

- **Influencer marketing and brand deals:** list the English (or German, Spanish...) streamers live in your game's category with at least N viewers, then get each one's followers, partner status and social links to contact them.
- **Talent and creator databases:** refresh follower counts, last-stream dates and social links for a list of channels on a schedule.
- **Esports and gaming analytics:** track the top categories, viewers and live channel counts over time, or the top 30–100 streams of a game.
- **Content research:** get the most-viewed clips of a channel for the last day, week or month, and its most-viewed VODs.
- **Sponsorship reporting:** check whether a sponsored channel streamed, in which category and how many people watched.

### How to use

1. Add **channels** (names or links) and/or **live-stream categories** (names, slugs or directory links).
2. Switch on what you need: videos, clips, top live streams across Twitch, profiles of live streamers, top categories.
3. Click **Start**. Most runs finish in a few seconds. Download the results as JSON, CSV or Excel, or use the API.

#### Input examples

Channel profiles with social links:

```json
{
    "channels": ["shroud", "https://www.twitch.tv/pokimane", "@lirik"]
}
```

Find English and Spanish streamers live in VALORANT with at least 200 viewers, plus their full profiles:

```json
{
    "liveCategories": ["VALORANT"],
    "liveLanguages": ["en", "es"],
    "minViewers": 200,
    "maxStreams": 100,
    "includeStreamerProfiles": true
}
```

Latest VODs and this week's top clips of some channels, without the profiles:

```json
{
    "channels": ["shroud", "pokimane"],
    "channelProfiles": false,
    "includeVideos": true,
    "videoType": "archive",
    "maxVideosPerChannel": 20,
    "includeClips": true,
    "clipsPeriod": "7d",
    "maxClipsPerChannel": 20
}
```

The top 100 live streams and the top 50 categories right now:

```json
{
    "topLiveStreams": true,
    "maxStreams": 100,
    "includeTopCategories": true,
    "maxCategories": 50
}
```

### Output example

Real items from a local run on 2 Nov 2026 (shortened; see `samples/sample-output.json` for the full items):

```json
[
  {
    "type": "channel",
    "id": "37402112",
    "login": "shroud",
    "displayName": "shroud",
    "url": "https://www.twitch.tv/shroud",
    "description": "I'm back baby",
    "followers": 11291704,
    "broadcasterType": "partner",
    "isLive": false,
    "channelTitle": "New Crimson Desert DLC ⛵",
    "channelLanguage": "en",
    "lastBroadcastTitle": "New Crimson Desert DLC ⛵",
    "lastBroadcastGame": "Crimson Desert",
    "lastBroadcastAt": "2026-10-30T01:24:18.641Z",
    "totalVideos": 1616,
    "socialLinks": [
      { "platform": "discord", "title": "Discord", "url": "https://discord.gg/shroud" },
      { "platform": "twitter", "title": "Twitter", "url": "https://twitter.com/shroud" },
      { "platform": "youtube", "title": "YouTube", "url": "https://youtube.com/shroud" },
      { "platform": "instagram", "title": "Instagram", "url": "https://instagram.com/shroud" }
    ],
    "socialLinksStatus": "complete",
    "twitterUrl": "https://twitter.com/shroud",
    "youtubeUrl": "https://youtube.com/shroud",
    "instagramUrl": "https://instagram.com/shroud",
    "discordUrl": "https://discord.gg/shroud",
    "scrapedAt": "2026-11-02T13:32:01.357Z"
  },
  {
    "type": "stream",
    "id": "317791385591",
    "url": "https://www.twitch.tv/lacy",
    "title": "🇰🇷 IRL SOUTH KOREA 🇰🇷 LACY x BRAEDEN 🇰🇷 KOREA NIGHTLIFE 🇰🇷 FULL DAY TOMORROW 🇰🇷 !CLIPPING",
    "viewers": 14683,
    "startedAt": "2026-11-02T09:24:52.000Z",
    "language": "en",
    "tags": ["English", "DropsEnabled"],
    "game": "Just Chatting",
    "broadcasterLogin": "lacy",
    "broadcasterFollowers": 3515338,
    "broadcasterType": "partner",
    "rank": 1,
    "category": "Just Chatting",
    "scrapedAt": "2026-11-02T13:32:03.566Z"
  },
  {
    "type": "clip",
    "id": "3573895506",
    "url": "https://www.twitch.tv/shroud/clip/PreciousRelievedCodCorgiDerp-IqjaHMAL8JQQH78F",
    "title": "shroud out of touch take",
    "views": 118211,
    "durationSeconds": 51,
    "createdAt": "2026-10-10T05:25:43.000Z",
    "game": "AION 2",
    "clippedBy": "Silentkillerz",
    "vodId": "2896289619",
    "channelLogin": "shroud",
    "period": "30d",
    "scrapedAt": "2026-11-02T13:32:01.357Z"
  }
]
```

A `RUN_SUMMARY` record in the run's key-value store lists every input with its status, item counts and request statistics.

### Pricing

Pay per result. There is no start fee and you never pay for failed inputs.

| Event | Price | Per 1,000 |
|---|---|---|
| `channel`: one channel profile | $0.002 | $2.00 |
| `stream`: one live stream | $0.0005 | $0.50 |
| `video`: one video / VOD | $0.0005 | $0.50 |
| `clip`: one clip | $0.0005 | $0.50 |
| `category`: one category | $0.0005 | $0.50 |

Examples:

- **1,000 channel profiles** with social links ≈ **$2.00**.
- **Influencer discovery:** 100 live streams in a category plus the 100 streamers' profiles ≈ $0.05 + $0.20 = **$0.25**.
- **Content tracking:** 20 VODs + 20 clips for each of 50 channels (2,000 items) ≈ **$1.00**.
- **Daily top-category snapshot:** 100 categories ≈ **$0.05**.

Set **Maximum cost per run** in the run options to cap your spend. The Actor stops cleanly when it is reached.

### Social links

Twitch keeps a channel's links in two places, and the Actor reads both:

1. **The social-links section** of the About page. Twitch serves it to home connections, but **withholds it from datacenter IPs**: it answers with an "integrity check" error for that one field. Apify runs on datacenter IPs, and Apify's datacenter proxy gets the same answer. We tested both on 2 Nov 2026.
2. **The About panels**, the image and text boxes under the stream. Twitch serves them everywhere, and most streamers link their X/Twitter, YouTube, Instagram, TikTok and Discord there.

Each channel item says which one you got:

| `socialLinksStatus` | Meaning |
|---|---|
| `complete` | Twitch's own social-links section. |
| `from-panels` | The section was withheld, so these are the links to known social platforms (X/Twitter, YouTube, Instagram, TikTok, Discord, Facebook, Kick, Threads, Bluesky, Reddit, Steam, Patreon, Linktree, VK, Telegram) found in the About panels. They usually cover the main platforms, but a link that appears only in the section is missed. |
| `unavailable` | The section was withheld and the panels hold no social links. |

An empty list is never silent: the run's status message and the `RUN_SUMMARY` record say how many profiles fell back to the panels. A residential proxy may return the complete section, but we have not tested that.

### Tips and limits

- **First page only.** Twitch serves anonymous visitors only the first page of every list (more needs a browser "integrity" token, which this Actor does not fake). So per channel you get up to **100 videos** (per type and sort order) and **100 clips** (per period), and up to **100 top categories**.
- **Live lists past the first page.** The first page of a category holds up to 100 streams (30 for all of Twitch). For bigger lists the Actor combines Twitch's per-language lists of the category, or the per-category lists for the site-wide top. The top of the list is exact. The tail can miss a few streams when one language alone has more than 100 qualifying streams. In that case the `RUN_SUMMARY` record has `exact: false` for that list. Narrowing with **Min viewers** or **Stream languages** keeps lists exact.
- **Languages** follow Twitch's broadcaster-language filter. The stream's own `language` field can differ: a few streamers set one language for the channel and another for the stream.
- **Clips** are sorted by views (Twitch's "top clips"). Clips from the last 24 hours can be empty for channels that did not stream.
- **Follower and viewer counts** are live values at the time of the run.
- **No personal contact data.** E-mail addresses are removed from bios, panels, link titles and stream/video/clip titles, phone numbers from bios, panels and link titles, and `mailto:` links are dropped. Viewer, chatter and follower lists are not available.
- **Several lists in one run:** a stream is output once per list it belongs to (e.g. its category list and the site-wide top list). The same category given twice (name and URL) is listed once.
- **Speed:** a few seconds for typical runs. 1,000 channel profiles need about 5 requests.

### FAQ

**Do I need a Twitch account or API key?**
No. The Actor reads the same public data that twitch.tv shows to logged-out visitors.

**Is it legal to scrape Twitch?**
This Actor collects only publicly visible data: channel profiles, public social links, live streams, videos, clips and categories. It does not log in, bypass access controls or collect e-mail addresses, viewer lists or other personal contact data. You are responsible for using the data in line with Twitch's terms, privacy laws such as the GDPR, and your own legal obligations. If you are unsure, ask a lawyer.

**Why did I get fewer streams than "Max live streams"?**
Only that many were live and matched your filters (language, min viewers). The run summary shows how many were found per list.

**How fresh is the data?**
It is read live from Twitch at run time. Schedule the Actor (e.g. every hour) to track changes over time.

**Why is `socialLinksStatus` "from-panels" on Apify when I get "complete" on my own computer?**
Twitch withholds the social-links section from datacenter IPs. See [Social links](#social-links). The links in the About panels are still collected.

**A channel is "not-found". Why?**
The name does not exist, was renamed or the channel is suspended. Other inputs in the run are not affected.

**Can it monitor live status?**
Yes. Schedule a run with your channel list. Each profile has `isLive`, `streamViewers`, `streamGame` and `lastBroadcastAt`.

**The run failed with an "integrity token" or HTTP 403/429 message. What now?**
Twitch occasionally blocks requests from some datacenter IPs. Enable **Apify Proxy** (residential) in the input and run again.

### Integrations

- **API:** start runs and download results from any language with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript / Python clients.
- **Make, Zapier, n8n:** use the Apify apps or nodes to run the Actor and send the results to Google Sheets, Airtable, HubSpot, Slack and more.
- **MCP / AI agents:** connect the Actor to Claude, ChatGPT or Cursor through the [Apify MCP server](https://mcp.apify.com).
- **Webhooks and schedules:** get notified when a run finishes, or run it on a schedule for daily snapshots.

### Changelog

- **0.1 (2026-11-02):** first release: channel profiles with social links (falling back to About-panel links when Twitch withholds the section) and About panels, live streams by category or across Twitch (language and min-viewer filters), videos, clips, top categories and profiles of discovered streamers.

### Ready-to-run examples

- [Get Twitch channel stats for shroud and pokimane](https://apify.com/rjmacarthy/twitch-scraper/examples/twitch-streamer-stats-shroud-pokimane)
- [Scrape top live Just Chatting streams on Twitch](https://apify.com/rjmacarthy/twitch-scraper/examples/top-live-just-chatting-streams-twitch)

### More scrapers by the same developer

- [Bilibili Scraper - Videos, Search, Popular & Uploader Stats](https://apify.com/rjmacarthy/bilibili-scraper)
- [Bluesky Scraper - Posts, Profiles, Threads & Feeds (No Login)](https://apify.com/rjmacarthy/bluesky-scraper)
- [Luma Events Scraper: Tech, AI & Crypto Events by City](https://apify.com/rjmacarthy/luma-events-scraper)
- [Meetup Events Scraper - Search Events & Groups by Topic & City](https://apify.com/rjmacarthy/meetup-events-scraper)
- [Skool Scraper - Community Stats & Public Posts (No Login)](https://apify.com/rjmacarthy/skool-scraper)
- [Snapchat Scraper - Public Profiles, Spotlight & Story Stats](https://apify.com/rjmacarthy/snapchat-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

# Actor input Schema

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

Twitch channel names or links: shroud, @shroud, https://www.twitch.tv/shroud or https://www.twitch.tv/shroud/videos. Each channel gives one profile item (followers, live status, last stream, social links), plus its videos and clips if switched on below.

## `channelProfiles` (type: `boolean`):

One item per channel (type "channel"): followers, partner/affiliate status, live stream (title, category, viewers, tags), last broadcast, total videos and public social links. From datacenter IPs Twitch withholds the social-links section; the links are then taken from the About panels (see socialLinksStatus). Switch off if you only want the videos or clips.

## `includePanels` (type: `boolean`):

Add the channel's About panels (title, text, link and image of each panel) to channel profiles. E-mail addresses and phone numbers in panel text are removed.

## `includeVideos` (type: `boolean`):

Output the channels' videos (type "video"): title, views, duration, date, category and thumbnail.

## `videoType` (type: `string`):

Which videos to list. Past broadcasts are the stream VODs; highlights and uploads are kept by Twitch permanently.

## `videoSort` (type: `string`):

Newest first, or most viewed first.

## `maxVideosPerChannel` (type: `integer`):

How many videos to output per channel. Twitch serves only the first 100 to anonymous visitors, so 100 is the maximum (0 = 100).

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

Output the channels' most-viewed clips (type "clip") from the period below: title, views, duration, date, category, clipper and the VOD it came from.

## `clipsPeriod` (type: `string`):

Time window for the top clips.

## `maxClipsPerChannel` (type: `integer`):

How many clips to output per channel, most viewed first. Twitch serves only the first 100 to anonymous visitors, so 100 is the maximum (0 = 100).

## `liveCategories` (type: `array`):

Categories (games) to list current live streams for, most viewers first: a name (Just Chatting, VALORANT), a slug (just-chatting) or a link (https://www.twitch.tv/directory/category/just-chatting). Misspelled names are matched with Twitch's category search.

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

Also list the most-watched live streams on the whole site (all categories).

## `liveLanguages` (type: `array`):

Only streams in these broadcaster languages. Leave empty for all languages.

## `minViewers` (type: `integer`):

Skip live streams with fewer current viewers.

## `maxStreams` (type: `integer`):

How many live streams to output per category (and for the top streams across Twitch), most viewers first. 0 = as many as Twitch serves. Above 100 per category the list is assembled from per-language lists, so the lowest-ranked entries are best effort.

## `includeStreamerProfiles` (type: `boolean`):

For every streamer found in the live lists, also output their full channel profile (social links, partner status, description...). Each profile is a "channel" item and is charged like one.

## `includeTopCategories` (type: `boolean`):

Output the most-watched categories right now (type "category"): viewers, live channels, followers, tags and box art.

## `maxCategories` (type: `integer`):

How many top categories to output. Twitch serves only the first 100 to anonymous visitors (0 = 100).

## `requestDelayMs` (type: `integer`):

Minimum time between two requests to Twitch. Most runs need only a handful of requests, so the default is fine.

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

Not needed for most runs. Turn on Apify Proxy (residential) only if Twitch blocks or rate-limits the run.

## Actor input object example

```json
{
  "channels": [
    "shroud",
    "pokimane"
  ],
  "channelProfiles": true,
  "includePanels": false,
  "includeVideos": false,
  "videoType": "archive",
  "videoSort": "time",
  "maxVideosPerChannel": 20,
  "includeClips": false,
  "clipsPeriod": "7d",
  "maxClipsPerChannel": 20,
  "liveCategories": [
    "Just Chatting"
  ],
  "topLiveStreams": false,
  "liveLanguages": [],
  "minViewers": 0,
  "maxStreams": 10,
  "includeStreamerProfiles": false,
  "includeTopCategories": false,
  "maxCategories": 50,
  "requestDelayMs": 250,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `channels` (type: `string`):

Channel profiles: followers, partner status, live stream, last broadcast and social links.

## `streams` (type: `string`):

Live streams with viewers, category, language, tags and broadcaster followers.

## `videos` (type: `string`):

Videos (VODs, highlights, uploads) with views, duration and date.

## `clips` (type: `string`):

Top clips with views, duration, date and clipper.

## `categories` (type: `string`):

Top categories by current viewers.

## `all` (type: `string`):

Every item with every field; filter by the type field.

## `summary` (type: `string`):

Per-input status, item counts, request statistics, notes on best-effort lists and any warnings.

# 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"
    ],
    "liveCategories": [
        "Just Chatting"
    ],
    "maxStreams": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/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",
        "pokimane",
    ],
    "liveCategories": ["Just Chatting"],
    "maxStreams": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/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",
    "pokimane"
  ],
  "liveCategories": [
    "Just Chatting"
  ],
  "maxStreams": 10
}' |
apify call rjmacarthy/twitch-scraper --silent --output-dataset

```

## MCP server setup

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