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

Scrape Twitch channel profiles (followers, partner status, socials, live viewers), live streams by category and language, clips by channel or category, VODs and categories with viewer counts. Public GraphQL, no login. US$ 2.50 per 1,000 items; channels not found are free.

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

## Pricing

from $1.80 / 1,000 twitch item delivereds

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

**Twitch Scraper** turns Twitch's public data into clean, flat rows: channel profiles with followers, partner status, bio and social links, the live streams running right now by category and language, clips by channel or category, past broadcasts (VODs) and the category directory with live viewers and broadcaster counts. It is built for influencer marketing agencies, brand sponsorship teams and streaming analytics products that need Twitch numbers without a developer app, without an OAuth token and without a browser.

- **Influencer agencies:** check followers, partner status, socials and what a creator streamed last before pitching a campaign, thirty channels per request.
- **Sponsors and brand teams:** list the most watched live streams in your category and language every hour, with viewer counts, tags and thumbnails, and see who is live right now.
- **Streaming analytics:** track category viewers, VOD views, clip performance and the top of the directory over time with a schedule, and feed dashboards, BI or AI agents.

Price: **US$ 2.50 per 1,000 rows** on the Free plan, down to US$ 2.00 on Gold and above. No monthly fee and no fee per run start. Channels that do not exist, filters with no match and blocked requests are free. AI agents can call it through the Apify MCP server.

### At a glance

| | This Actor | automation-lab/twitch-scraper (best measured competitor) | easyapi/twitch-channel-scraper |
|---|---|---|---|
| Price per 1,000 channel rows, Free plan | **US$ 2.50** | US$ 3.45 | US$ 4.99 |
| Price per 1,000 channel rows, Gold plan and above | **US$ 2.00** | US$ 1.80 | US$ 4.99 (same on every plan) |
| Price per 1,000 live stream, clip or category rows, Free plan | **US$ 2.50** | US$ 2.30 | US$ 4.99 |
| Fee per run start | **None** | US$ 5 per 1,000 run starts | US$ 90 per 1,000 run starts |
| Modes in one Actor | **6** (channels, live streams, clips, VODs, categories, search) | 6 (channels, search, top streams, game streams, top games, clips) | 1 (search channels) |
| Filter by stream language | **Yes** | No | No |
| Filter by minimum viewers and by tag | **Yes** | No | No |
| Rows that could not be scraped | **Free, with an `errorCode`** | Not stated on its page | Not stated on its page |
| Users in the last 30 days | 1 (published 2026-09-16) | 35 | 19 |
| Store rating | No reviews yet | No reviews yet | 4.56 (3 reviews) |
| Public run success, last 30 days | No public runs yet; 18 of our 18 cloud test runs succeeded | 100.0% (4,942 runs) | 99.4% (321 runs) |

Competitor figures were read from the public Apify API (`api.apify.com/v2/store?search=twitch`) on **2026-09-16**, counting success as succeeded divided by succeeded plus failed plus timed out. They change every day and the Store page always shows the live number. Across the five searches we measured, prices in this niche run from US$ 0.57 to US$ 200 per 1,000 rows, and most of the cheap ones charge an extra fee on every run start.

### One real row

Minimal input, which is also the default input:

```json
{ "mode": "channels", "channelNames": ["ibai", "kaicenat"] }
```

A real row from a cloud run of 2026-09-16, trimmed. One full example per type is under "Output" below.

```json
{
  "type": "channel",
  "channelName": "ibai",
  "channelUrl": "https://www.twitch.tv/ibai",
  "channelId": "83232866",
  "displayName": "ibai",
  "followersCount": 20326381,
  "isPartner": true,
  "isLive": false,
  "lastBroadcastTitle": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
  "lastBroadcastAt": "2026-09-15T18:40:12.076035Z",
  "lastCategory": "League of Legends",
  "twitter": "https://twitter.com/IbaiLlanos",
  "instagram": "https://www.instagram.com/ibaillanos/",
  "tiktok": "https://www.tiktok.com/@ibaillanos",
  "scrapedAt": "2026-09-16T04:21:55.612Z"
}
```

### What you can scrape

| Mode | Input | One row per | Typical use |
|---|---|---|---|
| `channels` | channel logins or URLs | channel | creator vetting, follower tracking, live checks |
| `liveStreams` | optional categories, languages, minimum viewers, tags | live stream | top streams now, sponsor discovery |
| `clips` | channels or categories, plus a period | clip | viral moments, highlight research |
| `videos` | channel logins or URLs | past broadcast, highlight or upload | views and duration of recent streams |
| `categories` | nothing for the top of the directory, or category slugs | category | viewers and broadcasters leaderboard |
| `search` | keywords | channel | find streamers by name, with the full profile |

Every row carries a `type` field (`channel`, `livestream`, `clip`, `video`, `category`) and a `scrapedAt` timestamp, so you can mix modes in one pipeline and split them later.

### Input examples

Channel profiles, which is also the default input:

```json
{
  "mode": "channels",
  "channelNames": ["ibai", "https://www.twitch.tv/kaicenat", "@jynxzi"]
}
```

The 100 most watched live streams in Portuguese, Spanish and German:

```json
{
  "mode": "liveStreams",
  "languages": ["pt", "es", "de"],
  "maxResults": 100
}
```

Live streams in one category with at least 10 viewers, and the 50 most viewed clips of a channel in the last 30 days:

```json
{
  "mode": "liveStreams",
  "categories": ["grand-theft-auto-v"],
  "minViewers": 10,
  "maxResults": 40
}
```

```json
{
  "mode": "clips",
  "channelNames": ["ibai"],
  "clipPeriod": "month",
  "clipSort": "views",
  "maxResults": 50
}
```

The top 60 categories by live viewers, and a channel search with followers and live status:

```json
{ "mode": "categories", "maxResults": 60 }
{ "mode": "search", "searchQueries": ["valorant", "gta rp"], "maxResults": 20 }
```

#### Coming from another Twitch scraper?

The input names used by the other Twitch Actors in the Store also work, so you can switch without touching your integration:

- `mode`: `channel`, `channel_info`, `channel_details`, `topStreams`, `top_streams`, `live_streams`, `gameStreams`, `game_streams`, `searchChannels`, `search_channels`, `channel_videos`, `topGames`, `top_games`, `topClips`, `subcategories`
- also read from `scrapeType` and `action`, so `{"scrapeType": "top_games"}` works
- channels: `channelNames`, `channelUsernames`, `channels`, `logins`, `targets`, `streamers`, `channelUrls`, `startUrls`, `twitchUrls`
- keywords: `searchQueries`, `searchTerms`, `keywords`, `query`; categories: `categories`, `categorySlug`, `gameName`, `gameSlug`, `game`
- limits: `maxResults`, `maxItems`, `limit`; filters: `minViewers`, `languages`, `clipPeriod`, `period`, `videoType`

Output names follow the convention the market already uses (`channelName`, `displayName`, `followersCount`, `isLive`, `currentViewers`, `currentCategory`, `viewers`, `thumbnailUrl`), so most field mappings keep working.

### Output

Real rows from cloud runs on the Apify platform on 16 September 2026.

#### Channel

```json
{
  "type": "channel",
  "channelName": "ibai",
  "channelUrl": "https://www.twitch.tv/ibai",
  "channelId": "83232866",
  "displayName": "ibai",
  "bio": "Si lees esto que sepas que te aprecio",
  "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/574228be-01ef-4eab-bc0e-a4f6b68bedba-profile_image-300x300.png",
  "followersCount": 20326381,
  "isPartner": true,
  "accountCreatedAt": "2015-02-20T16:47:56.548434Z",
  "isLive": false,
  "currentViewers": null,
  "currentStreamTitle": null,
  "currentCategory": null,
  "lastBroadcastTitle": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
  "lastBroadcastAt": "2026-09-15T18:40:12.076035Z",
  "lastCategory": "League of Legends",
  "broadcastLanguage": "ES",
  "socialLinks": {
    "youtube": "https://www.youtube.com/channel/UCaY_-ksFSQtTGk0y1HA_3YQ",
    "twitter": "https://twitter.com/IbaiLlanos",
    "instagram": "https://www.instagram.com/ibaillanos/",
    "tiktok": "https://www.tiktok.com/@ibaillanos"
  },
  "scrapedAt": "2026-09-16T04:21:55.612Z"
}
```

When the channel is live, `isLive` is `true` and `currentViewers`, `currentStreamId`, `currentStreamTitle`, `currentCategory`, `currentCategorySlug`, `currentStreamLanguage`, `currentStreamTags`, `startedAt` and `thumbnailUrl` are filled.

#### Live stream

```json
{
  "type": "livestream",
  "rank": 1,
  "channelName": "caseoh_",
  "channelUrl": "https://www.twitch.tv/caseoh_",
  "channelId": "267160288",
  "displayName": "caseoh_",
  "followersCount": 9033842,
  "isPartner": true,
  "livestreamId": "321448783450",
  "title": "LOSING MY MIND",
  "viewers": 52263,
  "category": "ROBLOX",
  "categorySlug": "roblox",
  "categoryId": "23020",
  "language": "EN",
  "tags": ["English"],
  "streamType": "live",
  "startedAt": "2026-09-16T02:05:02Z",
  "thumbnailUrl": "https://static-cdn.jtvnw.net/previews-ttv/live_user_caseoh_-640x360.jpg",
  "isLive": true,
  "scrapedAt": "2026-09-16T04:05:56.648Z"
}
```

#### Clip

```json
{
  "type": "clip",
  "clipId": "3058333305",
  "channelName": "ibai",
  "displayName": "ibai",
  "title": "kamet0 es un mierda ???",
  "url": "https://www.twitch.tv/ibai/clip/LachrymosePiliableKoupreyStrawBeary-lxxZ4KupfZMmtTNN",
  "views": 8787,
  "duration": 22,
  "durationFormatted": "0:22",
  "language": "ES",
  "category": "League of Legends",
  "categorySlug": "league-of-legends",
  "videoId": "2859730034",
  "videoOffsetSeconds": 14050,
  "createdAt": "2026-08-29T18:36:36Z",
  "scrapedAt": "2026-09-16T04:02:06.615Z"
}
```

`videoId` and `videoOffsetSeconds` point at the exact second of the source VOD, which is what you need to rebuild the moment on a timeline.

#### VOD (past broadcast)

```json
{
  "type": "video",
  "videoId": "2874817330",
  "channelName": "ibai",
  "channelUrl": "https://www.twitch.tv/ibai",
  "title": "ACTUALIZACION DE MI VIDA | LEAGUE OF LEGENDS CON MIS HERMANOS",
  "url": "https://www.twitch.tv/videos/2874817330",
  "views": 290809,
  "duration": 17585,
  "durationFormatted": "4:53:05",
  "language": "es",
  "category": "Just Chatting",
  "categorySlug": "just-chatting",
  "videoType": "ARCHIVE",
  "createdAt": "2026-09-15T13:47:02Z",
  "publishedAt": "2026-09-15T13:47:02Z",
  "thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/.../thumb0-640x360.jpg",
  "scrapedAt": "2026-09-16T04:03:13.976Z"
}
```

#### Category

```json
{
  "type": "category",
  "rank": 1,
  "categoryId": "509658",
  "name": "Just Chatting",
  "slug": "just-chatting",
  "url": "https://www.twitch.tv/directory/category/just-chatting",
  "viewers": 209853,
  "broadcastersCount": 4405,
  "followersCount": 53198449,
  "tags": ["IRL"],
  "boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-285x380.jpg",
  "scrapedAt": "2026-09-16T04:03:48.063Z"
}
```

#### Rows that are not charged

A channel that does not exist, an invalid login, a category with no live streams or a blocked request becomes a row with `errorCode` and `error`, and **is not charged**:

```json
{
  "type": "channel",
  "input": "zzznaoexiste987654",
  "channelName": "zzznaoexiste987654",
  "error": "channel not found on Twitch",
  "errorCode": "CHANNEL_NOT_FOUND"
}
```

Error codes: `CHANNEL_NOT_FOUND`, `INVALID_CHANNEL`, `CATEGORY_NOT_FOUND`, `INVALID_CATEGORY`, `CATEGORY_NOT_SUPPORTED`, `NO_RESULTS`, `BLOCKED`. The run only fails when nothing at all could be delivered because Twitch blocked every retry, so one bad login in a list of 500 never ruins the run.

### Field reference

| Field | Types | Description |
|---|---|---|
| `type` | all | `channel`, `livestream`, `clip`, `video` or `category` |
| `channelName` | channel, livestream, clip, video | channel login, as in twitch.tv/<login> |
| `displayName` | channel, livestream, clip | display name with capitalization and non latin characters |
| `channelUrl`, `channelId` | channel, livestream, clip, video | link and numeric id |
| `followersCount` | channel, livestream, clip, category | followers of the channel, or of the category |
| `isPartner`, `isAffiliate`, `verified` | channel, livestream | Twitch partner and affiliate flags |
| `bio`, `avatarUrl`, `bannerUrl`, `primaryColor`, `accountCreatedAt` | channel | public profile |
| `socialLinks`, `twitter`, `instagram`, `youtube`, `tiktok`, `discord` | channel | links the streamer published on the channel page |
| `isLive`, `currentViewers`, `currentStreamTitle`, `currentCategory`, `currentStreamLanguage`, `currentStreamTags`, `startedAt` | channel | the live stream running at scrape time, if any |
| `lastBroadcastTitle`, `lastBroadcastAt`, `lastCategory`, `broadcastLanguage` | channel | the previous broadcast, useful when the channel is offline |
| `rank`, `viewers`, `title`, `language`, `tags`, `streamType`, `livestreamId` | livestream | one live stream, ranked by viewers |
| `clipId`, `clipSlug`, `views`, `duration`, `durationFormatted`, `videoOffsetSeconds` | clip | clip stats and its position in the source VOD |
| `videoId`, `views`, `duration`, `durationFormatted`, `videoType`, `publishedAt` | video | VOD, highlight or upload |
| `category`, `categorySlug`, `categoryId` | livestream, clip, video | category of the content |
| `name`, `slug`, `viewers`, `broadcastersCount`, `tags`, `boxArtUrl` | category | one category of the directory |
| `url`, `thumbnailUrl` | livestream, clip, video, category | page link and image |
| `input` | all | the input line that produced the row |
| `error`, `errorCode` | error rows | why nothing was delivered, never charged |
| `scrapedAt` | all | UTC time of the scrape |

### Pricing

**US$ 2.50 per 1,000 rows on the Free plan**, no monthly rental and no fee per run start. One charge is one row, whatever the mode.

| Apify plan | Price per row | Per 1,000 rows |
|---|---|---|
| Free | US$ 0.0025 | US$ 2.50 |
| Bronze | US$ 0.0023 | US$ 2.30 |
| Silver | US$ 0.0021 | US$ 2.10 |
| Gold and above | US$ 0.0020 | US$ 2.00 |

Examples at the Free plan price: 100 creator profiles cost US$ 0.25. The top 500 live streams every hour for a day is 12,000 rows, US$ 30. A weekly clip report for 20 channels at 50 clips each is 1,000 rows, US$ 2.50. Error rows are free, and you can cap spending with the maximum cost per run in the Apify Console.

### Speed and cost, measured

Our own cloud runs on the Apify platform, 2026-09-16, 512 MB of memory. "Platform cost" is what the run consumed in Apify usage. The percentage is that cost against what the Actor charges for the same rows.

| Run | Rows | Time | Platform cost | % of the charge |
|---|---|---|---|---|
| Top live streams, no filter | 500 | 33 s | US$ 0.0035 | 0.28% |
| Top live streams, three languages | 60 | 24 s | US$ 0.0010 | 0.69% |
| Live streams in one category, minimum 10 viewers | 36 | 8 s | US$ 0.0002 | 0.20% |
| Most viewed clips of one channel, last 30 days | 50 | 7 s | US$ 0.0005 | 0.41% |
| VODs of two channels | 59 | 9 s | US$ 0.0006 | 0.43% |
| Category directory | 58 | 7 s | US$ 0.0005 | 0.37% |
| Search, two keywords | 40 | 7 s | US$ 0.0005 | 0.47% |
| Two channel profiles | 2 | 5 s | US$ 0.0003 | 5.8% |

Eighteen cloud test runs, eighteen successes, 962 rows charged, US$ 0.0099 of platform cost in total, which is **US$ 0.0103 per 1,000 rows or 0.41% of the price**. Small runs carry the fixed cost of starting the container, which is why two channel profiles look expensive as a percentage and five hundred live streams do not. The Actor makes plain HTTP calls to the same public GraphQL endpoint the Twitch site uses, with no browser and no login, and reads up to thirty channel profiles per request.

### How to use it

#### Apify Console

1. Pick a mode and fill in channels, categories, languages or keywords.
2. Click **Start**. Results appear in the **Output** tab, with one table view per type.
3. Export as JSON, CSV, Excel or HTML, or copy the API link.

#### API

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapewise~twitch-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "liveStreams", "languages": ["en"], "maxResults": 100}'
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("scrapewise/twitch-scraper").call(run_input={
    "mode": "channels",
    "channelNames": ["ibai", "kaicenat"],
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["channelName"], row.get("followersCount"), row.get("isLive"))
```

#### Schedules and integrations

- **Schedule** `liveStreams` every 15 or 60 minutes to build a viewer history per channel and per category.
- Send results to **Google Sheets, Slack, Airtable, BigQuery, S3** or a webhook, or call it from **n8n, Make or Zapier** with the Apify app.

#### AI agents and MCP

The Actor works as a tool in the Apify MCP server, so Claude, ChatGPT, Cursor and other MCP clients can call it:

```
https://mcp.apify.com/?actors=scrapewise/twitch-scraper
```

Ask things like "Who are the twenty most watched Portuguese streamers live on Twitch right now?" or "Compare followers, partner status and last category for these thirty Twitch creators". The flat output with a `type` on every row keeps it easy for an agent to read without parsing anything.

### Limits and honest notes

- **Page size.** Twitch's public endpoint refuses deep pagination without a browser generated integrity token, so each query returns one page: up to 30 rows for the global live directory, and up to 100 rows for streams inside a category, clips, VODs, categories and search. To go past that in `liveStreams` the Actor walks the most watched categories and merges the result, which is how a request for 500 live streams is served. For clips and VODs the ceiling is 100 per channel or category per run.
- **Live streams** are a snapshot of the moment the run happens, so schedule the Actor to build history. Category and language filters are applied by Twitch, and `minViewers` and `tags` on top of the result.
- **Language filter.** Twitch filters by the language set on the channel, so a handful of rows can report a different `language` value than the one you asked for.
- **Clip order.** Twitch sorts clips by views inside a period or by trending, and offers no sort by creation date, so `clipSort: "trending"` is the closest thing to newest.
- **VODs** expire on Twitch after 7 to 60 days depending on the channel's plan.
- **Social links** are the one field Twitch serves only to residential IPs. A batch that comes back without them is retried once on a residential IP, and `includeSocials: false` turns that off.
- **Gambling, casino and betting categories are not collected** in any mode. Slots, Virtual Casino and Poker are three of the largest categories on Twitch and none of them is returned.
- **Chat messages are not collected**, and the viewer who created a clip is not included. The Actor only returns public data about channels and their content.
- Requests go through the Apify datacenter proxy and blocked requests are retried on new IPs automatically.

If something breaks or you need a field, open an issue on the Issues tab. Issues are answered the same day.

### FAQ

**Do I need a Twitch account, a developer app or an API key?**
No. The Actor reads the same public GraphQL endpoint the Twitch website uses, with no login, no OAuth token and no cookies.

**How fast is it?**
In cloud runs, 500 live streams took 33 seconds and 30 channel profiles come back in one request in about 3 seconds.

**How do I get the most watched streams in one category?**
Use `liveStreams` with `categories: ["just-chatting"]`, taking the slug from the twitch.tv/directory/category URL. Add `languages` to narrow it down by audience and `minViewers` to drop the long tail.

**Can I monitor whether a streamer is live?**
Yes. Run `channels` on a schedule. `isLive`, `currentViewers`, `currentStreamTitle` and `currentCategory` show the live state at that moment, and `lastBroadcastAt` tells you when the channel was last on air.

**Why did I get fewer rows than maxResults?**
The channel has fewer clips or VODs than you asked for, fewer streams match the filters right now, or one of Twitch's own ceilings applies (30 rows for the global live directory, 100 for everything else per query). You are only charged for rows actually delivered.

**Are invalid or missing channels charged?**
No. They come back as a row with `errorCode` and are free, so a list with typos costs nothing extra.

**Can I export to CSV or Excel?**
Yes, from the Output tab or the dataset API with `format=csv` or `format=xlsx`.

**Does it collect chat, viewers or personal data?**
No. Chat messages and any data about regular viewers are out of scope. Only public channel, stream, clip, VOD and category data is returned.

**Can I use the input of another Twitch Actor?**
Yes. `mode` values such as `channel`, `top_streams`, `gameStreams`, `channel_videos` and `topGames` are accepted, as are `scrapeType` and `action`, and field names like `channelUsernames`, `logins`, `targets`, `streamers`, `keywords`, `gameName` and `maxItems`.

**Is scraping Twitch legal?**
The Actor collects only public data that anyone can see on twitch.tv without an account. You are responsible for how you use it, under Twitch's terms and your local data protection law.

**Why are gambling and casino categories missing?**
They are blocked on purpose, in every mode, by slug, by category name and by the gambling content tag Twitch itself applies. A category asked for explicitly returns a free `CATEGORY_NOT_SUPPORTED` row. Games that only look like gambling by name, such as Buckshot Roulette, PokeRogue and Dicey Dungeons, are collected normally.

**How do I build a viewer history instead of a snapshot?**
Save the `liveStreams` or `categories` input as a task and attach an Apify schedule. Each run appends a dated snapshot, and `viewers` plus `scrapedAt` is all a chart needs.

**Can I match a Twitch creator with their other social profiles?**
Yes, through `socialLinks` and the flat `twitter`, `instagram`, `youtube`, `tiktok` and `discord` fields, which carry whatever the streamer published on the channel page. That is usually enough to find the same person on another platform.

**Can an AI agent call it?**
Yes, through the Apify MCP server. The input is short, every field has a description, and every row carries a `type`, so an agent can mix modes in one conversation.

### Changelog

- **2026-09-16** (0.1.2): social links retried on a residential IP when Twitch withholds them from datacenter IPs, plus the `includeSocials` switch.
- **2026-09-16** (0.1): first version. Modes `channels`, `liveStreams`, `clips`, `videos`, `categories` and `search`; batch of 30 channel profiles per request; input names of other Twitch scrapers accepted; gambling and casino categories blocked in every mode; error rows free; live streams ranked by viewers across the directory.

This Actor only collects public data and respects the site's terms.

### Em português

**Twitch Scraper** extrai perfis de canais (seguidores, parceiro, bio, redes sociais, viewers ao vivo), as lives com mais audiência por categoria e idioma, clipes por canal ou categoria, VODs e o diretório de categorias com viewers, tudo sem login e sem chave de API. Serve para agências de marketing de influência, patrocinadores e produtos de analytics de streaming.

- Agências: conferir seguidores, status de parceiro e redes de uma lista de criadores, 30 canais por requisição.
- Patrocinadores: ver as lives mais assistidas da categoria e do idioma agora, com viewers, tags e miniatura.
- Analytics: acompanhar viewers por categoria, views de VODs e desempenho de clipes com agendamento.

Preço: **US$ 2,50 por 1.000 linhas no plano Free (US$ 2,00 no Gold), sem mensalidade e sem taxa por execução.** Canal inexistente, filtro sem resultado e requisição bloqueada voltam como linha gratuita com `errorCode`. Categorias de aposta, cassino e jogo de azar não são coletadas em nenhum modo. Mensagens de chat ficam fora do escopo.

Keywords: twitch scraper, twitch api, twitch channel scraper, twitch streamers, twitch live streams, twitch viewers, twitch clips, twitch vods, twitch categories, twitch directory, twitch followers, streamer analytics, influencer marketing, esports data, twitch search, live streaming data.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. Mode names used by other Twitch scrapers also work when called by API: channel, channel\_info, topStreams, top\_streams, live\_streams, gameStreams, game\_streams, searchChannels, search\_channels, channel\_videos, topGames, top\_games, topClips.

## `channelNames` (type: `array`):

For 'channels', 'videos' and 'clips'. Channel login (ibai), @ibai, twitch.tv/ibai or a full URL. Also accepted by API as channelUsernames, channels, logins, targets, streamers, channelUrls or startUrls. If empty, these modes use ibai and kaicenat.

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

For 'search': each keyword returns up to 100 matching channels with the full profile (followers, socials, live status). Also accepted by API as searchQuery, searchTerms, keywords or query.

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

Category slug as in the Twitch URL (just-chatting, grand-theft-auto-v, league-of-legends) or a twitch.tv/directory/category/... URL. Filters 'liveStreams' and 'clips'; in 'categories' mode returns these categories with viewers. Leave empty for the whole directory.

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

For 'liveStreams': two-letter language codes (en, es, pt, de, fr, ja, ko, ru, tr). Empty means all languages. Each language is a separate query, so three languages give up to three times the streams.

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

For 'liveStreams': drop streams with fewer current viewers. Streams below the threshold are not delivered and not charged.

## `tags` (type: `array`):

For 'liveStreams': keep only streams that carry at least one of these Twitch tags (Speedrun, DropsEnabled, English). Case-insensitive.

## `sortBy` (type: `string`):

For 'liveStreams'. 'recent' asks Twitch for the newest streams, which are usually small channels with few viewers.

## `clipSort` (type: `string`):

For 'clips'. Twitch's public API does not sort clips by creation date, so 'newest' falls back to trending.

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

For 'clips': the time window Twitch applies to the clip list.

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

For 'videos': which kind of video the channel published. Past broadcasts expire after 7 to 60 days depending on the channel's Twitch plan.

## `includeSocials` (type: `boolean`):

For 'channels' and 'search': fetch the channel's social links (YouTube, X, Instagram, TikTok, Discord). Twitch only serves this one field to residential IPs, so each batch of 30 channels that comes back without it is retried once on a residential IP. Turn it off to stay on datacenter proxy only.

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

For 'videos' and 'clips': per channel or category, capped at 100 by Twitch. For 'liveStreams', 'categories' and 'search': total per run (search is capped at 100 per keyword). Ignored by 'channels', which returns one row per channel.

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

Apify datacenter proxy is the default and works for Twitch. Blocked requests are retried on a new IP; residential is only used as a fallback after three blocked attempts.

## Actor input object example

```json
{
  "mode": "channels",
  "channelNames": [
    "ibai",
    "kaicenat"
  ],
  "minViewers": 0,
  "sortBy": "viewers",
  "clipSort": "views",
  "clipPeriod": "week",
  "videoType": "archive",
  "includeSocials": true,
  "maxResults": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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 = {
    "mode": "channels",
    "channelNames": [
        "ibai",
        "kaicenat"
    ],
    "maxResults": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "mode": "channels",
    "channelNames": [
        "ibai",
        "kaicenat",
    ],
    "maxResults": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "mode": "channels",
  "channelNames": [
    "ibai",
    "kaicenat"
  ],
  "maxResults": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/twitch-scraper --silent --output-dataset

```

## MCP server setup

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