Archive live Kick.com chat via the Kick chat API — subscribe to one or more channels and capture every message with sender, role, badges, and timestamp, export to JSON or CSV. Kick has no native chat history, so this is the way to keep a record.
Add RECV_CHUNK_S=45 cap on each ws.recv() call in _iter_messages.
Previously the recv timeout was set to the full remaining window duration
(up to 3540 s). In cloud environments where NAT/firewall infrastructure
silently drops idle TCP connections (no RST/FIN), the recv would hang
until the window expired rather than detecting the dead connection quickly.
With the 45-second chunk cap, a stale TCP connection is detected within
one chunk window; a chunk timeout on a still-live connection is benign
(the loop continues for another chunk). This closes a residual hang vector
on channels with no chat activity.
0.4 — 2026-06-09
Fix 10/13 TIMED-OUT customer runs. Root cause: maxDurationSeconds cap
(3600 s) matched the Apify platform timeoutSecs exactly, so the platform
timer raced the Actor's listen window during container startup (~5-10 s
overhead) and won → the run reported TIMED-OUT instead of SUCCEEDED.
Fix: reduce DURATION_MAX_S to 3540 s (59 min) and set the platform
defaultRunOptions.timeoutSecs to 3660 s (60 s buffer over the new cap).
Replace asyncio.get_event_loop() with asyncio.get_running_loop() in
ws_client.py (Python 3.10+ best practice; get_event_loop() is
deprecated when called outside a running event loop context).
Add ping_interval=None to websockets.connect() to disable library-level
WebSocket pings. Pusher drives its own heartbeat via pusher:ping /
pusher:pong at the application layer; the library's concurrent ping
occasionally interfered in cloud environments causing spurious
ConnectionClosed during quiet channels.
0.3 — 2026-06-01
Fix "Under maintenance" flag. A run that connected to Kick's chat
socket and subscribed successfully but saw zero messages (every
channel offline/silent for the window) used to exit 1 — so Apify's
automated daily QA, which prefills a single channel that is often
offline, failed three days running and unlisted the Actor.
A clean connect + subscribe with zero messages is now a successful
empty run (exit 0) with an explanatory status message. Fail-loud
(exit 1) is reserved for a genuinely broken integration: the socket
never connects, or no channel accepts the subscription
(ListenStats.connected / subscriptions_succeeded).
0.1.0 — 2026-05-16
Initial release. Subscribes to Kick.com chat via the public Pusher
WebSocket, archives one row per chat message until the duration or
message-count cap fires. Real-time only — Kick exposes no historical
chat retrieval.