Documentation Index Fetch the complete documentation index at: https://ruins.docs.rive.wtf/llms.txt
Use this file to discover all available pages before exploring further.
Every API key is tied to one IP . To apply for a key, DM southctrl on Discord.
Use the endpoint path below, replace the required params, and send Authorization: Bearer YOUR_API_KEY.
Most Used Endpoints
User Look up a Twitch user by login
Stream Check whether a user is live
Clips Get recent clips for a channel
Videos Fetch archived videos and uploads
If you only need channel basics, use user. For live status, use stream. For media browsing, go to clips or videos.
Get User
Get a Twitch user by their login name.
Endpoint
Query Parameters
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/user?login=ninja" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/user?login=ninja' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
console . log ( data );
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/user' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'login' : 'ninja' }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "19571641" ,
"login" : "ninja" ,
"display_name" : "Ninja" ,
"type" : "" ,
"broadcaster_type" : "partner" ,
"description" : "Just want to make people happy." ,
"profile_image_url" : "https://static-cdn.jtvnw.net/...-profile_image-300x300.png" ,
"offline_image_url" : "https://static-cdn.jtvnw.net/...-channel_offline_image-1920x1080.png" ,
"view_count" : 0 ,
"created_at" : "2011-01-16T04:31:20Z"
}
]
}
Get User by ID
Get a Twitch user by their numeric ID.
Endpoint
Query Parameters
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/user/id?id=19571641" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/user/id?id=19571641' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/user/id' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'id' : '19571641' }
)
print (response.json())
Get Stream
Get live stream data for a user. Returns an empty data array if the user is offline.
Endpoint
Query Parameters
Twitch username to check for a live stream.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/stream?user_login=ninja" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/stream?user_login=ninja' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
const isLive = data . data . length > 0 ;
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/stream' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'user_login' : 'ninja' }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "318129150553" ,
"user_id" : "19571641" ,
"user_login" : "ninja" ,
"user_name" : "Ninja" ,
"game_id" : "464339927" ,
"game_name" : "ARC Raiders" ,
"type" : "live" ,
"title" : "BIG FRIDAY GAMING LETS GET SOME GOOP" ,
"viewer_count" : 2955 ,
"started_at" : "2026-03-13T12:40:59Z" ,
"language" : "en" ,
"thumbnail_url" : "https://static-cdn.jtvnw.net/previews-ttv/live_user_ninja-{width}x{height}.jpg" ,
"tags" : [ "English" , "DropsEnabled" ],
"is_mature" : false
}
],
"pagination" : {
"cursor" : "eyJiIjp7..."
}
}
If the user is offline, data will be an empty array [].
Get Top Streams
Get the most-watched live streams on Twitch right now.
Endpoint
GET /api/twitch/streams/top
Query Parameters
Number of streams. Maximum: 100.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/streams/top?first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/streams/top?first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/streams/top' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'first' : 5 }
)
print (response.json())
Get Channel
Get channel information for a broadcaster.
Endpoint
Query Parameters
numeric broadcaster ID. Use the id field from the Get User endpoint.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/channel?broadcaster_id=19571641" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/channel?broadcaster_id=19571641' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/channel' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'broadcaster_id' : '19571641' }
)
print (response.json())
Example Response
{
"data" : [
{
"broadcaster_id" : "19571641" ,
"broadcaster_login" : "ninja" ,
"broadcaster_name" : "Ninja" ,
"broadcaster_language" : "en" ,
"game_id" : "464339927" ,
"game_name" : "ARC Raiders" ,
"title" : "BIG FRIDAY GAMING LETS GET SOME GOOP" ,
"delay" : 0 ,
"tags" : [ "English" , "DropsEnabled" ],
"is_branded_content" : false ,
"content_classification_labels" : []
}
]
}
Search Channels
Search for channels by name or keyword.
Endpoint
GET /api/twitch/channels/search
Query Parameters
Number of results. Maximum: 100.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/channels/search?query=fortnite&first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/channels/search?query=fortnite&first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/channels/search' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'query' : 'fortnite' , 'first' : 5 }
)
print (response.json())
Get Followers
Get the follower count and most recent followers for a broadcaster.
Endpoint
GET /api/twitch/followers
Query Parameters
Number of follower records.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/followers?broadcaster_id=19571641&first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/followers?broadcaster_id=19571641&first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
console . log ( data . total ); // total follower count
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/followers' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'broadcaster_id' : '19571641' , 'first' : 5 }
)
print (response.json())
Example Response
{
"total" : 19265523 ,
"data" : [],
"pagination" : {
"cursor" : null
}
}
total always reflects the full follower count regardless of the first parameter. data array may be empty if the broadcaster has restricted follower visibility.
Get Clips
Get the top clips for a broadcaster.
Endpoint
Query Parameters
Number of clips. Maximum: 100.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/clips?broadcaster_id=19571641&first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/clips?broadcaster_id=19571641&first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/clips' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'broadcaster_id' : '19571641' , 'first' : 5 }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "IcyBreakableDelicataTooSpicy-RnrKLybQI3W9K_AD" ,
"url" : "https://www.twitch.tv/ninja/clip/IcyBreakableDelicataTooSpicy-RnrKLybQI3W9K_AD" ,
"embed_url" : "https://clips.twitch.tv/embed?clip=IcyBreakableDelicataTooSpicy-RnrKLybQI3W9K_AD" ,
"broadcaster_id" : "19571641" ,
"broadcaster_name" : "Ninja" ,
"creator_id" : "206880681" ,
"creator_name" : "sSaintPablo" ,
"video_id" : "994448370" ,
"game_id" : "509658" ,
"language" : "en" ,
"title" : "Ninja Reenacting Chalk Board Egirls" ,
"view_count" : 310538 ,
"created_at" : "2021-04-20T18:22:14Z" ,
"thumbnail_url" : "https://static-cdn.jtvnw.net/twitch-clips/...-preview-480x272.jpg" ,
"duration" : 25.9 ,
"is_featured" : false
}
],
"pagination" : {
"cursor" : "eyJiIjpudWxsLCJhIjp7..."
}
}
Get Videos
Get recent VODs and highlights for a user.
Endpoint
Query Parameters
Number of videos. Maximum: 100.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/videos?user_id=19571641&first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/videos?user_id=19571641&first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/videos' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'user_id' : '19571641' , 'first' : 5 }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "2721186267" ,
"stream_id" : "318129150553" ,
"user_id" : "19571641" ,
"user_login" : "ninja" ,
"user_name" : "Ninja" ,
"title" : "BIG FRIDAY GAMING LETS GET SOME GOOP" ,
"description" : "" ,
"created_at" : "2026-03-13T12:41:05Z" ,
"published_at" : "2026-03-13T12:41:05Z" ,
"url" : "https://www.twitch.tv/videos/2721186267" ,
"thumbnail_url" : "https://vod-secure.twitch.tv/_404/404_processing_%{width}x%{height}.png" ,
"viewable" : "public" ,
"view_count" : 62 ,
"language" : "en" ,
"type" : "archive" ,
"duration" : "1h54m59s" ,
"muted_segments" : null
}
],
"pagination" : {
"cursor" : "eyJiIjpudWxsLCJhIjp7..."
}
}
Video Types
Type Description archiveFull stream VOD saved automatically highlightManually clipped highlight from a VOD uploadManually uploaded video
Get Game
Get a game by name or ID.
Endpoint
Query Parameters
At least one of name or id is required.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/game?name=Fortnite" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/game?name=Fortnite' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/game' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'name' : 'Fortnite' }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "33214" ,
"name" : "Fortnite" ,
"box_art_url" : "https://static-cdn.jtvnw.net/ttv-boxart/33214-{width}x{height}.jpg" ,
"igdb_id" : "1905"
}
]
}
Get Top Games
Get the most-watched game categories on Twitch right now.
Endpoint
GET /api/twitch/games/top
Query Parameters
Number of games. Maximum: 100.
Example Request
curl -X GET "https://ruins.rive.wtf/api/twitch/games/top?first=5" \
-H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch ( 'https://ruins.rive.wtf/api/twitch/games/top?first=5' , {
headers: { 'Authorization' : 'Bearer YOUR_API_KEY' }
});
const data = await response . json ();
import requests
response = requests.get(
'https://ruins.rive.wtf/api/twitch/games/top' ,
headers = { 'Authorization' : 'Bearer YOUR_API_KEY' },
params = { 'first' : 5 }
)
print (response.json())
Example Response
{
"data" : [
{
"id" : "509658" ,
"name" : "Just Chatting" ,
"box_art_url" : "https://static-cdn.jtvnw.net/ttv-boxart/509658-{width}x{height}.jpg" ,
"igdb_id" : ""
},
{
"id" : "32399" ,
"name" : "Counter-Strike" ,
"box_art_url" : "https://static-cdn.jtvnw.net/ttv-boxart/32399-{width}x{height}.jpg" ,
"igdb_id" : ""
}
],
"pagination" : {
"cursor" : "eyJzIjo1LCJkIjpmYWxzZSwidCI6dHJ1ZX0="
}
}