# Twitch & Kick Scraper – Live Streams, Channels, VODs, Clips (`openharvest/twitch-kick-streaming-scraper`) Actor

Twitch and Kick scraper in one normalized schema: channels with followers, live streams with viewer counts, VODs, clips and top categories. Public data only, no login or API keys. Track creators across both platforms.

- **URL**: https://apify.com/openharvest/twitch-kick-streaming-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 result records

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 & Kick Scraper – Live Streams, Channels, VODs, Clips

Twitch and Kick scraper in one normalized schema: channels with followers and live status, live streams with viewer counts, VODs, clips and top categories. Public data only, no login or API keys. Use it instead of two separate single-platform scrapers when you track creators who stream on both Twitch and Kick, or when you need Kick data at all: every record has the same fields on both platforms.

**Price: $1.50 per 1,000 records.** No start fee. Channels that don't exist produce a free error row.

### What data do you get?

Every dataset item has a `type` and a `platform` (`twitch` or `kick`), and every item has the same columns:

- **Channels**: display name, followers, live now (yes/no), current viewers, stream title, category, language, stream start time, Partner/Affiliate/verified badges, avatar, bio, the creator's public social links, last live time, VOD count (Twitch)
- **Live streams**: the most-watched streams right now, overall or in one category or language, with viewers, channel followers, title, category, language, tags, start time and preview image
- **VODs (past broadcasts)**: title, views, duration, category, publish date, thumbnail, URL
- **Clips**: the most-viewed clips of the last day, week, month or all time, with views, duration, category, clip author and URL
- **Categories**: the top games/categories by live viewers, with live channel counts and follower counts (Twitch)

### Use cases

- **Influencer marketing and sponsorships**: compare a creator's reach on Twitch and Kick (followers, live viewers, VOD and clip views) before a brand deal.
- **Esports and talent agencies**: track a roster across both platforms on a schedule and see who is live, in which game, and with how many viewers.
- **Game marketing**: see which streamers and languages carry your game right now, and how your category ranks against others.
- **Streaming market research**: measure Kick against Twitch by category, language or creator, with comparable numbers.
- **Content teams and clippers**: find the most-viewed clips and VODs of a channel for highlights.

### How to use it

1. Enter one or more **Channels**. A plain name like `xqc` is checked on both Twitch and Kick. A link (`https://www.twitch.tv/shroud`, `https://kick.com/westcol`) or a prefix (`twitch:shroud`, `kick:westcol`) checks only that platform.
2. Optionally turn on **Include VODs** and/or **Include top clips**.
3. Optionally set **Top live streams per platform** (with a category such as `Just Chatting` and/or a language such as `es`) and **Top categories per platform**.
4. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or connect them to Make, Zapier, n8n, Google Sheets or webhooks.

### Input

| Field | Type | Description |
|---|---|---|
| `channels` | array of strings | Channel names or links. Plain names are looked up on every selected platform. |
| `platforms` | array | `twitch` and/or `kick`. Default: both. |
| `includeVideos` | boolean | Add each channel's latest VODs. Default `false`. |
| `maxVideosPerChannel` | integer | 1–100, newest first. Default `10`. |
| `includeClips` | boolean | Add each channel's most-viewed clips. Default `false`. |
| `clipsPeriod` | string | `day`, `week`, `month` or `all`. Default `week`. |
| `maxClipsPerChannel` | integer | 1–100 on Twitch, up to 20 on Kick. Default `10`. |
| `maxLiveStreams` | integer | Top live streams per platform (0 = off). |
| `liveCategory` | string | Only live streams in this category, e.g. `Just Chatting`, `Fortnite`, `grand-theft-auto-v`. |
| `liveLanguage` | string | Only live streams in this language, e.g. `en`, `es`, `tr`, `pt`. |
| `maxCategories` | integer | Top categories per platform (0 = off). Twitch: up to 100. |
| `proxyConfiguration` | object | Optional. Used only if a platform blocks a request. |

An empty input (`{}`) returns the 10 most-watched live streams on each platform.

Example: a creator report for three creators, plus the top Spanish-language streams:

```json
{
    "channels": ["xqc", "https://www.twitch.tv/shroud", "kick:westcol"],
    "includeVideos": true,
    "maxVideosPerChannel": 5,
    "includeClips": true,
    "clipsPeriod": "month",
    "maxClipsPerChannel": 5,
    "maxLiveStreams": 40,
    "liveLanguage": "es"
}
```

### Output

Real sample output from a run (empty fields are left out here; in the dataset every field is present and set to `null` when unknown):

**Kick channel (live)**

```json
{
    "type": "channel",
    "platform": "kick",
    "id": "669746",
    "url": "https://kick.com/westcol",
    "title": "EL ELEGIDO STREAM CON IKER CASILLAS",
    "channelLogin": "westcol",
    "channelName": "Westcol",
    "followers": 4177861,
    "isLive": true,
    "viewers": 12918,
    "category": "Slots & Casino",
    "language": "es",
    "startedAt": "2026-10-08T18:15:16.000Z",
    "isVerified": true,
    "profileImageUrl": "https://files.kick.com/images/user/690420/profile_image/conversion/2b9d7205-...-fullsize.webp",
    "socialLinks": ["https://instagram.com/westcol", "https://x.com/WestCOL", "https://tiktok.com/@westcol"],
    "lastLiveAt": "2026-10-08T18:15:16.000Z"
}
```

**Twitch channel (live)**

```json
{
    "type": "channel",
    "platform": "twitch",
    "id": "37402112",
    "url": "https://www.twitch.tv/shroud",
    "title": "[FARM ODYLES HERE] ALSO I MIGHT MAKE A CLERIC MMO ...",
    "channelLogin": "shroud",
    "channelName": "shroud",
    "followers": 11295317,
    "isLive": true,
    "viewers": 6989,
    "category": "AION 2",
    "language": "en",
    "tags": ["English", "DropsEnabled"],
    "startedAt": "2026-10-08T17:08:36.000Z",
    "publishedAt": "2012-11-03T15:50:32.878Z",
    "isPartner": true,
    "videoCount": 1600
}
```

**Kick clip**

```json
{
    "type": "clip",
    "platform": "kick",
    "id": "clip_01M3TDDSN44DVA0WKMZYV6M9RV",
    "url": "https://kick.com/xqc/clips/clip_01M3TDDSN44DVA0WKMZYV6M9RV",
    "channelLogin": "xqc",
    "views": 24238,
    "category": "Just Chatting",
    "publishedAt": "2026-10-01T00:24:07.885Z",
    "durationSeconds": 101,
    "clipCreator": "plutotrades111"
}
```

**Twitch category**

```json
{
    "type": "category",
    "platform": "twitch",
    "id": "509658",
    "url": "https://www.twitch.tv/directory/category/just-chatting",
    "category": "Just Chatting",
    "viewers": 501998,
    "broadcasters": 5987,
    "categoryFollowers": 53247087,
    "tags": ["IRL"]
}
```

**Error (free)**

```json
{
    "type": "error",
    "platform": "kick",
    "channelLogin": "nope_zz9q_user",
    "errorCode": "NOT_FOUND",
    "error": "Kick channel \"nope_zz9q_user\" does not exist."
}
```

All fields: `type`, `platform`, `id`, `url`, `title`, `channelLogin`, `channelName`, `channelId`, `channelUrl`, `description`, `followers`, `isLive`, `viewers`, `views`, `category`, `categoryId`, `language`, `tags`, `startedAt`, `publishedAt`, `durationSeconds`, `isMature`, `isPartner`, `isAffiliate`, `isVerified`, `thumbnailUrl`, `profileImageUrl`, `socialLinks`, `lastLiveAt`, `videoCount`, `clipCreator`, `broadcasters`, `categoryFollowers`, `scrapedAt`. Error rows add `errorCode`, `error` and `input`.

The dataset has ready-made views in Apify Console: **Overview**, **Channels**, **Live streams**, **VODs & clips** and **Categories & errors**.

### Pricing

Pay per event: you pay only for the records you get. Platform usage is included.

| Event | Price | When it is charged |
|---|---|---|
| `result` | **$0.0015** per record ($1.50 / 1,000) | Each channel, live stream, VOD, clip or category saved |
| Errors | **Free** | Missing channels, unknown categories, failed requests |

| Job | Records | Cost |
|---|---|---|
| 1 creator on both platforms, profile only | 2 | **$0.003** |
| 10 creators on both platforms + 10 VODs + 10 clips each | 420 | **$0.63** |
| Top 100 live streams on Twitch and Kick, hourly for a day | 4,800 | **$7.20** |

Tip: set **Max cost per run** in the run options. The scraper stops cleanly when your budget is reached.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents through the Apify MCP server. Add it with `https://mcp.apify.com?tools=openharvest/twitch-kick-streaming-scraper`, or let the agent find it with `search-actors` ("twitch kick scraper").

Example `call-actor` input an agent can use to answer "Is this creator bigger on Twitch or on Kick, and is he live right now?":

```json
{
    "channels": ["xqc"],
    "includeClips": true,
    "clipsPeriod": "week",
    "maxClipsPerChannel": 5
}
```

The agent compares `followers`, `isLive`, `viewers` and the clip `views` per `platform`. This run takes a few seconds and costs about $0.02.

### FAQ

**Do I need a Twitch or Kick account, or API keys?**
No. The scraper reads the same public data the twitch.tv and kick.com websites show to logged-out visitors.

**What happens when a creator uses different names on Twitch and Kick?**
Use a link or a prefix for each platform, e.g. `twitch:name1` and `kick:name2`. Plain names are looked up on both platforms, and a name that exists on only one gives one free `NOT_FOUND` row for the other.

**How are "top live streams" picked?**
They are sorted by current viewers. On Kick the scraper reads Kick's live directory. Twitch shows at most 30 streams in its global list, so for larger lists or a language filter the scraper combines the top streams of the most-watched categories and sorts them by viewers. Inside one category, Twitch returns up to 100 streams per language, and larger requests are split by language.

**Why are there at most 20 Kick clips per channel?**
Kick's public clips list has one page of 20 clips per sort order and period. Twitch returns up to 100.

**Why is the language or last-live time empty for some offline Kick channels?**
Kick shows the stream language and start time only while a channel is live. The category falls back to the channel's most recent category.

**Can I run it on a schedule?**
Yes. Use Apify Schedules, for example every 15 minutes for a live-viewers time series of your roster, or daily for follower growth.

**Can I use it via API?**
Yes: through the Apify API, the JavaScript and Python clients, or integrations such as Make, Zapier, n8n, Google Sheets and webhooks.

### Is it legal to scrape Twitch and Kick?

This Actor collects only **publicly available data** that Twitch and Kick show to any logged-out visitor: channel profiles, public stream information, public VODs, clips and category statistics. It does not log in, does not read chat, private messages or subscriber-only content, and does not collect emails or phone numbers. Social links are included only when the creator has published them on the channel. It does not download video files. Scraped data can still include personal data such as names and bios, so make sure your use complies with the laws that apply to you (for example GDPR) and with each platform's terms. **Do not use the data for spam or unsolicited messages.** If you are unsure, consult a lawyer.

### Related actors

Other actors by the same developer that work well with this one:

- **YouTube Transcript Scraper – Captions, Subtitles & Video Data**: the same creators' YouTube videos and transcripts
- **Steam Reviews & Games Scraper – Prices, Players & Top Sellers**: player counts and reviews for the games people stream
- **Google Trends Scraper – Interest Over Time & Related Queries**: search interest for a game or creator
- **Bilibili Scraper – Videos, Search, Rankings, Comments & Danmaku**: Chinese video and live creator data
- **Douyin Scraper – Creator Profiles, Videos & Trending, No Login**: Chinese short-video creator data

### Support & feedback

Found a bug or need a missing field? Open an issue in the **Issues** tab with the channel name and platform.

# Actor input Schema

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

Channel names or links. A plain name like "xqc" is looked up on every selected platform. Links (https://www.twitch.tv/xqc, https://kick.com/xqc) or prefixes (twitch:xqc, kick:xqc) target one platform.

## `platforms` (type: `array`):

Which platforms to use for plain channel names, live streams and categories.

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

Also save each channel's latest videos/VODs with views, duration and category.

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

Newest first, up to 100. Platforms keep past broadcasts only for a limited time.

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

Also save each channel's most-viewed clips in the selected period.

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

Time window for the most-viewed clips.

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

Most-viewed first. Twitch: up to 100. Kick: up to 20 (Kick's public limit).

## `maxLiveStreams` (type: `integer`):

Save the currently live streams with the most viewers (0 = off). If you leave channels empty and everything else off, 10 live streams per platform are returned.

## `liveCategory` (type: `string`):

Only live streams in this category, e.g. "Just Chatting", "Fortnite", "grand-theft-auto-v". Leave empty for all categories.

## `liveLanguage` (type: `string`):

Only live streams in this language, as a 2-letter code, e.g. "en", "es", "tr", "pt". Leave empty for all languages.

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

Save the top categories/games by current live viewers, with broadcaster counts on Twitch (0 = off).

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

Optional. Not needed normally; the scraper switches to this proxy only if a platform blocks a request.

## Actor input object example

```json
{
  "channels": [
    "xqc",
    "https://www.twitch.tv/shroud",
    "kick:adinross"
  ],
  "platforms": [
    "twitch",
    "kick"
  ],
  "includeVideos": false,
  "maxVideosPerChannel": 20,
  "includeClips": false,
  "clipsPeriod": "week",
  "maxClipsPerChannel": 20,
  "maxLiveStreams": 50,
  "liveCategory": "Just Chatting",
  "liveLanguage": "en",
  "maxCategories": 20
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. RUN_SUMMARY with counts per record type.

# 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": [
        "xqc"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/twitch-kick-streaming-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": ["xqc"] }

# Run the Actor and wait for it to finish
run = client.actor("openharvest/twitch-kick-streaming-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": [
    "xqc"
  ]
}' |
apify call openharvest/twitch-kick-streaming-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,openharvest/twitch-kick-streaming-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/9MoTexTuo33js3Gp1/builds/CpSjuxaNDxOzhtaF9/openapi.json
