Kick.com Chat Archive
Under maintenancePricing
Pay per event
Kick.com Chat Archive
Under maintenanceArchive live Kick.com chat. Subscribe to one or more channels, capture every message with sender, role, badges, and timestamp. Kick has no native chat history — this is the only way.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 hours ago
Last modified
Categories
Share
🎯 What this 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.
Each archived row carries the message text, the sender's username, slug, chat color, derived role (broadcaster / moderator / VIP / subscriber / user), raw badge list, Kick's message UUID, the original send timestamp, and the scrape timestamp.
🔥 What we handle for you
- 🛡️ Cloudflare-aware lookup — we rotate
curl-cffibrowser TLS fingerprints (Chrome / Firefox / Safari) on the REST channel-lookup hop and reconnect on transient drops. - 🌐 Proxy-routed REST hop — Apify Proxy on the Cloudflare-protected channel lookup; the Pusher WebSocket itself is direct, low-latency, and unproxied.
- 🔁 Retries with backoff on
408 / 429 / 5xx—Retry-Afterhonoured; up to 5 attempts. - 🧱 Deterministic stop — exits when either the time cap or the message-count cap fires; partial successes surface via
Actor.set_status_message, never silent. - 🧊 Clean, typed dataset rows — Pydantic-validated schema, ISO-8601 timestamps, stable UUIDs, canonical
sender_rolederived per message + 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 only pay 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.
⚙️ How to use it
- Click Try for free at the top of the page.
- Enter one or more Kick channel slugs (the part after
kick.com/). Lowercase preferred; full URLs are accepted and normalised. - Set
maxDurationSeconds(default 5 minutes) andmaxMessagesTotal(default 1 000). The run exits as soon as either cap is hit. - Click Start. Messages stream into the run's dataset as they arrive.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
channelSlugs | array | yes | ["xqc"] | 1–20 Kick channel slugs (lowercase). URLs accepted and normalised. |
maxDurationSeconds | integer | no | 300 | 5–3 600 seconds. Hard 1-hour ceiling per run. |
maxMessagesTotal | integer | no | 1000 | 1–50 000 messages across all channels combined. |
proxyConfiguration | object | no | Apify Proxy on | Used for Kick's Cloudflare-protected REST channel lookup only — the Pusher WebSocket bypasses the proxy. |
Example input
{"channelSlugs": ["xqc", "trainwreckstv"],"maxDurationSeconds": 600,"maxMessagesTotal": 5000,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one archived chat message.
| Field | Type | Notes |
|---|---|---|
channel_slug | string | The input slug this message came from. |
chatroom_id | integer | Pusher chatroom identifier. |
message_id | string | Kick's message UUID. |
sender_id | integer | null | Sender's Kick user id (null on system events). |
sender_username | string | Sender display name. |
sender_slug | string | null | Sender URL-safe handle. |
sender_color | string | null | Hex color the sender picked. |
sender_role | string | Canonical role: broadcaster, moderator, staff, founder, og, vip, subscriber, user. |
sender_badges | array | Raw badge type strings exactly as Kick sends them. |
content | string | Message text. May contain [emote:N:name] tokens. |
message_type | string | Kick's type field — usually message. |
sent_at | string | ISO 8601 UTC timestamp Kick stamped the message with. |
scraped_at | string | ISO 8601 UTC timestamp this row was written. |
Example output
{"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
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.05 | One-off warm-up charge per run. |
result-row | $0.001 | Per archived message. |
Example: a 5-minute archive of a popular streamer that captures 1 000 messages costs $1.05. A quieter channel with 100 messages over the same window costs $0.15.
🚧 Limitations
- Real-time only. Kick has no public chat-history API. This Actor 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's out of scope for 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.
❓ FAQ
Why can't I get yesterday's chat?
Kick does not store chat. Period. Twitch and YouTube both expose past chat through their APIs; Kick does not. This Actor is the workaround — schedule it to run during the stream you care about, and the chat is archived as it happens.
Do I need a Kick account or API key?
No. Kick's chat WebSocket is a public Pusher app — the same one your browser uses. This Actor reads it without any authentication. We never log in to Kick.
Is this against Kick's TOS?
We only read what Kick delivers to every public viewer's browser. We do not pose as users, send messages, cast votes, or touch private surfaces. For commercial-scale or sensitive use cases please review Kick's Terms before deploying.
Why is sender_role only one value when the user has multiple badges?
We pick the highest-priority role per message (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?
Either the channel was offline (no live stream → no chat) or it was silent for the configured window. The Actor exits non-zero with a clear status message so you don't get a green run with an empty dataset.
Can I archive a private / subscribers-only chatroom?
Not in this Actor. That would require a Kick login token; v1 is read-only on public chatrooms. Request a sibling Actor if you need it.
💬 Your feedback
Spotted a bug, want a new field, or need a moderation-events sibling Actor? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly.
Built by Devil Scrapes 😈 — a small fleet of opinionated public-data Actors. Honest pricing, real engineering, zero fine print.