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": …}:

ActionDoesWorks on
acceptAcknowledge it. It stays in the queue as accepted.pending
completeMark it done.pending, accepted
rejectGive 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.