📺

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

ScopePurposeApproval
stream:keyAccess stream key and ingest URLsRequired
stream:readRead stream info, status, categoriesAuto
stream:writeUpdate title, category, tagsRequired
user:readGet user profile informationAuto

Base URL

All streaming API requests use the following base URL:

https://api.velora.tv/api/integrations/oauth

Get Stream Setup

GET/stream/setup

Retrieve 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

GET/stream/info

Get 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

PUT/stream/info

Update the stream title and/or category. Requires stream:write scope. All fields are optional.

Request Body

FieldTypeDescription
titlestringStream title (max 140 characters)
categorySlugstringCategory slug (see /stream/categories)
tagsstring[]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

GET/stream/categories

Get 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

GET/stream/key/regenerate

Generate 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

Server:
rtmp://ingest.velora.tv:1935/live
Stream Key:
{streamKey}

SRT (Secure Reliable Transport)

Best for: Low-latency streaming, unreliable networks

URL:
srt://ingest.velora.tv:9999?streamid={streamKey}

WHIP (WebRTC-HTTP Ingestion Protocol)

Best for: Browser-based streaming, ultra-low latency

URL:
https://ingest.velora.tv:3334/live/{streamKey}/whip

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

StatusMeaning
401Invalid or expired access token
403User doesn't have streaming enabled or missing required scope
404Category not found (when updating stream info)
429Rate limit exceeded

Next Steps