Channel points
With the redemptions:manage scope, your app can work a channel's reward queue: read the rewards, see what viewers redeemed, mark redemptions done or give the points back, and drop chests.
To hear about redemptions as they happen, also ask for events:read: every redemption arrives on EventSub as channel.channel_points_custom_reward_redemption.add, whose id is the redemption id you resolve here. See event types.
Rewards
GET /api/apps/channels/{channelId}/rewards lists the channel's active rewards, in the order the creator set.
{
"success": true,
"rewards": [
{
"id": "8d1e5b2a-4c3f-4e70-9a61-2f0b7c9d4e18",
"title": "Song request",
"kind": "custom",
"cost": 500,
"prompt": "Artist and song",
"requires_input": true,
"is_paused": false,
"auto_fulfil": false,
"cooldown_seconds": 60,
"per_stream_limit": null,
"per_user_per_stream_limit": 3,
"live_only": false,
"background_color": "#7c3aed",
"image_url": null,
"redeem_count": 142
}
]
}
A channel that has channel points turned off answers 404.
Redemptions
GET /api/apps/channels/{channelId}/redemptions returns what's still owed (status=pending, the default), oldest first. With status=resolved it returns the recent history instead, newest first.
{
"success": true,
"redemptions": [
{
"id": "3b7f0d9c-1e4a-4c26-8b5d-a9e2f6c1d047",
"reward_id": "8d1e5b2a-4c3f-4e70-9a61-2f0b7c9d4e18",
"reward_title": "Song request",
"cost": 500,
"user_input": "Daft Punk – One More Time",
"status": "pending",
"created_at": "2026-10-11T20:41:07Z",
"viewer": { "id": "1f9a3b6c-…", "username": "pixelpanda", "display_name": "Pixel Panda", "avatar_url": "https://…" }
}
]
}
status is pending, accepted, completed or rejected.
Accept, complete or reject
POST /api/apps/channels/{channelId}/redemptions/{redemptionId} with {"action": …}:
| Action | Does | Works on |
|---|---|---|
accept | Acknowledge it. It stays in the queue as accepted. | pending |
complete | Mark it done. | pending, accepted |
reject | Give the viewer their points back. | pending, accepted |
curl -X POST https://api.thexive.com/api/apps/channels/CHANNEL_ID/redemptions/REDEMPTION_ID \
-H "Authorization: Bearer $XIVE_APP_SECRET" \
-H "Content-Type: application/json" \
-d '{"action": "complete"}'
{ "success": true, "status": "fulfilled", "display_status": "completed" }
Use display_status; it matches the status words in the list. A redemption that has already been completed or rejected (by your app, the creator or another tool) answers 409, and the points are only ever refunded once.
Chests
POST /api/apps/channels/{channelId}/chests drops a community chest in a live channel, the same as the creator's “Drop a chest” button. Viewers who open it share the reward.
{
"success": true,
"chest": { "id": "…", "kind": "community", "golden": false, "surge": false, "amount": 250, "until": "2026-10-11T21:06:00Z", "opened": 0, "target": 10 }
}
400 when channel points are off, the channel isn't live, or a chest dropped a couple of minutes ago.