How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
twitchin Channels. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Twitch Clips & VODs Scraper exports the clips or past videos (VODs) of any Twitch channels for any date range, one row per clip or video with title, views, duration, clip creator, game, link and thumbnail, from the official Twitch API with your own free Twitch key.
- Clips come most-viewed first. Twitch shows only about 1,000 clips for one date range, so for a long range the Actor splits it into smaller time windows (down to one hour). This way a channel with many thousands of clips can be exported.
- VODs come newest first: past broadcasts, highlights and uploads. You can choose which of the three types you want.
Good for
- Get the top clips of a streamer for a week, a month or all time.
- Make a list of a channel's past broadcasts with titles, length and views before Twitch deletes them.
- Compare clip activity of several channels for the same period (up to 100 channels per run).
- Schedule a daily run to build a growing archive of fresh clips and VODs.
Not a good fit
- No video or audio files. Use the
urlto watch the clip or video on Twitch. - No chat messages, follower counts or live streams.
- Twitch deletes past broadcasts after 7–60 days (it depends on the streamer's account). Old broadcasts are gone and cannot be exported. Highlights and uploads stay.
- Twitch does not send a game for VODs, so
gameNameis empty for VOD rows. - A free Twitch developer app is required. It takes two minutes to make. With no app keys, you get a single free row that explains the setup.
Who uses it
Content editors
Find the top clips of a streamer for a week or a month.
Streamers
List your past broadcasts with titles, length and views.
Analysts
Compare clip activity of several channels in the same period.
Price
Prices will be shown after release.
Questions
Do I need a Twitch key?
Yes. Make a free app in the Twitch developer console. Paste its Client ID and Secret.
Does it download videos?
No. It gives data and links only. Use the url to watch on Twitch.
Can I get many clips from a big channel?
Yes, up to 10,000 per channel per run. The Actor splits the date range into small windows.
Why is the game empty for VODs?
Twitch does not send a category for videos.
Do I need to pay Twitch?
No. Twitch does not charge for API access. You only need a Twitch login with 2FA switched on and one free app in the developer console.
Is my key safe?
Yes. clientId and clientSecret are secret inputs that Apify encrypts. They do not appear in rows, logs or RUN_SUMMARY. The temporary Twitch token exists only while the run works and is revoked at the end.
Can it download the clip or video files?
No. The Actor returns data and links only. Use url to watch on Twitch.
Can I use the data commercially?
Your use of the data falls under the Twitch developer rules for your own app. They ask for credit to Twitch and set limits on keeping some data. The source and url fields help you give credit. Check the Twitch Developer Agreement for your use.
Details
Step by step on Apify
- Open the Input tab.
- Paste your Twitch Client ID (
clientId) and Twitch Client Secret (clientSecret). - Keep the prefilled Channels (
channels) valuetwitch, Export (type) valueClipsand Max items per channel (maxItems) value10, or type your own channel. - Click Start.
- Open the Output tab and check the Clips and VODs table:
title,viewCountandurlfor each clip.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Find a streamer's best clips for a period | channels, type: clips, startedAt, endedAt | clip | title, viewCount, creatorName, url | export to a sheet, pick clips for a video |
| Archive a channel's past broadcasts | channels, type: vods, vodTypes: ["archive"] | VOD | title, durationSec, createdAt, url | schedule weekly before Twitch deletes them |
| Compare channels | several channels, same period | clip | channel, viewCount, createdAt | spreadsheet or BI tool |
| Watch new clips of a channel | channels, startedAt: "1 day" | clip | id, createdAt, viewCount | schedule + webhook to Slack or a database |
Tips for better results
- Clips come most viewed first. Use a short date range for fresh clips.
- Use the id field to remove repeats between daily runs.
- Pick the VOD types you want: broadcasts, highlights or uploads.
Limits and good to know
- Each run pays the
apify-actor-startfee once. This includes runs with missing or wrong Twitch keys - The channel fee is charged once for each channel that exists on Twitch and is searched, also when it has nothing in your period. Unknown channels are not charged
- The
api_key_requirednotice row is free. Skipped repeats and items outside your period or VOD types are free - If a run ends early, for example because your cost cap was hit, you pay only for rows that reached the Dataset
- Platform usage (compute, storage) is included in these prices
- Up to 100 channels and up to 10,000 items per channel in one run
- In our tests one run saved 10,000 clips in about 100 seconds. Very big runs (many channels × many items) can reach the time limit; the Actor then keeps the saved rows and ends with
PARTIALandTIME_LIMIT. Split such work into several runs - Runs time out after 300 seconds by default. Work ends 15 seconds early so the summary is always written. Raising the timeout helps up to 15 minutes of work
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "ok",
"id": "CrispyJollyGullHassaanChop-nPlLKGxGRcBj37e4",
"type": "clip",
"channel": "twitch",
"channelName": "Twitch",
"channelId": "12826",
"title": "F1 2017 E3 Gameplay!",
"creatorName": "power_tester",
"viewCount": 4647095,
"durationSec": 59.9,
"createdAt": "2023-07-12T01:07:36.000Z",
"url": "https://www.twitch.tv/twitch/clip/CrispyJollyGullHassaanChop-nPlLKGxGRcBj37e4",
"thumbnailUrl": "https://static-cdn.jtvnw.net/twitch-video-assets/twitch-vap-video-assets-prod-us-west-2/28003ace-b7f2-4d69-950c-2aa57e8797f2/landscape/thumb/thumb-0000000000-480x272.jpg",
"gameId": "0",
"gameName": null,
"language": "en",
"vodId": null,
"vodOffsetSec": null,
"isFeatured": false,
"videoType": null,
"description": null,
"publishedAt": null,
"source": "twitch-helix",
"fetchedAt": "2026-10-22T05:40:54.605Z",
"message": null
}Data fields (25)
| Field | Type | Meaning |
|---|---|---|
status | string | ok = a clip or VOD; api_key_required = free notice row when the Client ID or Secret is missing. |
id | string | Clip slug (as in clips.twitch.tv/<id>) or video id. |
type | string | clip or vod. |
channel | string | Channel login, as in twitch.tv/<login>. |
channelName | string | Channel display name. |
channelId | string | Twitch channel (broadcaster) id; stable. |
title | string | Clip or video title. |
creatorName | string | Clip: the viewer who made the clip. VOD: the channel. |
viewCount | integer | Views; null when Twitch sent no number. |
durationSec | number | Length in seconds: clips with tenths (17.9), VODs whole seconds. |
createdAt | string | When the clip or video was created, ISO 8601 UTC. |
url | string | Link to the clip or video on Twitch. |
thumbnailUrl | string | Preview image; VODs at 1280x720; null while Twitch is still processing a VOD. |
gameId | string | Clip: Twitch category id. Null for VODs (Twitch gives none). |
gameName | string | Clip: category name, e.g. Just Chatting. |
language | string | Two-letter language of the broadcast. |
vodId | string | Clip: the video it was cut from; null when that VOD is gone. |
vodOffsetSec | integer | Clip: where in that video the clip starts, seconds. |
isFeatured | boolean | Clip: featured by the channel. |
videoType | string | VOD: archive (past broadcast), highlight or upload. |
description | string | VOD description. |
publishedAt | string | VOD: when it was published, ISO 8601 UTC. |
source | string | Always twitch-helix (official Twitch API). |
fetchedAt | string | When the Actor read this row, ISO 8601 UTC. |
message | string | Only on the api_key_required row: how to get a free key. |
Input settings (8)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Twitch Client ID | clientId | string | |
| Twitch Client Secret | clientSecret | string | |
| Channels | channels | array | ["twitch"] |
| Export | type | string | "clips" |
| From | startedAt | string | |
| To | endedAt | string | |
| VOD types | vodTypes | array | ["archive", "highlight", "upload"] |
| Max items per channel | maxItems | integer | 10 |