Reference
API reference
Every endpoint on api.velora.tv that is documented for outside use, grouped by what you are actually doing — acting for a streamer, reading the public catalogue, or managing your own app. Most rows name the scope they need in the description; if a row says public, it answers without a token.
This page is maintained by hand and covers the whole surface, public reads included. What your app can call is generated from the API source at build time and lists only the endpoints that accept a third-party OAuth token. Where the two disagree, trust the generated page — and check the scope before assuming a 403 is a bug.
Before you call anything
Base URL
https://api.velora.tvAuthorization header
Authorization: Bearer YOUR_TOKENMost endpoints require a valid access token on that header. The ones marked public do not, and will answer an unauthenticated request.
Prefer to poke at it live? The interactive API explorer runs real calls in the browser with full request and response schemas.
Acting on behalf of a streamer
These take a user’s OAuth access token and act as that person. The scope you hold is exactly the permission you have — this is the surface you build an OBS dock, a chat bot or an overlay against.
OAuth & Authentication
Getting a token in the first place. Start here before any endpoint below will answer you.
/api/developer/oauth/authorizePreview authorization (get app info for consent page)
/api/developer/oauth/authorizeComplete authorization (exchange consent for code)
/api/developer/oauth/tokenExchange code for access token or refresh token
/api/developer/oauth/scopesList all available OAuth scopes
Streaming Integration (OAuth)
Endpoints for streaming software like OBS and Meld Studio. Requires OAuth access token.
/api/integrations/oauth/stream/setupGet stream key and ingest URLs (requires stream:key)
/api/integrations/oauth/stream/infoGet current stream info, including stream tags, channel tags and content warnings (requires stream:read)
/api/integrations/oauth/stream/infoNewUpdate stream title, category, stream tags and channel tags (requires stream:write)
/api/integrations/oauth/stream/categoriesList available stream categories
/api/integrations/oauth/stream/tagsNewList the tag vocabulary with tiers, content-warning flags and the tag limits (requires stream:read)
/api/integrations/oauth/stream/key/regenerateRegenerate stream key (requires stream:key)
Chat
Endpoints for reading and interacting with chat. Perfect for OBS docks, chat bots, and overlays.
/api/chat/channels/:channelId/historyGet recent chat messages (public, no auth required - max 100 messages)
/api/integrations/oauth/chat/settingsYour channel's chat modes: slowMode, slowModeSeconds, followersOnly, subscribersOnly, emoteOnly (requires stream:read)
/api/integrations/oauth/chat/settingsTurn chat modes on or off. Applies to live chat immediately, like the web chat toggles. Send only the fields to change; e.g. a raid shield is { followersOnly: true, slowMode: true, slowModeSeconds: 30 } (requires stream:write)
Request body — JSON
slowModebooleanoptionalfalse also resets the delay to 0; true with no delay set uses 10 seconds
slowModeSecondsintegeroptionalSeconds between a viewer's messages
followersOnlybooleanoptionalOnly followers can chat
subscribersOnlybooleanoptionalOnly subscribers can chat
emoteOnlybooleanoptionalOnly emotes allowed
/api/chat/channels/:channelId/viewersNewGet current viewer list with usernames, avatars, roles, and anonymous count (public, accepts channelId or username)
/api/chat/channels/:channelId/statsGet live chat statistics for a channel (public)
/api/chat/channels/:channelId/policyGet chat moderation policy and rules (public)
/api/integrations/oauth/chat/channels/:channelId/messagesSend a chat message with optional effects (requires chat:write)
Request body — JSON
messagestringrequiredThe message content (max 500 characters)
sendAsBotbooleanoptionalPost as your connected bot instead of the authenticated user. Needs chat:write (this route's scope) plus either a bot connected via /integrations/oauth/bot/select or a bot-type app. Omit/false to post as the user.
effectstringoptionalMessage effect: glow, galaxy, rainbow, gigantify
effectColorstringoptionalHex color for the effect (e.g., #ff6b6b)
replyToobjectoptionalReply to a specific message: { messageId, username, message }
/api/integrations/oauth/chat/channels/:channelId/moderateModerate a user (timeout, ban, delete message - requires chat:moderate)
/api/chat/slash-commandsList available slash commands (public)
Channel Points (write, OAuth)
Create and manage your channel's point rewards programmatically — perfect for bots that spin up dynamic redemptions. All write endpoints act on your own channel (the channel that owns the token) and never move real money: rewards cost channel points, not currency. Pass an optional cardDesign object to style the reward exactly like the in-app card designer.
/api/integrations/oauth/channel-points/rewardsList your channel point rewards (requires channel:points:read)
/api/integrations/oauth/channel-points/rewardsCreate a reward on your channel (requires channel:points:write)
Request body — JSON
namestringrequiredReward name (max 120 chars)
costintegerrequiredCost in channel points (>= 1). This is the free watch-time loyalty currency — not money.
descriptionstringoptionalReward description (max 500 chars)
cooldownSecondsintegeroptionalGlobal cooldown between redemptions, in seconds
maxPerStreamintegeroptionalMax redemptions allowed per stream
maxPerUserPerStreamintegeroptionalMax redemptions per user per stream
requiresModeratorApprovalbooleanoptionalHold each redemption for mod approval before granting
cardDesignobjectoptionalFull visual styling, identical to the in-app card designer. Shape: { version: number(>=1), background: { type: "solid"|"gradient", color?, colors?[], angle? }, texture: { enabled: boolean, pattern?, opacity?, blendMode? }, icon: { type: "none"|"emote"|"icon"|"emoji"|"symbol"|"custom", emoji?, emoteUrl?, iconName?, iconColor?, iconAnimated?, customIconUrl?, ... }, textLine1 & textLine2: { content, font, size: "xs"|"sm"|"md"|"lg", color: { type: "solid"|"gradient", value?, colors?[] }, animation: "none"|"pulse"|"bounce"|"shake"|"glow" }, border: { color, width: 0|1|2|3 }, textAlign?: "left"|"center"|"right" }. Include it to make beautiful cards; omit it for a default look.
/api/integrations/oauth/channel-points/rewards/:rewardIdUpdate a reward on your channel (requires channel:points:write). Accepts any create field plus enabled:boolean, and cardDesign to restyle the card.
/api/integrations/oauth/channel-points/rewards/:rewardIdDelete a reward on your channel (requires channel:points:write). Built-in rewards cannot be deleted.
Polls, Predictions, Giveaways, Goals & Timers (OAuth)
Run everything a streamer runs from chat or the dashboard, from your bot or tool. Reads need channel:read; control needs channel:interactive:write (reviewed before it is granted). Every endpoint acts on the token owner's own channel only, even if they moderate other channels, and goes through the same code as the dashboard, so overlays, chat cards and events behave identically. Polls, predictions and giveaways need the channel to be live. Rate limit: 60 requests/minute per access token.
/api/integrations/oauth/polls/activeNewCurrent poll, or null (channel:read)
/api/integrations/oauth/pollsNewStart a poll; replaces an open one (channel:interactive:write)
Request body — JSON
questionstringrequired3-240 characters
optionsstring[]required2-6 unique options, 1-120 characters each
durationSecondsintegeroptional15-3600, default 120
allowMultiplebooleanoptionalLet viewers pick more than one option
/api/integrations/oauth/polls/:pollId/endNewEnd a poll now; optional { reason } up to 30 characters (channel:interactive:write)
/api/integrations/oauth/predictions/activeNewCurrent prediction (open, locked, or settled in the last 2 minutes), or null (channel:read)
/api/integrations/oauth/predictionsNewStart a prediction. Fails if one is already open or locked (channel:interactive:write)
Request body — JSON
titlestringrequiredUp to 200 characters
outcomesstring[]required2-10 outcomes, up to 60 characters each
durationSecondsintegeroptionalHow long bets stay open, 15-1800
maxStakeintegeroptionalMost channel points one viewer can bet, 1-1,000,000 (default 250,000)
/api/integrations/oauth/predictions/:id/lockNewStop taking bets (channel:interactive:write)
/api/integrations/oauth/predictions/:id/resolveNewBody { outcomeId }: pick the winner and pay out channel points (channel:interactive:write)
/api/integrations/oauth/predictions/:id/cancelNewCancel and refund every bet (channel:interactive:write)
/api/integrations/oauth/giveaways/activeNewCurrent giveaway, or null (channel:read)
/api/integrations/oauth/giveawaysNewStart a giveaway; replaces an open one (channel:interactive:write)
Request body — JSON
titlestringrequiredUp to 140 characters
descriptionstringoptionalShown under the title
eligibilitystringoptionalall | followers | subscribers (default all)
entryModestringoptionalbutton | hashtag (default button)
hashtagstringoptionalRequired for hashtag mode: # plus 2-30 characters
winnerCountintegeroptional1-10, default 1
durationSecondsintegeroptional30-7200, default 300
autoDrawbooleanoptionalDraw automatically when entries close (default true)
/api/integrations/oauth/giveaways/:giveawayId/drawNewDraw the next winner; closes the giveaway once every winner is drawn (channel:interactive:write)
/api/integrations/oauth/giveaways/:giveawayId/endNewClose a giveaway now (channel:interactive:write)
/api/integrations/oauth/goalsNewYour channel's goals with live progress (channel:read)
/api/integrations/oauth/goals/:id/adjustNewBody { amount, note? }: add to (or subtract from) progress (channel:interactive:write)
/api/integrations/oauth/goals/:idNewBody { target }: change the target (channel:interactive:write)
/api/integrations/oauth/goals/:id/resetNewStart a new period now, optional { startValue } (channel:interactive:write)
/api/integrations/oauth/timersNewYour channel's timers and subathons with live state (channel:read)
/api/integrations/oauth/timers/:id/:actionNewaction = start | pause | resume | end | reset (channel:interactive:write)
/api/integrations/oauth/timers/:id/add-timeNewBody { seconds, note? }: add time, or remove it with a negative number (channel:interactive:write)
Bot Management
Configure third-party bots with default and custom per-channel names. See full guide at /docs/bot-integration
/api/developer/apps/:clientId/bot/configureConfigure default bot name and settings (reserves username platform-wide)
/api/developer/apps/:clientId/bot/instancesList all bot instances (default + custom names per channel)
/api/developer/apps/:clientId/bot/check-name/:botNameCheck if bot name is available
/api/integrations/oauth/bot/customizeSet custom bot name for user's channel (requires bot:write)
/api/integrations/oauth/bot/customizeRemove custom name, revert to default (45-day reservation)
/api/integrations/oauth/bot/currentGet current bot config for user's channel
Subscriptions
/api/developer/subscriptions/countNewAuthoritative count of your channel's active (non-expired) subscribers — offline-safe (requires subscriptions:read). 120 req/min.
/api/developer/subscriptionsNewPaginated roster of your active subscribers (userId, username, tier, gift + gifter, expiry) + authoritative total. Query: page, perPage (1–100). Offline-safe (requires subscriptions:read). 120 req/min.
/api/subscriptions/my-subscriptionsGet current user subscriptions (requires subscriptions:read)
/api/subscriptions/creator/:creatorId/subscribersGet creator subscribers (requires subscriptions:read)
/api/subscriptions/creator/:creatorId/gift-leaderboardGet top gifters for creator (public)
/api/subscriptions/subscribeSubscribe to a creator (requires subscriptions:write)
/api/subscriptions/gift/directGift subscription to specific user (requires subscriptions:write)
/api/subscriptions/gift/randomGift subscriptions to random community members (requires subscriptions:write)
/api/subscriptions/manageManage subscription (cancel, update) (requires subscriptions:write)
Notifications
User notification endpoints for alerts, follows, subs, etc.
/api/notificationsGet user notifications (requires notifications:read)
/api/notifications/unread-countGet unread notification count (requires notifications:read)
/api/notifications/:id/readMark notification as read (requires notifications:write)
/api/notifications/read-allMark all notifications as read (requires notifications:write)
Volts (Currency)
Velora currency system for tips, purchases, and transactions.
/api/volts/walletGet user wallet balance (requires payments:read)
/api/volts/transactionsGet transaction history (requires payments:read)
/api/volts/purchasePurchase Volts (requires payments:write)
/api/volts/sendSend Volts to streamer (requires payments:write)
/api/volts/leaderboard/:creatorIdGet top tippers for channel (public)
Channel Points (read & redeem)
Read channel points, redeemable items, and redemptions. Note: Item creation is internal - use webhooks to receive redeem events.
/api/channel-points/:channelId/balanceGet user point balance for channel (requires points:read)
/api/channel-points/:channelId/itemsGet redeemable items for channel (public)
/api/channel-points/:channelId/items/with-built-inGet items including built-in rewards (public)
/api/channel-points/:channelId/stream/:streamId/redemptionsGet redemptions for a stream (public)
/api/channel-points/:channelId/leaderboardGet top point earners for channel (public)
/api/channel-points/:channelId/redeem/:itemIdRedeem points item (requires points:write)
Journal
Creator journal/blog system.
/api/users/:username/journalsGet published journal posts for user (public)
/api/journals/:slugGet specific journal post
/api/journalsGet my journal posts including drafts (requires journal:read)
/api/journalsCreate journal post (requires journal:write)
/api/journals/:slugUpdate journal post (requires journal:write)
/api/journals/:slugDelete journal post (requires journal:write)
/api/journals/:slug/publishPublish draft (requires journal:write)
/api/journals/:slug/imagesUpload image to journal post (requires journal:write)
YouTube Integration
Sync and manage YouTube content.
/api/youtube/auth/urlGet YouTube OAuth URL (requires youtube:manage)
/api/youtube/statusCheck YouTube connection status (requires youtube:read)
/api/youtube/videos/recentGet recent synced videos (requires youtube:read)
/api/youtube/libraryGet YouTube library (requires youtube:read)
/api/youtube/playlistsGet YouTube playlists (requires youtube:read)
/api/youtube/widgets/:usernameGet YouTube widget data for user (public)
/api/youtube/disconnectDisconnect YouTube (requires youtube:manage)
Public reads
No token needed unless a row says otherwise. These are the catalogue surfaces — who is live, what they are playing, the emotes and badges a chat renderer has to resolve.
Streams
/api/streams/liveGet live streams (public)
/api/streams/browseBrowse live streams with filters (public)
/api/streams/featuredGet featured streams (public)
/api/streams/topGet top streams by viewers (public)
/api/streams/growingGet fastest growing streams (public)
/api/streams/user/:usernameGet stream by username (public)
/api/streams/user/:username/vodsGet VODs for a channel (public)
Users
/api/users/meGet current authenticated user
/api/users/:usernameGet public user profile by username
/api/users/searchSearch users (query: ?q=term&limit=10)
/api/users/:userId/followersGet user followers
/api/users/:userId/followingGet users following
/api/users/meUpdate current user profile (requires user:write)
Search
Global search returns creators (with live stream info) and categories. Use this to find live streams by creator name or category.
/api/search/globalSearch creators and categories (public, query: ?query=term&limit=8). Returns isLive status for each creator.
/api/users/searchSearch users for mentions/invites (requires auth, query: ?q=term&limit=10)
Categories
/api/categoriesList all stream categories (public)
/api/categories/searchSearch categories (public, query: ?query=term)
Emotes
/api/emotesGet all emote collections (global + channel if ?channel=username)
/api/emotes/globalGet global emotes only
/api/emotes/channel/:usernameGet channel emotes by username
/api/emotes/resolveResolve emote codes to URLs (query: ?codes=emote1,emote2)
Badges
Chat badges including global platform badges and channel subscription badges. All endpoints are public, no auth required.
/api/badges/catalogGet global badge catalog (public, query: ?category=event|achievement|system)
/api/badges/channel/:usernameGet subscription badges for a channel by username (public)
/api/subscriptions/badges/:usernameNewGet badges for a user (requires authentication)
Followers
/api/users/follow/:userIdFollow a user (requires auth)
/api/users/follow/:userIdUnfollow a user (requires auth)
/api/users/follow-status/:userIdCheck if following a user (requires auth)
/api/users/:userId/followersGet user followers (public)
/api/users/:userId/followingGet users they follow (public)
Clips
/api/clips/:clipIdGet clip by ID (public)
/api/streams/:username/clipsGet clips for a channel by username (public)
/api/streams/:username/clipsCreate a clip (requires auth)
Request body — JSON
titlestringrequiredClip title (3-160 chars)
durationMsnumberrequiredClip duration in milliseconds (15000-120000, i.e. 15s-120s)
startOffsetMsnumberrequiredStart offset from stream beginning in milliseconds
descriptionstringoptionalOptional description (max 500 chars)
highlightbooleanoptionalMark as highlight clip
Polls
/api/streams/:username/polls/activeGet active poll for a channel (public)
/api/streams/:username/pollsCreate a poll (requires channel ownership)
/api/streams/:username/polls/:pollId/voteVote in a poll (requires auth)
/api/streams/:username/polls/:pollId/endEnd a poll early (requires channel ownership)
Giveaways
Channel giveaway system.
/api/streams/:username/giveaways/activeGet active giveaways for channel (public)
/api/streams/:username/giveawaysCreate giveaway (requires channel ownership)
/api/streams/:username/giveaways/:giveawayId/joinJoin giveaway (requires user:write)
/api/streams/:username/giveaways/:giveawayId/drawDraw winner (requires channel ownership)
/api/streams/:username/giveaways/:giveawayId/endEnd giveaway (requires channel ownership)
Teams
/api/teamsList all teams (public)
/api/teams/:slugGet team by slug (public)
/api/teams/:slug/membersGet team members (public)
Managing your own application
These act on your app rather than on a streamer. You touch them at setup and when rotating credentials, not in your hot path.
Developer Apps
/api/developer/appsList your applications
/api/developer/appsCreate a new application
/api/developer/apps/:clientIdGet application details
/api/developer/apps/:clientIdUpdate application
/api/developer/apps/:clientIdDelete application
/api/developer/apps/:clientId/rotate-secretRotate client secret
/api/developer/apps/:clientId/scopesGet app scope grants
Webhooks (Event Subscriptions)
Real-time event notifications for subs, gifts, follows, raids, volts, channel point redeems, etc. Essential for chat bots and integrations.
/api/developer/apps/:clientId/webhooksList all webhooks for your app
/api/developer/apps/:clientId/webhooksCreate webhook subscription (events: channel.follow, channel.subscribe, channel.gift, channel.raid, channel.volts, channel.points.redeem, stream.online, stream.offline, etc.)
/api/developer/apps/:clientId/webhooks/:idGet webhook details
/api/developer/apps/:clientId/webhooks/:idUpdate webhook (change events, URL, etc.)
/api/developer/apps/:clientId/webhooks/:idDelete webhook subscription
/api/developer/apps/:clientId/webhooks/:id/rotate-secretRotate webhook signing secret for security
HTTP response codes
| Code | Meaning |
|---|---|
200 | Success |
201 | Created successfully |
204 | No content (successful deletion) |
400 | Bad request — invalid parameters |
401 | Unauthorized — invalid or expired token |
403 | Forbidden — insufficient permissions |
404 | Not found — resource doesn't exist |
429 | Rate limited — too many requests |
500 | Internal server error |
Error response format
All error responses follow a consistent format:
Response — error body
{
"error": "error_code",
"message": "Human-readable error message",
"details": {
// Optional additional error details
}
}Pagination
List endpoints support cursor-based pagination:
Request
GET /api/streams?limit=25&cursor=eyJsYXN0X2lkIjoi...
| Parameter | Description |
|---|---|
limit | Number of items per page (max 100) |
cursor | Cursor from previous response for next page |
Getting started
New here? Make your first API request, then set up OAuth authentication. Not sure which surface fits what you are building? Start here.