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

Scrape Twitch without an API key: live streams by game or language, top categories, channel profiles with followers and socials, recent VODs, top clips and channel search. $1 per 1,000 results.

- **URL**: https://apify.com/kmscrape/twitch-scraper.md
- **Developed by:** [kfir messika](https://apify.com/kmscrape) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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 Streams, Channels & Clips Scraper

Collect public Twitch data through Twitch's GraphQL endpoint. Get live streams, category rankings, channel profiles, recent VODs, popular clips, and channel search results in a clean dataset.

### What it collects

- Current top live streams overall and for named games or categories, including viewer count, language, start time, tags, broadcaster, game, preview image, and channel URL.
- Top games/categories, with viewer totals, follower totals, and box art.
- Channel profiles by login or Twitch URL, including description, followers, partner/affiliate status, live status and current stream, creation date, profile image, and available social links.
- A channel's recent VODs and most viewed clips when enabled.
- Channel search results by keyword.

All data comes from public, unauthenticated Twitch GraphQL queries. Twitch can change its schema or limit requests at any time. Twitch does not expose a language filter on the queried stream fields, so the actor filters the returned stream page locally.

### Use cases

- Track live audiences and category activity for creator research.
- Build channel and clip discovery lists for marketing or media analysis.
- Feed normalized Twitch records to dashboards, data pipelines, AI agents, or MCP-connected tools.
- Compare public profile and stream metadata over repeated runs.

### Input

| Field | Meaning | Default |
|---|---|---|
| `games` | Category names to collect live streams from | `Counter-Strike` prefill |
| `channels` | Channel logins or URLs for profiles | `shroud` prefill |
| `searchTerms` | Keywords for channel search | Empty |
| `topStreams` | Collect top streams and categories | `true` |
| `includeVideos` | Include recent VODs for each channel | `false` |
| `includeClips` | Include top clips for each channel | `false` |
| `language` | Stream language code such as `en` or `ja` | Empty |
| `maxItemsPerSource` | Maximum results per source, from 1 to 100 | `100` (prefill `20`) |

The default run searches overall streams, Counter-Strike streams, the top categories, and the `shroud` profile. Set `games` and `channels` to empty arrays to omit those sources.

### Output

Each data row has a `type`: `stream`, `game`, `channel`, `video`, or `clip`. A real trimmed example from the probe:

```json
{
  "type": "stream",
  "title": "LIVE: Team Falcons vs. Team Spirit - ESL Pro League Season 24 - Playoffs",
  "viewers": 69356,
  "language": "EN",
  "startedAt": "2026-10-09T07:27:28Z",
  "tags": [],
  "login": "eslcs",
  "displayName": "ESLCS",
  "game": "Counter-Strike",
  "thumbnail": "https://static-cdn.jtvnw.net/previews-ttv/live_user_eslcs-440x248.jpg",
  "url": "https://www.twitch.tv/eslcs"
}
```

Profile rows include `followers`, `isPartner`, `isAffiliate`, `isLive`, `currentStream`, `socials`, and `profileImageURL`. Video rows include `views`, `durationSeconds`, `createdAt`, and a Twitch VOD URL. Clip rows include the same fields and Twitch's clip URL.

### Pricing

**$1.00 per 1,000 results**

Only data rows are charged through the `result` event. Summary and error records are free.

### Limits and notes

- Maximum requested results per source is 100.
- Twitch's public API controls the available page size and fields.
- Language is filtered from returned live stream rows because the public GraphQL fields reject a language argument.
- Social links are included only when Twitch provides them.
- Public VOD and clip availability varies by channel and region.

### FAQ

#### Do I need a Twitch account or API token?

No. The actor uses public Twitch GraphQL queries and does not ask for an account token.

#### Can I pass channel URLs?

Yes. Provide a Twitch channel login, `@login`, or URL such as `https://www.twitch.tv/shroud`.

#### Why are there no video rows?

Enable `includeVideos` or `includeClips`. A channel may also have no public VODs or clips.

#### Is the language filter applied by Twitch?

No. The endpoint returns language in each stream row but rejects a language argument, so the scraper filters a wider returned page locally.

# Actor input Schema

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

Twitch game or category names; returns the most viewed live streams in each category.

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

Twitch channel logins or channel URLs. Profiles are collected for each channel.

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

Keywords to search among public Twitch channels.

## `topStreams` (type: `boolean`):

Include Twitch's currently top live streams and top game categories.

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

For each channel, include its recent public VODs.

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

For each channel, include its most viewed public clips.

## `language` (type: `string`):

Optional Twitch stream language code, such as en, es, or ja. Applies to live streams.

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

Maximum number of rows returned for each stream, game, channel, video, clip, or search source.

## Actor input object example

```json
{
  "games": [
    "Counter-Strike"
  ],
  "channels": [
    "shroud"
  ],
  "topStreams": true,
  "includeVideos": false,
  "includeClips": false,
  "maxItemsPerSource": 20
}
```

# 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 = {
    "games": [
        "Counter-Strike"
    ],
    "channels": [
        "shroud"
    ],
    "maxItemsPerSource": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("kmscrape/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 = {
    "games": ["Counter-Strike"],
    "channels": ["shroud"],
    "maxItemsPerSource": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("kmscrape/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 '{
  "games": [
    "Counter-Strike"
  ],
  "channels": [
    "shroud"
  ],
  "maxItemsPerSource": 20
}' |
apify call kmscrape/twitch-scraper --silent --output-dataset

```

## MCP server setup

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