Users & channels
Public lookups your app can make with any valid secret. They don't need a channel or a scope, and they only return what anyone could see on Xive while signed out. The per-channel ones work for any channel, not just channels that added your app; an unknown, banned or deleted channel answers 404.
Users
GET /api/apps/users?login=…&id=… looks people up by username or profile id. Both take a comma-separated list; up to 25 in total per call.
curl "https://api.thexive.com/api/apps/users?login=pixelpanda,nightowl" \ -H "Authorization: Bearer $XIVE_APP_SECRET"
{
"success": true,
"users": [
{ "id": "1f9a3b6c-7d2e-4c80-b5a4-e6f0d1c2b3a9", "username": "pixelpanda", "display_name": "Pixel Panda", "avatar_url": "https://…", "is_verified": false }
]
}
Names that don't exist, and accounts that are suspended or deleted, are simply left out. A user's id is the same id as user_id on chat messages and channel_id for their channel.
Live channels
GET /api/apps/streams/live lists the channels live right now, in the same order as the browse page.
{
"success": true,
"streams": [
{
"channel_id": "3e0b8a51-2f4c-4f8e-9a6d-1b7c5e2d9f04",
"username": "nightowl",
"display_name": "Night Owl",
"avatar_url": "https://…",
"stream_id": "c71d0f2a-8b3e-4a19-b5d6-0e4f9a2c7b18",
"title": "Chill drawing stream",
"category": "Art",
"category_slug": "art",
"viewer_count": 87,
"started_at": "2026-10-11T18:00:00.000Z",
"thumbnail_url": "https://…"
}
]
}
Useful for picking a raid target, or for a “who's live” command. Don't poll it more than once a minute.
Categories
GET /api/apps/categories?q=…&limit=… searches the category catalogue; without q it returns the most popular. limit defaults to 20, max 50.
curl "https://api.thexive.com/api/apps/categories?q=minecraft&limit=3" \ -H "Authorization: Bearer $XIVE_APP_SECRET"
{
"success": true,
"categories": [
{ "slug": "minecraft-java-edition", "name": "Minecraft: Java Edition", "kind": "game", "cover_url": "https://…", "live_stream_count": 2 }
]
}
Pass a slug to the title and category update.
Goals
GET /api/apps/channels/{channelId}/goals: the channel's active public goals (up to 6).
{
"success": true,
"goals": [
{ "id": "bab4…", "type": "follower", "title": "Road to 250", "current": 34, "target": 250, "percent": 14, "completed": false, "starts_at": "2026-08-17T00:02:15.875Z", "ends_at": null, "completed_at": null, "reward_text": null }
]
}
type is follower (current = total followers), subscription (subs), spark (Sparks) or support (current and target in cents).
Replays
GET /api/apps/channels/{channelId}/replays?limit=… (1 – 50, default 20): the channel's published past broadcasts, newest first, as on its channel page.
{
"success": true,
"replays": [
{ "stream_id": "f34e…", "session_id": "15b4…", "title": "Spooky Sunday", "category": "RedM", "category_slug": "redm", "started_at": "2026-10-11T15:15:14Z", "ended_at": "2026-10-11T19:02:40Z", "thumbnail_url": "https://…", "watch_url": "https://thexive.com/stream/f34e…?replay=1&session=15b4…" }
]
}
Link viewers to watch_url; video files aren't available through the API.
Schedule
GET /api/apps/channels/{channelId}/schedule: the weekly schedule from the channel page, and the next announced stream.
{
"success": true,
"next_show_at": "2026-10-13T15:43:01.477Z",
"timezone": "America/Chicago",
"weekly": [ { "day": "mon", "start": "15:00", "end": "22:00", "label": "Games" } ]
}
next_show_at is null when nothing is announced. start and end are local times in timezone.
Supporter tiers
GET /api/apps/channels/{channelId}/supporter-tiers: the supporter tier ladder, lowest first. key is the tier_key a channel.supporter_tier event carries, so you can let a creator set a value for each tier before anyone reaches it.
{
"success": true,
"tiers": [ { "key": "bronze", "label": "Bronze", "minimum_lifetime_sparks": "500" } ]
}
This lists the tiers only, never who holds them. Today every channel has the same ladder.
Subscriber total
GET /api/apps/channels/{channelId}/subscriptions (events:read): how many active subscribers the channel has, like the total in Twitch's Get Broadcaster Subscriptions.
{ "success": true, "total": 42 }
It goes down when a subscription lapses, which no event tells you, so poll it (every few minutes is plenty) to keep a sub goal accurate. It's a count only; who subscribes isn't available.