Skip to main content

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

GET /api/twitch/user

Query Parameters

login
string
required
Twitch username.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/user?login=ninja" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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);
Python
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

GET /api/twitch/user/id

Query Parameters

id
string
required
numeric Twitch user ID.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/user/id?id=19571641" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

GET /api/twitch/stream

Query Parameters

user_login
string
required
Twitch username to check for a live stream.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/stream?user_login=ninja" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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;
Python
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

first
number
default:"20"
Number of streams. Maximum: 100.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/streams/top?first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

GET /api/twitch/channel

Query Parameters

broadcaster_id
string
required
numeric broadcaster ID. Use the id field from the Get User endpoint.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/channel?broadcaster_id=19571641" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

query
string
required
Search query string.
first
number
default:"20"
Number of results. Maximum: 100.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/channels/search?query=fortnite&first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

broadcaster_id
string
required
numeric broadcaster ID.
first
number
default:"20"
Number of follower records.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/followers?broadcaster_id=19571641&first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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
Python
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

GET /api/twitch/clips

Query Parameters

broadcaster_id
string
required
numeric broadcaster ID.
first
number
default:"20"
Number of clips. Maximum: 100.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/clips?broadcaster_id=19571641&first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

GET /api/twitch/videos

Query Parameters

user_id
string
required
numeric Twitch user ID.
first
number
default:"20"
Number of videos. Maximum: 100.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/videos?user_id=19571641&first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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

TypeDescription
archiveFull stream VOD saved automatically
highlightManually clipped highlight from a VOD
uploadManually uploaded video

Get Game

Get a game by name or ID.

Endpoint

GET /api/twitch/game

Query Parameters

name
string
exact game name.
id
string
Twitch game ID.
At least one of name or id is required.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/game?name=Fortnite" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
const response = await fetch('https://ruins.rive.wtf/api/twitch/game?name=Fortnite', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const data = await response.json();
Python
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

first
number
default:"20"
Number of games. Maximum: 100.

Example Request

cURL
curl -X GET "https://ruins.rive.wtf/api/twitch/games/top?first=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
JavaScript
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();
Python
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="
  }
}