Twitch Public Video Downloader avatar

Twitch Public Video Downloader

Pricing

Pay per event

Go to Apify Store
Twitch Public Video Downloader

Twitch Public Video Downloader

Download authorized public Twitch videos and clips as stored files with creator, timestamps, duration, quality, provenance, and retrieval status.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Download authorized, anonymously playable Twitch videos and clips from supplied public URLs. The Actor stores the selected media in the run key-value store and writes typed provenance records to the default dataset.

It supports:

  • public Twitch VOD URLs such as https://www.twitch.tv/videos/{id};
  • public Twitch clip URLs on twitch.tv/{channel}/clip/{slug};
  • short public clip URLs on clips.twitch.tv/{slug};
  • complete MP4 clip downloads;
  • duration-bounded HLS VOD downloads as MPEG transport streams;
  • metadata-only exports when no media file is needed.

No Twitch account, user OAuth token, browser, or proxy is required for anonymously playable media. Private, removed, subscriber-only, region-restricted, encrypted, or otherwise unavailable media is not bypassed.

What does this Twitch video downloader do?

For each supplied URL, the Actor validates the Twitch URL, resolves public metadata, selects a video rendition, and optionally streams media into the run's key-value store.

Each successful dataset row includes:

  • Twitch VOD or clip identity;
  • title and creator identity;
  • creation and publication timestamps;
  • full media duration;
  • downloaded duration for bounded VOD assets;
  • public view count and VOD category when available;
  • selected resolution and frame rate;
  • stored-file key, API URL, size, and format;
  • canonical source URL and retrieval status.

Clip files are MP4. VOD files are assembled from complete public HLS segments and stored as .ts files.

Who is it for?

Creators and channel teams can back up authorized public clips and bounded VOD sections with stable provenance metadata.

Media archivists can schedule recurring runs and send file links plus source records to an archive pipeline.

Editors and researchers can fetch a lower-resolution working copy without manually navigating the Twitch player.

Data engineers can export metadata-only rows to datasets, spreadsheets, warehouses, or webhooks.

Only download media you own or have permission to archive.

Why use this Actor?

  • One input accepts both VOD and clip URLs.
  • Media is stored with the same run that produced its provenance row.
  • Quality, duration, byte limits, item limits, and retries are explicit.
  • Metadata-only mode avoids unnecessary media transfer.
  • Duplicate URLs in one run are processed once.
  • Failed URLs produce diagnostic rows but are not charged as successful items.
  • There is no hidden residential proxy fallback.

The Actor does not search Twitch channels or discover videos by keyword. Supply exact public media URLs.

Input parameters

FieldTypeDefaultDescription
startUrlsarrayrequiredOne to 25 public Twitch VOD or clip URLs.
maxItemsintegerURL countMaximum unique URLs to process, from 1 to 25.
downloadMediabooleantrueStore media when enabled; export metadata only when disabled.
qualitystring480pbest, 1080p, 720p, 480p, 360p, or worst.
maxDurationSecondsinteger15Maximum VOD media duration, from 1 to 21,600 seconds. Clips remain complete.
maxMediaSizeMbinteger20Per-file safety limit, from 1 to 100 MB.
maxRequestRetriesinteger2Transient request retries, from 0 to 5.

If the requested resolution does not exist, the Actor chooses the closest available rendition at or below it. If every rendition is higher, it chooses the lowest available rendition.

Getting started

  1. Open the Actor input page.
  2. Add one or more public Twitch VOD or clip URLs.
  3. Keep Download media enabled for files, or disable it for metadata only.
  4. Select the desired quality.
  5. For a VOD, choose the maximum duration to store.
  6. Set a byte limit appropriate for the expected media.
  7. Start the run.
  8. Open Dataset for records and Storage for downloaded files.

Start with a short clip or a 15-second VOD sample when validating a new workflow. Increase duration and file limits only after checking output size and cost.

Example input: download a public clip

{
"startUrls": [
{ "url": "https://clips.twitch.tv/SmokyFragileFoxRedCoat-MRH2eCK-8aE8xUzd" }
],
"maxItems": 1,
"downloadMedia": true,
"quality": "360p",
"maxMediaSizeMb": 100
}

This path stores the complete selected MP4 rendition.

Example input: export VOD metadata only

{
"startUrls": [
{ "url": "https://www.twitch.tv/videos/2850006339" }
],
"maxItems": 1,
"downloadMedia": false,
"quality": "480p"
}

Metadata-only mode still resolves current public title, creator, duration, category, thumbnail, and view count. It does not create a media file.

Example input: archive a bounded VOD sample

{
"startUrls": [
{ "url": "https://www.twitch.tv/videos/2850006339" }
],
"downloadMedia": true,
"quality": "360p",
"maxDurationSeconds": 15,
"maxMediaSizeMb": 100,
"maxRequestRetries": 2
}

The Actor stores complete HLS segments whose total duration fits the requested bound. Because Twitch segment lengths vary, the resulting duration can be slightly below the exact limit.

Output fields

FieldMeaning
mediaTypevideo or clip.
twitchIdTwitch VOD ID or clip ID.
titlePublic media title.
creatorIdTwitch broadcaster ID.
creatorLoginBroadcaster login.
creatorNameBroadcaster display name.
createdAtTwitch creation timestamp.
publishedAtPublication timestamp when available.
durationSecondsFull source duration.
downloadedDurationSecondsDuration represented by the stored asset.
viewCountPublic view count at retrieval time.
gameVOD category or game when available.
thumbnailUrlTwitch preview image.
sourceUrlCanonical public Twitch page.
formatmp4 for clips or ts for stored VOD media.
resolutionSelected Twitch rendition label.
frameRateSelected frame rate when available.
storedFileKeyKey-value store record key.
storedFileUrlApify API URL for the file.
storedFileSizeBytesStored file size.
retrievalStatusdownloaded, partial, metadata_only, or failed.
errorConcise failure reason, otherwise null.
retrievedAtRecord production timestamp.

Fields can be null when Twitch does not expose the value or when an input fails.

Example output

{
"mediaType": "clip",
"twitchId": "ExampleClipSlug123",
"title": "Example stream highlight",
"creatorId": "123456789",
"creatorLogin": "examplechannel",
"creatorName": "Example Channel",
"createdAt": "2026-01-15T12:00:00.000Z",
"publishedAt": "2026-01-15T12:00:00.000Z",
"durationSeconds": 29,
"downloadedDurationSeconds": 29,
"viewCount": 1500,
"game": null,
"thumbnailUrl": "https://static-cdn.jtvnw.net/example-thumbnail.jpg",
"sourceUrl": "https://clips.twitch.tv/ExampleClipSlug123",
"format": "mp4",
"resolution": "360p",
"frameRate": 30,
"storedFileKey": "twitch-clip-ExampleClipSlug123-360p.mp4",
"storedFileUrl": "https://api.apify.com/v2/key-value-stores/exampleStore/records/twitch-clip-ExampleClipSlug123-360p.mp4",
"storedFileSizeBytes": 2852913,
"retrievalStatus": "downloaded",
"error": null,
"retrievedAt": "2026-01-15T12:01:00.000Z"
}

The dataset record is the durable integration contract. Playback authorization and CDN URLs are intentionally not exposed because they are short-lived.

Where are downloaded files stored?

Downloaded files are records in the run's default key-value store. Use storedFileUrl from the dataset row to retrieve a file through the Apify API.

  • twitch-clip-*.mp4 contains a complete selected clip rendition.
  • twitch-video-*.ts contains the selected VOD HLS segments.

Storage retention follows your Apify account and storage settings. Copy important files to your long-term object storage before retention expires.

How much does it cost to download Twitch videos?

The Actor uses pay-per-event pricing:

  • Start: $0.005 once per run.
  • Twitch media record: each successful metadata or download record uses tiered pricing; the FREE-tier rate is $0.0088228 per item and BRONZE is $0.007672.

Downloaded and metadata-only records use the same item event. Failed and duplicate inputs are not charged as successful items.

At FREE-tier rates, a one-record run costs about $0.0138 including the run start, whether it stores a file or returns metadata only. A five-record run costs about $0.0491 at FREE-tier rates. Higher subscription tiers receive the active tier discounts shown on the Actor pricing page.

Limits and expected behavior

  • A run accepts at most 25 supplied URLs.
  • A VOD download is limited to complete HLS segments within maxDurationSeconds.
  • A file that exceeds maxMediaSizeMb is rejected and removed rather than stored partially by bytes.
  • Clip media is downloaded in full or rejected.
  • Public metadata and playback availability can change between runs.
  • Stored VOD files are MPEG transport streams, not remuxed MP4 files.
  • The Actor does not combine separate audio/video tracks or transcode media.
  • The Actor does not bypass login, subscription, DRM, geographic, or rights restrictions.
  • A stored file is capped at 100 MB; long or high-resolution VODs may need a shorter duration or lower rendition.

A partial status for a VOD is expected when its full duration exceeds maxDurationSeconds. A failed status includes a concise error suitable for retry classification.

Retry and failure behavior

The Actor retries only transient network errors, HTTP 429 responses, and server failures. Retry delay increases between attempts.

It does not blindly retry:

  • malformed or unsupported URLs;
  • a Twitch media ID that no longer exists;
  • private or subscriber-only media;
  • anonymous playback denial;
  • encrypted media;
  • a deterministic file-size violation.

If every supplied URL fails, the run exits as failed instead of reporting a misleading successful empty run. Mixed runs preserve diagnostic rows for failed URLs and useful records for successful ones.

Scheduling an archival workflow

Use an Apify schedule when you maintain a known list of authorized media URLs. A practical workflow is:

  1. Keep the exact Twitch URLs in Task input.
  2. Run metadata-only checks frequently.
  3. Trigger media downloads only for newly approved URLs.
  4. Export dataset records to a table or warehouse.
  5. Copy stored files to long-term storage.
  6. Deduplicate downstream by mediaType plus twitchId.

The Actor does not discover newly published channel media. Pair it with a separate URL-discovery process if discovery is required.

Integrations

Use Apify integrations to send records to:

  • Google Sheets for a lightweight archive index;
  • webhooks for downstream file transfer;
  • Make or Zapier for approval workflows;
  • cloud storage automation;
  • a database or data warehouse;
  • another Actor through a Task or API workflow.

Always pass exact authorized Twitch URLs into this Actor.

Run with the Apify API using cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~twitch-public-video-downloader/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{"url": "https://clips.twitch.tv/SmokyFragileFoxRedCoat-MRH2eCK-8aE8xUzd"}],
"downloadMedia": true,
"quality": "360p",
"maxMediaSizeMb": 100
}'

Use the returned run ID to inspect status, dataset items, and key-value store records. Do not place an Apify token in source control.

Run with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/twitch-public-video-downloader').call({
startUrls: [
{ url: 'https://www.twitch.tv/videos/2850006339' },
],
downloadMedia: false,
maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For media downloads, read storedFileUrl from each successful item.

Run with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/twitch-public-video-downloader").call(
run_input={
"startUrls": [
{"url": "https://www.twitch.tv/videos/2850006339"}
],
"downloadMedia": False,
"maxItems": 1,
}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

The Python client can also fetch key-value store records after a download run.

Use through MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/twitch-public-video-downloader"

Claude Desktop

Add this server configuration to Claude Desktop:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/twitch-public-video-downloader"
}
}
}

Cursor

Use the same MCP server URL in Cursor's MCP settings and authenticate with your Apify account when prompted.

VS Code

Add the same HTTP MCP server URL to your VS Code MCP configuration. Keep tokens in the editor's secure environment rather than in the workspace file.

Example prompts:

  • "Export metadata for this public Twitch VOD without downloading the file."
  • "Download this authorized public Twitch clip at up to 360p."
  • "Store the first 30 seconds of this public Twitch VOD and return its provenance row."

Include the exact URL and explicit download limits in an MCP request.

Twitch media can be protected by copyright, contract, privacy, publicity, and platform rules. Use this Actor only for media you own, control, or are authorized to download and archive.

Do not use it to:

  • redistribute media without permission;
  • bypass access controls or subscriptions;
  • archive private or restricted content;
  • evade geographic or rights limitations;
  • violate Twitch terms or applicable law.

You are responsible for your inputs, storage, retention, and downstream use. The Actor deliberately fails closed when anonymous public playback is unavailable.

FAQ and troubleshooting

Why did my VOD return partial?

maxDurationSeconds was shorter than the full VOD. Increase the duration if you are authorized to archive more, and ensure the byte limit is sufficient.

Why did the file-size check fail?

The selected rendition exceeded maxMediaSizeMb. Choose a lower quality, reduce VOD duration, or raise the size limit within the supported maximum.

Why does a Twitch URL fail even though the page once worked?

Twitch VODs and clips can be removed, expire, become restricted, or lose anonymous playback availability. Confirm the URL still plays while logged out.

Why is a VOD file .ts instead of .mp4?

Public Twitch VOD playback uses HLS segments. The Actor joins complete selected segments without transcoding, preserving a low-memory streaming path. Use a media tool you trust to remux the authorized file when MP4 is required.

Does it download live streams?

No. This Actor supports supplied public VOD and clip URLs, not active live channels.

Does it search Twitch?

No. Use exact media URLs.

These Actors solve separate source or discovery jobs. Use only the tool whose source and access scope match your workflow.