Stream & raids
With the channel:manage scope, your app can do what a creator does from the stream manager: change the title and category, and send viewers to another channel at the end of a stream.
These calls go through the same code as the creator's own stream manager. The same content filter, limits and cooldowns apply, and the result is what the creator would have got doing it themselves.
Title and category
PATCH /api/apps/channels/{channelId}/stream
| Body field | Notes |
|---|---|
title | Optional, up to 120 characters. Checked by the content filter. Leave it out to keep the current title. |
category_slug | Optional. A category's slug from category search. Leave it out to keep the current category. |
Send at least one of them. Leaving out title keeps the current one; a channel that has never had a title answers 400 until you send one.
curl -X PATCH https://api.thexive.com/api/apps/channels/CHANNEL_ID/stream \
-H "Authorization: Bearer $XIVE_APP_SECRET" \
-H "Content-Type: application/json" \
-d '{"title": "Ranked grind to Diamond 💎", "category_slug": "valorant"}'
{
"success": true,
"stream_id": "c71d0f2a-8b3e-4a19-b5d6-0e4f9a2c7b18",
"title": "Ranked grind to Diamond 💎",
"category": "VALORANT",
"category_id": 126459,
"twitch_title_synced": false,
"kick_title_synced": false,
"twitch_category_synced": false,
"kick_category_synced": false
}
- The change is live straight away: on the channel page, in the browse list, and as
channel.updateon EventSub. - If the creator has connected Twitch or Kick for rebroadcasting, the title and category follow there too. The
*_title_syncedand*_category_syncedfields say whether each did. The category only syncs when Xive can match it exactly to a Twitch or Kick category; otherwise the other platform's category is left as it was. - It works whether or not the channel is live. A channel that has never streamed on Xive gets
409.
Raids
POST /api/apps/channels/{channelId}/raids sends the channel's viewers to another channel that is live right now.
| Body field | Notes |
|---|---|
target_channel_id | The channel to raid (a profile id). |
target_username | Or its username. Send one of the two. |
curl -X POST https://api.thexive.com/api/apps/channels/CHANNEL_ID/raids \
-H "Authorization: Bearer $XIVE_APP_SECRET" \
-H "Content-Type: application/json" \
-d '{"target_username": "pixelpanda"}'
{
"success": true,
"raid": {
"id": "5a0c2e71-9f3b-4d68-a1e4-7b2d9c0f6e35",
"source_stream_id": "c71d0f2a-8b3e-4a19-b5d6-0e4f9a2c7b18",
"target_stream_id": "0e8b4d2f-3c1a-4b97-8e65-d4a2f1c0b739",
"viewer_count": 214,
"created_at": "2026-10-11T21:04:00Z"
}
}
The answer is 201. Viewers in the channel are offered the move, and the target channel gets a raid event with the viewer count.
| Status | When |
|---|---|
400 | No target, or the channel raiding itself. |
409 | The channel isn't live, the target isn't live, or the channel already raided that target this broadcast. |
429 | A raid was started less than a minute ago. |
Clips
POST /api/apps/channels/{channelId}/clips saves the last 30 seconds of the channel's live stream as a clip, the same as a viewer pressing Clip on the watch page. It takes a few seconds: allow up to 60 before you time out.
| Body field | Notes |
|---|---|
duration | Optional. 5 to 60 seconds; 30 when left out. |
title | Optional. Up to 100 characters; the stream title when left out. |
clipper_username | Optional. The chatter who asked for the clip (a !clip command, say). The clip is credited to them, and the channel's who-may-clip setting and their own rate limit apply to them. |
curl -X POST https://api.thexive.com/api/apps/channels/CHANNEL_ID/clips \
-H "Authorization: Bearer $XIVE_APP_SECRET" \
-H "Content-Type: application/json" \
-d '{"clipper_username": "pixelpanda"}'
The answer is 201 with the clip: its id, slug, title, the MP4 url, thumbnail_url, duration_seconds and share_path. Share it as https://thexive.com followed by share_path. The channel also gets a channel.clip event.
| Status | When |
|---|---|
403 | The credited chatter isn't allowed to clip this channel. error says why, in a sentence you can post to chat. |
409 | The channel isn't live, or its recording isn't ready to clip yet. |
429 | Clipping too fast. Try again in a few seconds. |
502 | The clip could not be cut. Try again. |
Good practice
- Only change the title or category when the creator asked your app to, for example with a mod-only chat command or a setting in your dashboard.
- Don't raid on a timer or without the creator choosing to. A raid moves their audience.