Youtube Live Chat Scraper
Pricing
from $0.80 / 1,000 chat events
Youtube Live Chat Scraper
YouTube Live Chat Scraper extracts live chat from YouTube live streams and replays. Supports full replay chat (most reliable) and best-effort live polling. Outputs messages with timestamps, authors, badges (owner/mod/member), Super Chats/Stickers, and stream metadata for analytics and AI.
Pricing
from $0.80 / 1,000 chat events
Rating
0.0
(0)
Developer

Delowar Munna
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Extract live chat messages from YouTube streams and replays — messages, Super Chats, membership events, badges, timestamps. Replay-first, export-ready for moderation and analytics.
Provide video URLs or channel handles and get a clean, structured dataset of every chat event. No browser required.
What does YouTube Live Chat Scraper do?
YouTube Live Chat Scraper is an Apify Actor that extracts live chat data from YouTube live streams and live replays using HTTP requests — no browser needed. It captures regular messages, Super Chats, Super Stickers, membership events, and moderation actions, then outputs them as a clean, analytics-ready dataset.
Key capabilities
- Replay chat extraction — Extract the full chat replay from any YouTube live stream with chat replay enabled
- Live chat capture — Best-effort real-time polling of live chat during active streams
- Channel discovery — Provide a channel URL or @handle and auto-discover live streams and recent replays
- Super Chats & Stickers — Capture paid messages with amounts, currencies, and tier colors
- Membership events — Track member joins and renewals shown in chat
- Moderation events — Capture message deletions, user bans, and system events
- Batch processing — Process multiple videos or channels in parallel
- Normalized schema — Stable output format with consistent event types across all renderers
Use cases
- Moderation analytics — Audit chat for spam, toxicity patterns, and moderation effectiveness
- Audience research — Analyze engagement peaks, sentiment, and discussion topics during live events
- Revenue tracking — Collect Super Chat amounts and donor messages for creator analytics
- Campaign measurement — Measure audience reaction during sponsored streams or product launches
- AI/NLP datasets — Build training data for sentiment analysis, topic modeling, or spam classifiers
- Community monitoring — Track live chat activity across multiple channels automatically
Input
You can provide video URLs/IDs directly, channel URLs/@handles for auto-discovery, or both. At least one of videoRefs or channelRefs is required.
Input example — Replay extraction (direct video)
{"videoRefs": ["https://www.youtube.com/watch?v=2VPo6OHrltU"],"mode": "replay","maxMessagesPerVideo": 5000,"maxTimePerVideoSecs": 600,"includeSuperChats": true,"includeMembershipEvents": true,"includeModerationEvents": true}
Input example — Channel discovery
{"channelRefs": ["https://www.youtube.com/@TheCypherbyDbloc"],"channelDiscoveryMode": "current_live_then_replays","maxVideosPerChannel": 5,"lookbackDays": 30,"mode": "replay","maxMessagesPerVideo": 5000,"maxTimePerVideoSecs": 600}
Input parameters
Videos
| Field | Type | Default | Description |
|---|---|---|---|
videoRefs | string[] | [] | YouTube watch URLs or 11-char video IDs |
mode | string | "replay" | replay or live |
Channel Discovery
| Field | Type | Default | Description |
|---|---|---|---|
channelRefs | string[] | [] | YouTube channel URLs, @handles, or channel IDs (UC...) |
channelDiscoveryMode | string | "current_live_then_replays" | current_live_only, latest_replays_only, or current_live_then_replays |
maxVideosPerChannel | integer | 5 | Max videos to discover per channel (1–50) |
lookbackDays | integer | 30 | Only discover replays from the last N days (0 = no limit) |
includeUpcomingLives | boolean | false | Include scheduled/upcoming live streams |
includeMembersOnly | boolean | false | Include members-only streams |
Extraction limits
| Field | Type | Default | Description |
|---|---|---|---|
maxMessagesPerVideo | integer | 5000 | Max messages per video (1–200,000) |
maxTimePerVideoSecs | integer | 600 | Time budget per video in seconds |
Event filters
| Field | Type | Default | Description |
|---|---|---|---|
includeSuperChats | boolean | true | Extract Super Chats and Super Stickers |
includeMembershipEvents | boolean | true | Track membership events |
includeModerationEvents | boolean | true | Track moderation events |
Live mode controls
| Field | Type | Default | Description |
|---|---|---|---|
liveCaptureDurationSecs | integer | 300 | Total capture duration for live mode |
pollIntervalMs | integer | 2000 | Poll interval in milliseconds (1000–10000) |
stopWhenStreamEnds | boolean | true | Stop if stream ended is detected |
Localization
| Field | Type | Default | Description |
|---|---|---|---|
language | string | "en" | Localization language code |
regionCode | string | "US" | Localization region code |
Advanced settings
| Field | Type | Default | Description |
|---|---|---|---|
maxConcurrency | integer | 3 | Parallel video processing (1–10) |
useProxy | boolean | false | Use Apify residential proxy |
proxyCountryCode | string | "" | Proxy exit country |
requestTimeoutSecs | integer | 30 | HTTP timeout per request |
maxRetries | integer | 3 | Retries for 429/5xx errors |
minDelayMs | integer | 0 | Delay between continuation requests |
debug | boolean | false | Enable verbose logging |
Output
The actor outputs one dataset row per chat event. Each row contains the message content, author information, event metadata, and discovery provenance.
Event types: message, super_chat, super_sticker, membership, moderation, system, error
Output example (JSON)
{"videoId": "BZ_UzbpMjMg","videoUrl": "https://www.youtube.com/watch?v=BZ_UzbpMjMg","eventType": "message","messageId": "ChwKGkNNamR6OTJMbEpNREZkSUwxZ0FkaVRRYVpR","timestampUsec": 1773103087877500,"publishedAt": "2026-03-10T00:38:07.877Z","authorChannelId": "UC9N4Cb1knbL1DJE1K1S7xnQ","authorName": null,"authorHandle": "@kasparaskriauciunas2433","authorPhotoUrl": "https://yt4.ggpht.com/ytc/AIdro_l0N2E6QEsxEQF9oCJnhf1j9wAfU22I374hUQAbatg=s32-c-k-c0x00ffffff-no-rj","authorBadges": [],"messageText": "@ByornVarg what if we dont have enough gas, whats ur thoughts then?","messageParts": [{"type": "text","text": "@ByornVarg what if we dont have enough gas, whats ur thoughts then?"}],"isPinned": null,"likeCount": null,"superChatAmount": null,"superChatCurrency": null,"superChatColor": null,"membershipLevel": null,"moderationAction": null,"seq": 1,"regionCode": "US","retrievedAt": "2026-03-10T01:24:20.274Z","streamStatus": "replay","runId": "qg6A5QXp9LNumBfpA","discoverySource": "channel_discovery_api","channelRef": "https://www.youtube.com/@TheCypherbyDbloc","discoveredAt": "2026-03-10T01:24:19.503Z","isDiscoveredLive": true,"isDiscoveredUpcoming": false}
Output screenshot — All fields table view

Output fields
| Field | Type | Description |
|---|---|---|
retrievedAt | string (ISO) | When the event was captured |
videoId | string | YouTube video ID |
videoUrl | string | Canonical watch URL |
streamStatus | string | live, replay, ended, or unknown |
eventType | string | message, super_chat, super_sticker, membership, moderation, system, error |
messageId | string | Stable message ID |
seq | integer | Sequential index per video (1..N) |
publishedAt | string (ISO) | Message timestamp (when available) |
timestampUsec | integer | Raw microsecond timestamp |
authorChannelId | string | Author's channel ID |
authorName | string | Display name |
authorHandle | string | @handle |
authorPhotoUrl | string | Avatar URL |
authorBadges | string[] | e.g., ["OWNER", "MODERATOR", "MEMBER"] |
messageText | string | Chat message text |
messageParts | object[] | Structured runs (text + emojis) |
isPinned | boolean | Whether message is pinned |
likeCount | integer | Like count (rare) |
superChatAmount | string | e.g., "$5.00" |
superChatCurrency | string | e.g., "USD" |
superChatColor | string | UI tier color |
membershipLevel | string | e.g., "Silver Member" |
moderationAction | string | e.g., "MESSAGE_DELETED" |
regionCode | string | Region used for request |
runId | string | Apify run ID |
discoverySource | string | direct_videoRef, channel_discovery_api, or channel_discovery_html |
channelRef | string | Channel input that produced this video |
discoveredAt | string (ISO) | When the video was discovered |
isDiscoveredLive | boolean | Whether video was live when discovered |
isDiscoveredUpcoming | boolean | Whether video was upcoming when discovered |
Run summary
The actor writes a RUN_SUMMARY.json to the key-value store with per-video totals, errors, and channel discovery results.
How it works
- Channel discovery (if
channelRefsprovided) — Resolves channel handles/URLs to channel IDs, discovers live streams and replays using YouTube Data API with HTML fallback, and applies discovery filters - Token extraction — Fetches YouTube watch page HTML and extracts innertube API key, context, and chat continuation token
- Chat pagination — Paginates chat events using continuation tokens via the youtubei API (replay) or polls live chat (live mode)
- Event normalization — Maps YouTube renderer types into stable event types (
message,super_chat, etc.) - Output — Pushes clean dataset rows and writes
RUN_SUMMARY.json
Performance
- Replay mode — 5,000 messages typically in 1–5 minutes
- Live mode — Near real-time at 1–10 seconds latency
- Channel discovery — Adds ~2–5 seconds per channel
- Concurrency — Up to 10 videos processed in parallel
- HTTP-only — No browser overhead
Limitations
- Chat replay must be enabled on the video
- Members-only chat behind authentication is best-effort
- Live mode is best-effort polling (not websocket)
- Age-gated or restricted content may not be accessible
- Channel discovery depends on YouTube Data API quota and/or streams tab availability
Pricing
This actor uses a pay-per-event pricing model. You are charged for each chat event (dataset row) extracted.
| Event | Description |
|---|---|
chat-event | 1 event per dataset row |
