# Kick.com Streamers & Livestreams Scraper (`ninhothedev/kick-streamers-scraper`) Actor

$1/1K 🔥 Kick.com scraper! Streamer profiles, live viewers, followers, categories & socials. No key. JSON, CSV, Excel or API in seconds. Power influencer marketing & discovery ⚡

- **URL**: https://apify.com/ninhothedev/kick-streamers-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 2 total users, 1 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Kick.com Streamers & Livestreams Scraper

Scrape **Kick.com** streamer profiles and live streams — **no API key, no login, no cookies**. Give the Actor a list of channel slugs, browse the currently live streams, drill into a single category, or search Kick by keyword. Every run returns one clean, flat item per channel with followers, live status, viewer count, stream title, category, thumbnails and the streamer's social handles.

> **Proxy required.** Kick's public web API is fronted by Cloudflare bot protection that blocks datacenter IP ranges — including the ones Apify runs on. The Actor sends a real Chrome TLS fingerprint (`curl_cffi` impersonation, rotated over several Chrome builds), but that alone is not enough: **set the `proxyConfiguration` input to Apify Proxy with the `RESIDENTIAL` group** (it is preselected) or supply your own residential proxy. See [Proxy](#proxy--please-read) below.

***

### What you get

| Field | Description |
| --- | --- |
| `slug`, `channel_id`, `user_id`, `username`, `url` | Channel identity |
| `bio`, `profile_pic`, `country`, `city` | Profile data (bio capped at 1000 chars) |
| `followers_count` | Follower count as an integer |
| `is_verified`, `is_banned`, `vod_enabled`, `subscription_enabled` | Channel flags |
| `is_live`, `stream_title`, `viewer_count`, `stream_started_at`, `stream_duration`, `stream_language`, `is_mature` | Live state (all `null` when the streamer is offline) |
| `category`, `category_slug`, `parent_category` | What they're streaming right now |
| `thumbnail_url`, `banner_url`, `playback_url` | Media URLs (HLS playback URL included) |
| `instagram`, `twitter`, `youtube`, `tiktok`, `discord`, `facebook` | Creator social handles |
| `source`, `scraped_at` | Provenance |

**Offline streamers keep `null` live fields — never `0` or `""`.** That means `viewer_count = null` for an offline channel is unmistakably "not streaming", not "zero viewers".

***

### Modes

| Mode | What it does | Key input |
| --- | --- | --- |
| `channels` | Scrapes the exact slugs you give it (`xqc`, `@adinross`, `https://kick.com/classybeef`) | `slugs` |
| `livestreams` | Browses Kick's live feed sorted by viewers, highest first | `maxItems` |
| `category` | Same live browse, restricted to one category | `categorySlug` |
| `search` | Kick's channel search for a keyword (~20 results) | `searchQuery` |

Set `liveOnly = true` to drop offline channels from the dataset.

***

### Proxy — please read

Kick.com is behind Cloudflare, and the decisive factor is **IP reputation, not the HTTP client**:

| Where the request comes from | Result (measured 2026-07-28) |
| --- | --- |
| Residential IP, plain `urllib` + browser User-Agent | `200 OK`, clean JSON |
| Residential IP, `curl_cffi` Chrome impersonation | `200 OK`, clean JSON |
| Apify datacenter IP, `curl_cffi` Chrome impersonation | **`403 Forbidden`** |

So no TLS fingerprint, header set or retry strategy rescues a datacenter IP. What works is a residential exit node:

```json
{
  "mode": "livestreams",
  "maxItems": 200,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

The Actor still ships a Chrome fingerprint rotation (`chrome124` → `chrome131` → `chrome136`, one per retry) because Cloudflare's accepted fingerprint set drifts over time — but treat the residential proxy as mandatory on the Apify platform. If everything is blocked anyway, the run **fails loudly** with the exact HTTP status and this instruction instead of producing an empty dataset.

#### Example input

```json
{
  "mode": "livestreams",
  "maxItems": 200,
  "liveOnly": true
}
```

```json
{
  "mode": "channels",
  "slugs": ["xqc", "adinross", "classybeef"],
  "maxItems": 100
}
```

```json
{
  "mode": "category",
  "categorySlug": "just-chatting",
  "maxItems": 150
}
```

#### Example output

```json
{
  "slug": "classybeef",
  "channel_id": 247022,
  "username": "Classybeef",
  "followers_count": 222834,
  "is_verified": true,
  "is_live": true,
  "stream_title": "TIPPING VIEWERS LIVE",
  "viewer_count": 1441,
  "stream_started_at": "2026-07-28T17:49:18Z",
  "stream_language": "English",
  "category": "Slots & Casino",
  "category_slug": "slots",
  "parent_category": "Gambling",
  "instagram": "classybeefofficial",
  "tiktok": "classybeef",
  "url": "https://kick.com/classybeef",
  "source": "kick",
  "scraped_at": "2026-07-28T18:02:11Z"
}
```

***

### Use cases

- **Influencer marketing** — build a Kick creator database with follower counts, categories and live-audience size, then rank creators by real reach instead of vanity numbers.
- **Streamer discovery** — find rising channels in a category (`slots`, `just-chatting`, `grand-theft-auto-v`) before they get expensive.
- **Sponsorship research** — check which games and categories a channel actually streams, how mature its audience is, and how consistently it goes live.
- **Live-audience analytics** — snapshot the live feed on a schedule and chart viewer counts per category, language and streamer over time.

**Creator lead generation:** Kick profiles expose Instagram, X/Twitter, YouTube, TikTok, Discord and Facebook handles. One run gives you a contactable list of creators plus their audience size — a ready-made outreach pipeline for agencies, sponsors and tool vendors.

***

### Pricing

Pay per usage. A typical run costs around **$1 per 1,000 channels** scraped in compute units. Budget **residential proxy traffic on top** — the JSON responses are small (roughly 5–20 KB per channel), so 1,000 channels is only a few MB of proxy traffic, but it is not free.

***

### How it works / notes

- Endpoints used (all public, all verified): `/api/v2/channels/{slug}`, `/stream/livestreams/{lang}?sort=desc`, the same feed with `&subcategory={slug}`, and `/api/search?searched_word=`.
- Requests are spaced out (~0.5 s) and retried on `403` / `429` / `5xx`, each retry using the next Chrome impersonation target.
- The configured proxy is applied to every request; unsupported impersonation targets are filtered out at runtime, so an older `curl_cffi` build degrades gracefully instead of crashing.
- Discovery modes collect channel slugs from the feed, then enrich each one through the channel endpoint — so `livestreams`, `category` and `search` return exactly the same rich schema as `channels`.
- Search queries shorter than 3 characters are rejected up front — Kick answers those with HTTP 400.
- The run fails loudly if Cloudflare blocks every request; the error names the HTTP status, the cause (Cloudflare bot protection on datacenter IPs) and the fix (residential proxy), so you never get a silently empty dataset.

### Legal

This Actor only collects data that Kick.com serves publicly to any visitor, without logging in. Use it responsibly, respect Kick's Terms of Service, and keep personal data handling compliant with GDPR/CCPA in your jurisdiction.

### Related Actors

- [TikTok Profile Scraper](https://apify.com/ninhothedev/tiktok-profile-scraper)
- [Instagram Profile Scraper](https://apify.com/ninhothedev/instagram-profile-scraper)
- [YouTube Channel Scraper](https://apify.com/ninhothedev/youtube-channel-scraper)
- [Twitch Alternatives](https://apify.com/ninhothedev/twitch-alternatives)

# Actor input Schema

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

What to scrape. 'channels' = look up the exact Kick slugs you provide. 'livestreams' = browse the currently live streams on Kick, sorted by viewers (highest first). 'category' = the same live browse, but limited to one category such as 'just-chatting' or 'slots'. 'search' = Kick's channel search for a keyword. Every mode returns one fully enriched item per channel.

## `slugs` (type: `array`):

Kick channel slugs to scrape in 'channels' mode. Accepts a bare slug ('xqc'), an @handle or a full profile URL ('https://kick.com/adinross'). Ignored in the other modes.

## `categorySlug` (type: `string`):

Kick category (subcategory) slug used in 'category' mode, e.g. 'just-chatting', 'slots', 'grand-theft-auto-v' or 'marvel-rivals'. Take it from the URL of any Kick category page. Ignored in the other modes.

## `searchQuery` (type: `string`):

Keyword for Kick's channel search, used in 'search' mode — for example a streamer name, a game or a niche like 'gaming'. Kick returns up to about 20 matching channels per query. Ignored in the other modes.

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

Language segment used when browsing the Kick live feed in 'livestreams' and 'category' mode (Kick's feed path, e.g. 'en', 'de', 'es'). Kick largely serves the same global feed for every value, so leave it at 'en' unless you want to experiment. Ignored in 'channels' and 'search' mode.

## `liveOnly` (type: `boolean`):

If enabled, offline streamers are dropped from the dataset and only channels that are live at scrape time are stored. Useful in 'channels' and 'search' mode; the browse modes already return live streams only.

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

Hard cap on how many channel items are pushed to the dataset (1-1000). Also limits how many pages of the live feed are crawled in 'livestreams' and 'category' mode.

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

Proxy used for every request to kick.com. Kick sits behind Cloudflare bot protection that blocks most datacenter IP ranges — which is what Apify runs on by default — so a RESIDENTIAL proxy group is strongly recommended and is preselected here. From a residential IP the Kick API answers normally; from a plain datacenter IP it returns HTTP 403. You can also plug in your own residential proxy URLs.

## Actor input object example

```json
{
  "mode": "channels",
  "slugs": [
    "xqc",
    "adinross"
  ],
  "categorySlug": "just-chatting",
  "searchQuery": "gaming",
  "language": "en",
  "liveOnly": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "slugs": [
        "xqc",
        "adinross"
    ],
    "categorySlug": "just-chatting",
    "searchQuery": "gaming",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/kick-streamers-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 = {
    "slugs": [
        "xqc",
        "adinross",
    ],
    "categorySlug": "just-chatting",
    "searchQuery": "gaming",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/kick-streamers-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 '{
  "slugs": [
    "xqc",
    "adinross"
  ],
  "categorySlug": "just-chatting",
  "searchQuery": "gaming",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ninhothedev/kick-streamers-scraper --silent --output-dataset

```

## MCP server setup

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