Streaming Software Integration
Build integrations for streaming software like OBS, Meld Studio, Streamlabs, and custom broadcasting applications.
Overview
The Velora Streaming API allows your application to:
- •Retrieve the user's stream key and ingest server URLs
- •Get and update stream title, category, and tags
- •Check live status and viewer count
- •Regenerate stream keys programmatically
- •List available categories for stream configuration
Required Scopes
| Scope | Purpose | Approval |
|---|---|---|
stream:key | Access stream key and ingest URLs | Required |
stream:read | Read stream info, status, categories | Auto |
stream:write | Update title, category, tags | Required |
user:read | Get user profile information | Auto |
Base URL
All streaming API requests use the following base URL:
https://api.velora.tv/api/integrations/oauthGet Stream Setup
/stream/setupRetrieve the user's stream key and all available ingest server URLs. This endpoint requires the stream:key scope.
Request
curl https://api.velora.tv/api/integrations/oauth/stream/setup \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
{
"streamKey": "live_abc123xyz789",
"rtmpUrl": "rtmp://ingest.velora.tv:1935/live",
"srtUrl": "srt://ingest.velora.tv:9999",
"whipUrl": "https://ingest.velora.tv:3334/live/live_abc123xyz789/whip",
"ingestServer": "ingest.velora.tv"
}Note: The WHIP URL includes the stream key for WebRTC-based streaming.
Get Stream Info
/stream/infoGet the current stream information including title, category, and live status. Requires stream:read scope.
Request
curl https://api.velora.tv/api/integrations/oauth/stream/info \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
{
"title": "Building an awesome project!",
"categoryName": "Software & Game Development",
"categorySlug": "software-and-game-development",
"isLive": true,
"viewerCount": 142,
"startedAt": "2026-01-19T02:30:00.000Z"
}Update Stream Info
/stream/infoUpdate the stream title and/or category. Requires stream:write scope. All fields are optional.
Request Body
| Field | Type | Description |
|---|---|---|
title | string | Stream title (max 140 characters) |
categorySlug | string | Category slug (see /stream/categories) |
tags | string[] | Array of stream tags |
Request
curl -X PUT https://api.velora.tv/api/integrations/oauth/stream/info \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Building a chat bot with Node.js",
"categorySlug": "software-and-game-development"
}'Response
{
"success": true,
"message": "Stream info updated"
}List Categories
/stream/categoriesGet a list of available stream categories. Use the slug value when updating stream info.
Request
curl https://api.velora.tv/api/integrations/oauth/stream/categories \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
{
"categories": [
{
"slug": "just-chatting",
"name": "Just Chatting",
"imageUrl": "https://assets.velora.tv/categories/just-chatting.jpg"
},
{
"slug": "software-and-game-development",
"name": "Software & Game Development",
"imageUrl": "https://assets.velora.tv/categories/dev.jpg"
},
{
"slug": "music",
"name": "Music",
"imageUrl": null
}
]
}Regenerate Stream Key
/stream/key/regenerateGenerate a new stream key for the user. The old key will immediately stop working. Requires stream:key scope.
Warning: This action is irreversible. The previous stream key will be invalidated immediately.
Request
curl https://api.velora.tv/api/integrations/oauth/stream/key/regenerate \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
Response
{
"streamKey": "live_newkey456def"
}Ingest Protocols
Velora supports multiple ingest protocols for different use cases:
RTMP (Real-Time Messaging Protocol)
Best for: OBS, Streamlabs, XSplit, and most streaming software
SRT (Secure Reliable Transport)
Best for: Low-latency streaming, unreliable networks
WHIP (WebRTC-HTTP Ingestion Protocol)
Best for: Browser-based streaming, ultra-low latency
Complete Example
Here's a complete example in JavaScript that fetches stream setup and updates stream info:
// Velora Streaming API Client Example
const VELORA_API = 'https://api.velora.tv/api/integrations/oauth';
class VeloraStreamClient {
constructor(accessToken) {
this.accessToken = accessToken;
}
async request(endpoint, options = {}) {
const response = await fetch(`${VELORA_API}${endpoint}`, {
...options,
headers: {
'Authorization': `Bearer ${this.accessToken}`,
'Content-Type': 'application/json',
...options.headers,
},
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.message || 'API request failed');
}
return response.json();
}
// Get stream key and ingest URLs
async getStreamSetup() {
return this.request('/stream/setup');
}
// Get current stream info
async getStreamInfo() {
return this.request('/stream/info');
}
// Update stream title and category
async updateStreamInfo({ title, categorySlug, tags }) {
return this.request('/stream/info', {
method: 'PUT',
body: JSON.stringify({ title, categorySlug, tags }),
});
}
// Get available categories
async getCategories() {
return this.request('/stream/categories');
}
// Regenerate stream key
async regenerateStreamKey() {
return this.request('/stream/key/regenerate');
}
}
// Usage
const client = new VeloraStreamClient('your_access_token');
// Configure OBS with Velora credentials
async function configureOBS() {
const setup = await client.getStreamSetup();
console.log('Configure OBS with these settings:');
console.log('Server:', setup.rtmpUrl);
console.log('Stream Key:', setup.streamKey);
return setup;
}
// Update stream before going live
async function prepareStream(title, category) {
await client.updateStreamInfo({
title,
categorySlug: category,
});
console.log('Stream info updated!');
}
// Example: Set up a coding stream
configureOBS().then(setup => {
prepareStream(
'Building a Velora integration!',
'software-and-game-development'
);
});Error Handling
| Status | Meaning |
|---|---|
401 | Invalid or expired access token |
403 | User doesn't have streaming enabled or missing required scope |
404 | Category not found (when updating stream info) |
429 | Rate limit exceeded |