Twitch clips API: top clips, VODs and channel stats
A Twitch clips API that returns a channel's most viewed clips, past broadcasts and live status as JSON. No Twitch app or OAuth token. 1 credit per call.
By Scrape Everything team · · 11 min read
Last updated: October 21, 2026. Twitch's own clip endpoints changed in late 2025 and are still moving, so we review this page every 90 days.
TL;DR: The Scrape Everything Twitch clips API returns a channel's most viewed clips for the last day, week, month or all time, up to 50 per request, as JSON. It costs 1 credit per call and needs no Twitch developer app or OAuth token.
Two sibling endpoints cover the rest of a channel: past broadcasts, highlights and uploads, plus a channel card with partner status, follower count and live details. Same price, same key.
What is a Twitch clips API, and what does ours return?
A Twitch clips API is a service that returns a channel's clips as JSON, with views, duration, clipper, game and a link back to the source VOD. Ours is three endpoints, all POST requests against https://api.scrapeeverything.com:
| Endpoint | Path | What it returns | Max items | Credits |
|---|---|---|---|---|
twitch.clips | /v1/twitch/clips | Most viewed clips for last_day, last_week, last_month or all_time | 50 | 1 |
twitch.videos | /v1/twitch/videos | Past broadcasts (archive), highlight, upload or all | 50 | 1 |
twitch.channel | /v1/twitch/channel | Display name, bio, partner/affiliate flags, followers, images, live stream or last broadcast | 1 channel | 1 |
Every endpoint takes a username: a Twitch login name or a full channel URL like https://www.twitch.tv/example_streamer. That detail saves a step. Helix's Get Clips wants a numeric broadcaster_id, so with the official API you usually call Get Users first to turn a login into an ID. Here you pass the login and you're done.
The response envelope is the same everywhere: success, the endpoint's data, and a meta object that says what the request cost. Full parameter tables are in the Twitch endpoint reference, and the Twitch scraper page has a copy-ready request for each endpoint.
How do I get a Twitch channel's top clips by period?
Set period to pick the window and limit to pick the count (1 to 50, default 20). The default period is last_week, which is what most compilation channels want anyway.
curl -X POST https://api.scrapeeverything.com/v1/twitch/clips \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "example_streamer", "period": "last_week", "limit": 5}'Trimmed response, with placeholder values and the real field names:
{
"success": true,
"data": {
"user_id": "123456789",
"username": "example_streamer",
"display_name": "Example_Streamer",
"period": "last_week",
"clips": [
{
"id": "987654321",
"slug": "ExampleClipSlug-AbCdEf123",
"link": "https://www.twitch.tv/example_streamer/clip/ExampleClipSlug-AbCdEf123",
"title": "clutch 1v4 on the last round",
"view_count": 48210,
"duration_seconds": 28,
"created_at": "2026-10-17T21:14:03Z",
"thumbnail_url": "https://example-cdn.invalid/clip-thumb.jpg",
"creator": { "username": "example_viewer", "display_name": "Example_Viewer" },
"game": { "id": "32399", "name": "Counter-Strike" },
"video_id": "2200000000",
"video_offset_seconds": 9312,
"vod_link": "https://www.twitch.tv/videos/2200000000?t=2h35m12s"
}
],
"clips_fetched": 1,
"has_more": true
},
"meta": {
"request_id": "req_...",
"scraper": "twitch.clips",
"cached": false,
"credits_charged": 1,
"credits_remaining": 99
}
}What I'd look at first:
view_countand the order. Clips come back most viewed first, soclips[0]is the top moment of the period.creator. That's the viewer who made the clip, not the streamer. Handy if you credit clippers in your video descriptions (you should).video_id,video_offset_secondsandvod_link. They point to the exact second in the source broadcast. Open the VOD a minute before the clip and you get the context the short clip left out.
One gotcha. Those three VOD fields are null when the source VOD has expired or was deleted, which is common for old all_time clips. Write your code for it on day one.
If the channel name is malformed, you get HTTP 400 with "code": "VALIDATION_ERROR" and the message Invalid Twitch channel name. The full list of codes is on the errors page.
Which period should you use?
last_day for daily shorts accounts, last_week for weekly compilations, last_month for recaps, all_time for "best of" videos or for sizing up a channel you've never watched.
Keep in mind that a last_day ranking is a moving target. Views keep landing on fresh clips for hours, so pull the daily list at a fixed time if you want day-to-day numbers you can compare. And when you compare two streamers, use the same period for both.
How do I get past broadcasts, highlights and uploads?
type value | What you get |
|---|---|
archive (default) | Past broadcasts |
highlight | Highlights the streamer saved |
upload | Uploaded videos |
all | All of the above, plus premieres |
That's the Twitch VODs API part of this. limit runs from 1 to 50 and results come newest first, each with title, duration_seconds, view_count, created_at, published_at, thumbnail_url, game and a link to https://www.twitch.tv/videos/<id>. The response also carries total_count (how many videos of that type the channel has) and has_more.
This Node script pulls the last 10 past broadcasts and prints hours streamed per game:
// Node 18+ (built-in fetch). Run: node vods.mjs
const API = "https://api.scrapeeverything.com/v1";
const res = await fetch(`${API}/twitch/videos`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCRAPEEVERYTHING_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ username: "example_streamer", type: "archive", limit: 10 }),
signal: AbortSignal.timeout(90_000),
});
const body = await res.json();
if (!body.success) throw new Error(`${body.code}: ${body.message}`);
const hoursByGame = {};
for (const v of body.data.videos) {
const game = v.game?.name ?? "No category";
hoursByGame[game] = (hoursByGame[game] ?? 0) + (v.duration_seconds ?? 0) / 3600;
}
console.table(hoursByGame);Esports scouts like this one. It shows what a player has actually been streaming lately, which isn't always what the bio says.
What's on the channel card: partner status, followers and live details?
One call returns display_name, description, created_at, is_partner, is_affiliate, follower_count, profile_image_url, banner_image_url and is_live.
The interesting part is what happens around is_live. When the channel is live, stream holds the current broadcast. When it's offline, stream is null and last_broadcast tells you when they last went live:
{
"is_live": false,
"stream": null,
"last_broadcast": {
"started_at": "2026-10-19T18:02:11Z",
"title": "ranked grind, road to top 500",
"game": "Overwatch 2"
}
}A live stream object has id, title, type (live or rerun), viewer_count, started_at and game.
Influencer teams use this as the vetting call: partner or affiliate, follower total, account age, and whether the creator has streamed recently. If all you need from a Twitch channel followers API is the total, this covers it without any token scopes.
How do I build a weekly Twitch top-clips digest?
Say you follow 20 streamers and want each one's top 3 clips from the past week in one CSV every Monday.
- Get 100 free credits by signing in with Google or GitHub. No payment details needed.
- Export your key as
SCRAPEEVERYTHING_API_KEY. - Put your channel names in the
STREAMERSlist below. - Run the script. It writes
digest.csv.
# Python 3.9+, pip install requests
import csv
import os
import requests
API = "https://api.scrapeeverything.com/v1"
HEADERS = {
"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}",
"Content-Type": "application/json",
}
STREAMERS = ["example_streamer", "example_caster", "example_speedrunner"] # up to 20
def top_clips(username, period="last_week", limit=3):
r = requests.post(
f"{API}/twitch/clips",
headers=HEADERS,
json={"username": username, "period": period, "limit": limit, "cache_days": 1},
timeout=90,
)
body = r.json()
if not body.get("success"):
print(f"skip {username}: {body.get('code')} {body.get('message')}")
return []
return body["data"]["clips"]
with open("digest.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["streamer", "title", "views", "seconds", "clipper", "game", "clip", "vod_at_moment"])
for name in STREAMERS:
for c in top_clips(name):
w.writerow([
name,
c["title"],
c["view_count"],
c["duration_seconds"],
(c.get("creator") or {}).get("display_name"),
(c.get("game") or {}).get("name"),
c["link"],
c.get("vod_link") or "",
])
print("wrote digest.csv")The math: 20 streamers at 1 credit each is 20 credits a week. The 100 free credits cover five runs. The $39 Builder pack (25,000 credits) covers 1,250 weekly runs, and credits never expire.
The cache_days: 1 line earns its keep when you rerun the script the same day after fixing a column. A cache hit is free, so the second run costs 0 credits. See the caching docs.
Don't want Python on a cron? The same flow works as an n8n workflow with the n8n-nodes-scrapeeverything node: a Schedule trigger, a loop over your streamer list, the node's Twitch clips endpoint, then Google Sheets or Slack. The node covers all nine platforms, so a weekly creator report can pull Twitch, YouTube and TikTok in one workflow. The agencies use case shows that pattern.
What does a Twitch clips job cost?
Because one call returns up to 50 clips, the cost per clip is small. Here are a few jobs priced at our pack rates (effective price per 1,000 credits; packs are bought whole, starting at $39):
| Job | Credits | Builder ($1.56/1k) | Growth ($1.19/1k) | Scale ($0.90/1k) |
|---|---|---|---|---|
| Weekly top 3 for 20 streamers, one year | 1,040 | $1.62 | $1.24 | $0.94 |
| Daily top 50 for 100 streamers, one month | 3,000 | $4.68 | $3.57 | $2.70 |
| 1,000 clips (20 calls of 50) | 20 | $0.03 | $0.02 | $0.02 |
| Vetting 200 creators: card + 50 clips + 50 VODs each | 600 | $0.94 | $0.71 | $0.54 |
Put plainly: one request returns up to 50 of a channel's most viewed clips for 1 credit, so 1,000 clips cost 20 credits, about $0.03 at the Builder rate. Failed requests are refunded automatically.
Can I download Twitch clips as MP4 with an API?
Not with our endpoint. It returns the clip page link, thumbnail and VOD timestamp, not the video file.
Twitch's official Helix API does have a way. The Helix API reference lists Get Clips Download, which "provides URLs to download the video file(s) for the specified clips." It needs an app or user access token with the editor:manage:clips or channel:manage:clips scope, so in practice it's built for broadcasters and their editors working on their own channel. Twitch's December 2025 clip API announcement also added Create Clip From VOD in open beta and an optional duration parameter on Create Clip.
If you republish clips from other channels, downloading is the easy part. Permission is the hard part (more on that below).
Official Twitch API vs a public-data API: which should you use?
Helix is a good API. If I were building a chat bot or a Twitch extension, I'd use it without a second thought.
The cost is setup. Twitch's getting started guide says you need an OAuth access token for most resources, plus the client ID of an app you register in the developer console. Get Clips accepts an app access token, and getting one takes a single request: per the Twitch authentication docs, you use the client credentials flow.
curl -X POST https://id.twitch.tv/oauth2/token \
-d "client_id=$TWITCH_CLIENT_ID&client_secret=$TWITCH_CLIENT_SECRET&grant_type=client_credentials"People still skip it for boring reasons. Tokens expire and need refreshing, every login needs a Get Users lookup first, and a pipeline that also reads YouTube and TikTok ends up with three auth flows and three error formats. Follower lists are a harder wall: the Get Channel Followers reference requires a user access token with moderator:read:followers, and without it you only get the total.
Here's how I'd choose, by job:
| You want to... | Use |
|---|---|
| Download clip MP4s for your own channel | Helix Get Clips Download (editor:manage:clips or channel:manage:clips) |
| Create clips from a stream or VOD | Helix Create Clip / Create Clip From VOD |
| Top clips across a whole game | Helix Get Clips with game_id |
| Every clip a channel ever had | Helix Get Clips, up to 100 per page with an after cursor |
| Clips in a custom date range | Helix Get Clips with started_at / ended_at |
| Chat, subscriptions, moderation, EventSub | Helix, with the right scopes |
| Top clips for a list of channels by login, no app, in a pipeline that also hits YouTube and TikTok | Scrape Everything twitch.clips |
| Live status and follower total for vetting | Either. Ours skips the token and the login-to-ID lookup |
On cost, Helix has no per-request fee but runs on a points bucket (see Twitch's rate limits guide). Ours is credits, from $1.56 per 1k on Builder down to $0.90 per 1k on Scale. Our own rate limits are 60 requests per minute with 5 concurrent on a free account, rising to 300 per minute with 20 concurrent once your purchases total $39 or more.
Our take: if Twitch is your only source and you're fine handling tokens, use Helix. If Twitch is one source of several, one key, one error envelope and one meta.credits_charged field to log beats three SDKs. For how scraping APIs price this kind of work, see our social media scraping API pricing comparison. If YouTube is next on your list, the YouTube transcript API guide and the TikTok scraper API guide use the same request shape.
What can't the Twitch clips API do?
- Go past 50 items. We tried paging further. Twitch's integrity check rejects the cursor request for the next page from logged-out clients, so we stop at one page instead of faking depth with retries.
has_more: truemeans older items exist, not that you can fetch them. - Filter by game. There's no "top Valorant clips this week" across all channels. That's Helix
game_id. - Look up a single clip by URL or slug.
- Return video files (see the download section).
- Read chat logs or the live chat stream. Use Twitch's own APIs.
- List followers. You get the total, not who they are.
- See anything behind a login. Public data only, what a logged-out visitor sees on twitch.tv, so no subscriber-only VODs.
- Speak for Twitch. Scrape Everything isn't affiliated with or endorsed by Twitch.
Clips are made by viewers and belong to the streamer's channel. If you republish them, follow Twitch's terms and get the streamer's permission. We cover the legal side in is scraping public social media data legal, and that post doesn't replace a lawyer either.
FAQ
Can I get a Twitch channel's top clips without a developer app?
Yes. The twitch.clips endpoint returns the most viewed clips for the last day, week, month or all time with only a Scrape Everything API key. No Twitch client ID or OAuth token.
How many clips can I get per request?
Up to 50, most viewed first, set with limit. The default is 20. We don't fetch later pages because Twitch rejects that request for logged-out clients.
Can I download Twitch clips with an API?
Not with ours; it returns the clip link, thumbnail and VOD timestamp. Twitch's Helix API has Get Clips Download, which returns download URLs and needs a token with the editor:manage:clips or channel:manage:clips scope.
Can I get top clips for a game instead of a channel?
Not with our endpoint, which works per channel. Helix Get Clips accepts a game_id and returns clips from streams playing that game.
Does the Twitch VODs API include highlights and uploads?
Yes. Set type to archive for past broadcasts, highlight, upload, or all, which also includes premieres. Up to 50 videos per request, newest first.
Can I get Twitch chat or a full list of followers?
No. Chat isn't covered, and the channel endpoint gives the total follower_count only. For follower lists, Helix requires a user access token with the moderator:read:followers scope.
Try it on your own channel list
Pick three streamers you already follow and run the clips request with period: "last_week" for each. That's three requests, 3 of your 100 free credits. Check whether the top result matches what you remember from the week; if it doesn't, you just found a clip you missed. Get 100 free credits and keep the Twitch endpoint reference open while you go. Each call costs 1 credit, and credit packs start at $39 for 25,000 credits on the pricing page.