Quick answer: Twitch gives streamers no way to download, search, or export their VOD chat. To get a searchable log of who said what, and when, you run the Twitch VOD Chat Archive Actor on Apify (free $5 trial credit, no card), export the result as a CSV from the Apify Console, and open it in Google Sheets or Excel. From there you can filter by
commenter_display_nameto pull every message one viewer sent, or sort bymessage_offset_secondsto jump straight to a moment in the VOD.
Every streamer has been here: something happened in chat during last night's broadcast โ a coordinated harassment run, a memorable hype moment, a viewer who said something that needed following up โ and now you are scrubbing through a four-hour VOD replay trying to find it. Or your mod flagged a username and you want to see everything that person has ever posted in your channel across the last ten streams. Twitch gives you nothing to work with. The web player shows the chat replay as you watch; there is no search, no filter, no download button, and no export.
This guide is for working streamers and their mods who want to get that data into a spreadsheet, today, without writing code.
Can I download my Twitch chat after the stream? ๐ฌ
The short answer is: not through Twitch itself. The Twitch Helix API โ Twitch's official developer interface โ does not expose VOD chat replay as an endpoint. That feature was never built. The data exists, Twitch uses it internally to sync the chat replay in the VOD player, but they do not offer bulk access to it through a documented API.
What does exist is the internal GraphQL endpoint the VOD player itself calls. Walking that endpoint reliably requires matching a real browser's network fingerprint and handling Twitch's rate limits, which kick in aggressively once you are pulling more than a few hundred messages from a single IP. That is the engineering problem this tool solves for you.
What you get ๐
One row per chat message. Every row has:
| Field | What it contains |
|---|---|
commenter_display_name |
The viewer's name โ filter by this to find all messages from one person |
message_text |
The full message text, including emote shortcodes |
message_offset_seconds |
Seconds into the VOD โ your jump-to-timestamp |
posted_at |
Wall-clock UTC time the message was sent |
is_subscriber |
true or false โ filter subs-only chat quickly |
badges |
Moderator, subscriber tier, bits badges |
vod_title |
The VOD the message came from |
A small taste of what the spreadsheet looks like once you export:
| commenter_display_name | message_text | message_offset_seconds | is_subscriber |
|---|---|---|---|
| SomeViewer42 | PogChamp what was that | 3847 | false |
| loyal_mod99 | @SomeViewer42 agreed that was insane | 3849 | true |
| CoolRegular | LUL LUL LUL | 3850 | false |
| SomeViewer42 | wait can you clip that | 3855 | false |
message_offset_seconds is 3847 โ divide by 60 and you know to jump to 64:07 in the VOD. That is the clip moment.
Step-by-step: pull your channel's recent VOD chats ๐
This workflow takes about five minutes for most channels. No coding required.
1. Create a free Apify account
Go to apify.com and sign up. Every new account gets $5 of free credit โ enough for roughly 4,900 chat messages before you spend a cent. No card required.
2. Open the Actor
Go to apify.com/DevilScrapes/twitch-vod-chat-archive and click Try for free.
3. Fill in the input form
You have two ways to tell the Actor what to pull:
Option A โ pull your recent back-catalogue (recommended for most streamers)
- Leave
vodIdsempty. - Set
channelLoginto your channel's URL slug โ the bit aftertwitch.tv/. For example, if your channel istwitch.tv/mychannelname, entermychannelname. - Set
maxRecentVodsto however many recent VODs you want. The default is 5; the maximum is 50. Setting it to 10 pulls your last ten archived broadcasts. - Leave
maxMessagesPerVodat 5000 unless you want the full chat log for every VOD. For a quick search pass, 5000 messages per stream is plenty to cover the highlights.
Option B โ pull one specific VOD
- Paste the VOD URL or numeric ID into
vodIds. For example:https://www.twitch.tv/videos/2773625679or just2773625679. - Leave
channelLoginempty.
4. Click Start
The Actor runs in Apify's cloud. You do not need to keep the tab open โ when it finishes, Apify sends a notification (if you set one up) or you can refresh the run page to see the green SUCCEEDED status.
We handle the proxy rotation and rate limits on our end so the run does not get interrupted mid-way through a long VOD. If Twitch pushes back on a sustained pull, we rotate to a fresh residential exit IP and retry โ your run keeps going.
5. Export to CSV
Once the run completes, click Storage in the left sidebar, then Dataset, then Export. Choose CSV. The file downloads immediately.
Alternatively, on the run's results page, there is an Export button at the top right of the dataset view. One click, no options to configure.
What to do with the spreadsheet ๐
Open the CSV in Google Sheets or Excel. You now have a fully searchable chat log.
Find every message from one viewer
Add a filter to the commenter_display_name column. Type the username. Every message that viewer sent across all the VODs you pulled is now isolated. This is your mod tool for checking if a user has a history in your channel before taking an action.
Jump to a moment in the VOD
Sort by message_offset_seconds ascending. Find the message you remember. Take the offset value โ say 5423 โ and go to 5423 รท 60 = 90.4, which is 1:30:23 into the VOD. Open the VOD, scrub to that timestamp.
Find subscriber-only chat patterns
Filter is_subscriber to TRUE. This shows you your sub community's chat in isolation โ useful for understanding what your paid audience responds to differently from the general chat.
Find the busiest moment in a stream
In Excel or Google Sheets, use a pivot table or COUNTIFS to count messages per 60-second window across message_offset_seconds. The peaks are your hype moments. Cross-reference them with what was happening on stream to understand what your audience reacted to.
Pricing โ what it costs ๐ฐ
The Actor uses pay-per-event pricing: you pay for messages that land in your dataset, and nothing for messages that fail to retrieve.
| What you pull | Approximate cost |
|---|---|
| 100 messages | $0.15 |
| 1,000 messages | $1.05 |
| 5 VODs ร 5,000 messages each | $25.05 |
Specifically: $0.05 per run start + $0.001 per message. A typical single-stream pull of 5,000 messages costs $5.05. Your first ~4,900 messages are covered by Apify's free $5 trial credit. After that, you top up your account balance โ no subscription, no minimum.
For a busy channel with large VODs, the full chat export costs more. Set maxMessagesPerVod to a lower number (500โ2000) if you just want a representative sample from each stream rather than the full log.
Optional: a short Python snippet
If you want to automate pulling your back-catalogue on a schedule โ say, every Monday morning โ here is a minimal Python script that kicks off a run and downloads the resulting CSV. You only need this if you want to automate; for one-off pulls, the Console UI above is faster.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("DevilScrapes/twitch-vod-chat-archive").call(
run_input={
"channelLogin": "your_channel_name",
"maxRecentVods": 5,
"maxMessagesPerVod": 5000,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Downloaded {len(items)} messages from your recent VODs.")
Replace YOUR_APIFY_TOKEN (from Apify Console โ Settings โ Integrations) and your_channel_name with your actual channel slug. Run this in any Python environment โ no dependencies beyond apify-client.
FAQ โ
Does this work on my own channel or only on others' channels?
Both. The channelLogin field accepts any public Twitch channel slug. If your channel has public VODs with chat replay enabled, it works. The Actor requires no Twitch login โ it reads the same public data anyone can see in the VOD player.
What if my VOD chat replay is disabled?
Twitch lets channels disable the chat replay independently of the VOD. If replay is off, the Actor returns zero messages for that VOD and notes this in the run status. The VOD itself may still exist; the chat just is not accessible.
How far back can I go?
As far back as your VODs exist. Twitch keeps past broadcasts for 7 days on standard accounts, and 14 days for Affiliates, Partners, Prime, and Turbo. Highlights and exported VODs are kept indefinitely. If a VOD has expired and been deleted, its chat replay is gone with it โ so pull it while it is live.
Can I use this to track a specific viewer across streams?
Yes, for your own channel's public history. Pull your recent VODs, export to CSV, and filter by commenter_display_name. This is a legitimate moderation and community-management workflow โ understanding who your regulars are, following up on a specific incident, or reviewing a viewer's history before a ban decision.
The run finished but the dataset looks small โ what happened?
The most common cause is maxMessagesPerVod being set to the default of 5,000 and your VODs having more messages than that. Raise the limit (up to 200,000 per VOD) and re-run. The second common cause is a VOD with subscriber-only chat enabled โ the Actor will note this in the run status message.
Further reading
If you want to go deeper on the technical side โ how the Actor handles Twitch's rate limits, the pagination trick that avoids the browser integrity challenge, and what the full output schema looks like โ see the anchor post: Twitch Chat Scraper: export any VOD's full chat replay for $1.05/1K.
The Actor is live now: apify.com/DevilScrapes/twitch-vod-chat-archive. Free $5 trial credit, no credit card. Set channelLogin to your channel slug, leave the defaults, click Start. You will have your recent chat history in a spreadsheet in a few minutes.
Built by Devil Scrapes โ we do the dirty work so your dataset stays clean. ๐
Top comments (0)