curl --request GET \
--url https://api.scraperize.com/v1/twitch/user/videos \
--header 'x-api-key: <api-key>'import requests
url = "https://api.scraperize.com/v1/twitch/user/videos"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.scraperize.com/v1/twitch/user/videos', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scraperize.com/v1/twitch/user/videos",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scraperize.com/v1/twitch/user/videos"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scraperize.com/v1/twitch/user/videos")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scraperize.com/v1/twitch/user/videos")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"channel": {
"handle": "ishowspeed",
"url": "https://www.twitch.tv/ishowspeed"
},
"videos": [
{
"id": "2891015835",
"url": "https://www.twitch.tv/videos/2891015835",
"title": "Highlight: RONALDO RETIRED??? + SPEED VS EKITIKE 🇫🇷⚽️",
"type": "HIGHLIGHT",
"durationSeconds": 4267,
"viewCount": 2064,
"publishedAt": "2026-10-03T19:16:15Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784//thumb/thumb2891015835-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784/storyboards/2891015835-strip-0.jpg"
},
{
"id": "2890898173",
"url": "https://www.twitch.tv/videos/2890898173",
"title": "RONALDO RETIRED??? + SPEED VS EKITIKE 🇫🇷⚽️",
"type": "ARCHIVE",
"durationSeconds": 11122,
"viewCount": 556155,
"publishedAt": "2026-10-03T17:11:49Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/a5e92c0842e6396d041e_ishowspeed_320496447582_1791047505//thumb/thumb0-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/a5e92c0842e6396d041e_ishowspeed_320496447582_1791047505/storyboards/2890898173-strip-0.jpg"
},
{
"id": "2876010826",
"url": "https://www.twitch.tv/videos/2876010826",
"title": "PLAYING FC PARK",
"type": "HIGHLIGHT",
"durationSeconds": 3082,
"viewCount": 8189,
"publishedAt": "2026-09-16T21:14:06Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/ccc00b93d165b0485380_ishowspeed_33166857314_8934430343//thumb/thumb2876010826-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/ccc00b93d165b0485380_ishowspeed_33166857314_8934430343/storyboards/2876010826-strip-0.jpg"
}
],
"count": 49,
"hasMore": false,
"fetchedAt": "2026-10-05T14:46:46.285Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "API key required — pass it in the `x-api-key` header.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "This request costs 1 credit, but your balance is 0. Top up to continue.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested content was not found (it may not exist, be deleted, or be private).",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"details": [
{
"path": "url",
"message": "Required"
}
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded — max 100 requests per 60s. Retry in ~30s.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "UPSTREAM_BLOCKED",
"message": "The source is temporarily unavailable. Please try again shortly.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}Channel videos
Fetches a Twitch channel’s public videos by username and returns them as clean JSON — each video with its id, url, title, type, duration, view count, published date, game, and thumbnail (still + animated). Optionally filter by video type and sort by newest or most-viewed. Returns up to 100 videos in one call; hasMore tells you when the channel has still more. Only publicly available data is returned.
curl --request GET \
--url https://api.scraperize.com/v1/twitch/user/videos \
--header 'x-api-key: <api-key>'import requests
url = "https://api.scraperize.com/v1/twitch/user/videos"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.scraperize.com/v1/twitch/user/videos', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scraperize.com/v1/twitch/user/videos",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.scraperize.com/v1/twitch/user/videos"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.scraperize.com/v1/twitch/user/videos")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scraperize.com/v1/twitch/user/videos")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"channel": {
"handle": "ishowspeed",
"url": "https://www.twitch.tv/ishowspeed"
},
"videos": [
{
"id": "2891015835",
"url": "https://www.twitch.tv/videos/2891015835",
"title": "Highlight: RONALDO RETIRED??? + SPEED VS EKITIKE 🇫🇷⚽️",
"type": "HIGHLIGHT",
"durationSeconds": 4267,
"viewCount": 2064,
"publishedAt": "2026-10-03T19:16:15Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784//thumb/thumb2891015835-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784/storyboards/2891015835-strip-0.jpg"
},
{
"id": "2890898173",
"url": "https://www.twitch.tv/videos/2890898173",
"title": "RONALDO RETIRED??? + SPEED VS EKITIKE 🇫🇷⚽️",
"type": "ARCHIVE",
"durationSeconds": 11122,
"viewCount": 556155,
"publishedAt": "2026-10-03T17:11:49Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/a5e92c0842e6396d041e_ishowspeed_320496447582_1791047505//thumb/thumb0-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/a5e92c0842e6396d041e_ishowspeed_320496447582_1791047505/storyboards/2890898173-strip-0.jpg"
},
{
"id": "2876010826",
"url": "https://www.twitch.tv/videos/2876010826",
"title": "PLAYING FC PARK",
"type": "HIGHLIGHT",
"durationSeconds": 3082,
"viewCount": 8189,
"publishedAt": "2026-09-16T21:14:06Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/ccc00b93d165b0485380_ishowspeed_33166857314_8934430343//thumb/thumb2876010826-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/ccc00b93d165b0485380_ishowspeed_33166857314_8934430343/storyboards/2876010826-strip-0.jpg"
}
],
"count": 49,
"hasMore": false,
"fetchedAt": "2026-10-05T14:46:46.285Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "API key required — pass it in the `x-api-key` header.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "This request costs 1 credit, but your balance is 0. Top up to continue.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested content was not found (it may not exist, be deleted, or be private).",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"details": [
{
"path": "url",
"message": "Required"
}
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded — max 100 requests per 60s. Retry in ~30s.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}{
"error": {
"code": "UPSTREAM_BLOCKED",
"message": "The source is temporarily unavailable. Please try again shortly.",
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f"
}
}cache_max_age) are free.Copy for AI assistant
Copy for AI assistant
I want to make an API call to /v1/twitch/user/videos. Here are the details:
Endpoint: GET https://api.scraperize.com/v1/twitch/user/videos
Description: Fetches a Twitch channel's public videos by username and returns them as clean JSON — each video with its id, url, title, type, duration, view count, published date, game, and thumbnail (still + animated). Optionally filter by video type and sort by newest or most-viewed. Returns up to 100 videos in one call; `hasMore` tells you when the channel has still more. Only publicly available data is returned.
Required Headers:
- x-api-key: Your API key
Parameters:
- handle (string) [required]: The Twitch username (channel handle), e.g. `ishowspeed`.
- filterBy (select): Restrict to a video type: `ARCHIVE` (past broadcasts), `HIGHLIGHT`, or `UPLOAD`. Omit for all types.
- sortBy (select): Sort order: `TIME` (newest first, default) or `VIEWS` (most viewed).
- cache_max_age (select): Optional. Return a cached result if one this age or newer exists — served for **0 credits** with `meta.cached=true` and `meta.cachedAt`. Otherwise a fresh scrape runs (**1 credit**) and refreshes the cache. Omit to always scrape fresh.
Example Response:
{
"data": {
"channel": {
"handle": "ishowspeed",
"url": "https://www.twitch.tv/ishowspeed"
},
"videos": [
{
"id": "2891015835",
"url": "https://www.twitch.tv/videos/2891015835",
"title": "Highlight: RONALDO RETIRED??? + SPEED VS EKITIKE 🇫🇷⚽️",
"type": "HIGHLIGHT",
"durationSeconds": 4267,
"viewCount": 2064,
"publishedAt": "2026-10-03T19:16:15Z",
"game": {
"id": "509658",
"name": "Just Chatting",
"slug": "just-chatting",
"boxArtUrl": "https://static-cdn.jtvnw.net/ttv-boxart/509658-144x192.jpg"
},
"thumbnailUrl": "https://static-cdn.jtvnw.net/cf_vods/d2vi6trrdongqn/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784//thumb/thumb2891015835-320x180.jpg",
"animatedThumbnailUrl": "https://d2vi6trrdongqn.cloudfront.net/e3eb4c976dfe1c972c78_ishowspeed_52655563137_4873771784/storyboards/2891015835-strip-0.jpg"
}
],
"count": 49,
"hasMore": false,
"fetchedAt": "2026-10-05T14:46:46.285Z"
},
"meta": {
"requestId": "req_8f0c2b7e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
"creditsCharged": 1,
"creditsRemaining": 4999,
"cached": false
}
}
Please help me write code in my preferred programming language to make this API call and handle the response appropriately. Include error handling and best practices.
Authorizations
Your API key. Send it in the x-api-key header (or Authorization: Bearer <key>). Create and manage keys from your dashboard.
Query Parameters
The Twitch username (channel handle), e.g. ishowspeed.
Restrict to a video type: ARCHIVE (past broadcasts), HIGHLIGHT, or UPLOAD. Omit for all types.
ARCHIVE, HIGHLIGHT, UPLOAD Sort order: TIME (newest first, default) or VIEWS (most viewed).
TIME, VIEWS Optional. Return a cached result if one this age or newer exists — served for 0 credits with meta.cached=true and meta.cachedAt. Otherwise a fresh scrape runs (1 credit) and refreshes the cache. Omit to always scrape fresh.
1d, 3d, 7d, 14d, 30d