Social media · Video
Kick Chat Scraper & Real-Time Archive
Subscribe to Kick.com channels and archive every chat message in real time with sender, role, badges, colour and timestamps. Kick has no public API for past chat — once a stream ends the conversation is gone everywhere else.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Kick.com is the 4th-largest live-streaming platform (Q3 2025), but unlike Twitch and YouTube it has no public API for past chat. Once a stream ends, the conversation is gone from every Kick surface.
This Actor connects to Kick's public Pusher WebSocket — the same one the kick.com website uses to render chat — subscribes to one or more chatrooms by channel slug, and archives every App\Events\ChatMessageEvent it sees until either a duration window or a message-count cap is reached.
What we handle for you
- 🛡️ Browser fingerprint rotation — we rotate
curl-cffibrowser TLS fingerprints (Chrome / Firefox / Safari) on the REST channel-lookup hop so the target sees real-browser traffic, not Python scripts. Reconnects automatically on transient drops. - 🌐 Proxy-routed REST hop — Apify Proxy on the channel lookup; the Pusher WebSocket itself is direct, low-latency, and unproxied for sub-second message delivery.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx—Retry-Afterhonoured; up to 5 attempts per request. - 🧱 Deterministic stop — exits cleanly when either the time cap or the message-count cap fires; partial successes surface via
Actor.set_status_message, never silent exits. - 🧊 Clean, typed dataset rows — Pydantic-validated schema, ISO-8601 timestamps, stable UUIDs, canonical
sender_rolederived per message with raw badge list preserved. - ⚡ Real-time multiplex — direct Pusher WebSocket connection, sub-second latency, up to 20 channels on a single socket. No polling.
- 💰 Pay-Per-Event pricing — you pay only for messages that hit your dataset. No data, no charge.
Use cases
- Brand monitoring — capture every mention of your product across a list of Kick channels while a launch streams live.
- Toxicity / sentiment model training — record real chat at scale for supervised fine-tuning, with role + badge metadata as features.
- Stream highlight detection — surge in messages per minute is a strong proxy for an in-stream moment worth clipping.
- Moderator coverage audits — diff message counts against moderator actions, see which channels need more coverage.
- Streamer self-archive — keep a permanent record of your own community's chat for VOD highlights, AMAs, and giveaways.
- Esports / event coverage — archive multiple tournament channels in parallel.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
channelSlugs | array | yes | Kick channel slugs to archive (lowercase, no kick.com/ prefix). One per line. 1–20 channels per run. All multiplex over a single WebSocket. |
maxDurationSeconds | integer | no | How long to listen before exiting. The run also exits early if maxMessagesTotal is reached first. Range 5–3540 (59 min cap per run). |
maxMessagesTotal | integer | no | Hard cap on total messages archived across all channels. Whichever cap fires first (duration or this) ends the run. Range 1–50000. |
{
"channelSlugs": [
"xqc",
"trainwreckstv"
],
"maxDurationSeconds": 600,
"maxMessagesTotal": 5000,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
channel_slugmessage_idsender_usernamesender_rolebadgescolorcontentcreated_at
{
"channel_slug": "abuswe7l",
"chatroom_id": 31118945,
"message_id": "8049a026-5c2e-4619-b60d-393b7217f4da",
"sender_id": 5666938,
"sender_username": "Soud_x5",
"sender_slug": "soud-x5",
"sender_color": "#FF9D00",
"sender_role": "moderator",
"sender_badges": [
"moderator",
"subscriber"
],
"content": "[emote:2506823:azzzjh] hello chat",
"message_type": "message",
"sent_at": "2026-05-16T20:40:16+00:00",
"scraped_at": "2026-05-16T20:40:17+00:00"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result emitted | $0.0010 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Real-time only. Kick has no public chat-history API. This kick chat scraper archives only chat that is sent while the run is active. There is no way to recover messages sent before the Actor started or after it stopped.
- Public chatrooms only. Followers-only or subscribers-only chat modes require a Kick login and Bearer token; that scope is out of v1.
- Single Pusher cluster. Kick currently uses
ws-us2.pusher.comexclusively. If Kick migrates clusters, this Actor will need a version bump. - No moderation events. Bans, deletions, slow-mode toggles, and pinned-message events are received but deliberately ignored; only
App\Events\ChatMessageEventproduces rows. A future sibling Actor will cover moderation. - No emote image resolution.
[emote:N:name]tokens are preserved verbatim incontent. Resolve them via Kick's emote endpoints if you need the PNG/SVG. - 20-channel ceiling per run. The Pusher socket supports up to 20 concurrent chatroom subscriptions. For wider coverage, run multiple Actors in parallel and merge datasets downstream.
FAQ
Is there a Kick API alternative for chat history?
Why can't I get yesterday's chat or download Kick chat history?
Do I need a Kick account or API key?
Is this against Kick's TOS?
Why is `sender_role` only one value when the user has multiple badges?
broadcaster > moderator > staff > founder > og > vip > subscriber > user) so each row carries a single clean label suitable for grouping and filtering. The full badge list is also preserved in sender_badges if you need it.The run finished with zero rows. What happened?
Can I archive a private or subscribers-only chatroom?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Read more
Articles about this Actor
Related Actors