DEVELOPER KNOWLEDGE HUB & API

Technical Documentation

Everything you need to upload and stream video, go live from OBS, embed the player, use S3-compatible storage and receive webhooks.

Get Started Free Community Forum β†’

Overview & Authentication

v1 REST API

Veluraq is a video hosting and streaming platform with S3-compatible storage zones. All REST API requests must include your library's AccessKey header. Read-only keys can query GET endpoints only.

Header NameDescriptionRequired For
AccessKeyYour Video Library or Storage Zone API Access KeyAll REST API Endpoints
Tus-ResumableMust be set to 1.0.0 for TUS chunk uploadsResumable video uploads
X-Veluraq-SignatureCryptographic HMAC-SHA256 signatureWebhook verification

System Topology

[ Broadcaster / OBS Studio ] ──(RTMP :1935)──► [ Veluraq live server ] ──► HLS playback [ Your app / TUS uploader ] ──(HTTPS)──► [ Veluraq API ] ──► [ Encoder (HLS, multiple qualities) ] β–Ό [ Viewers (web / mobile) ] ◄──(HLS)───────────────────── [ Veluraq player / embed ] [ AWS CLI / rclone ] ──(S3-compatible API /s3/:zone)──► [ Storage zones ]

VOD & TUS 1.0.0 Resumable Uploads

Resumable Protocol

Veluraq supports the open TUS 1.0.0 resumable upload protocol. If the connection drops during a large upload, your client resumes from the last saved byte offset instead of starting over.

Step 1: Initialize the Video Record

curl -X POST "https://www.veluraq.net/api/v1/library/LIBRARY_ID/videos" \ -H "AccessKey: YOUR_LIBRARY_ACCESS_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "Global Launch Keynote", "collectionId": ""}'

Step 2: Stream via TUS 1.0.0 Resumable Protocol

curl -X PATCH "https://www.veluraq.net/api/v1/library/LIBRARY_ID/videos/VIDEO_GUID/tus" \ -H "AccessKey: YOUR_LIBRARY_ACCESS_KEY" \ -H "Tus-Resumable: 1.0.0" \ -H "Upload-Offset: 0" \ -H "Upload-Length: 104857600" \ -H "Content-Type: application/offset+octet-stream" \ --data-binary @keynote.mp4

Step 3: Direct PUT Binary Stream (Quick Uploads)

curl -X PUT "https://www.veluraq.net/api/v1/library/LIBRARY_ID/videos/VIDEO_GUID" \ -H "AccessKey: YOUR_LIBRARY_ACCESS_KEY" \ -H "Content-Type: video/mp4" \ --data-binary @video.mp4

Live Streaming (RTMP & OBS Studio)

RTMP ingest

Broadcast live from OBS Studio, vMix, Wirecast or Streamlabs over RTMP. Your stream is converted to HLS so viewers can watch in any browser (expect a few seconds of delay).

Ingest Credentials

Server: rtmp://www.veluraq.net:1935/live

Port: 1935

Stream Key: Found on your Library > Live Studio card (keep it private)

Recommended OBS Settings

Rate Control: CBR (4500 - 6000 Kbps)

Keyframe Interval: 2s (Required for HLS chunk sync)

Tune: zerolatency

Live Playback URL

<!-- Live HLS playback (use your Library ID, never your stream key) --> <video controls autoplay muted playsinline> <source src="https://www.veluraq.net/live/LIBRARY_ID/index.m3u8" type="application/x-mpegURL"> </video>

Video Player & Player.js SDK

Cross-Platform Standard

The embedded video player fully implements the Player.js specification, allowing bidirectional control (play, pause, seek, volume, events) from any parent web application.

Responsive Iframe Embed Code

<div style="position:relative;padding-top:56.25%"> <iframe src="https://www.veluraq.net/embed/LIBRARY_ID/VIDEO_ID?autoplay=false&color=ff8a00" loading="lazy" style="border:none;position:absolute;top:0;left:0;height:100%;width:100%;" allow="accelerometer;gyroscope;autoplay;encrypted-media;picture-in-picture;" allowfullscreen="true"> </iframe> </div>

Player.js JavaScript Control

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/player.min.js"></script> <script> const iframe = document.querySelector('iframe'); const player = new playerjs.Player(iframe); player.on('ready', () => { console.log('Player is ready for playback'); player.play(); }); player.on('timeupdate', (data) => { console.log('Position:', data.seconds, 'Duration:', data.duration); }); </script>

Storage & S3-compatible API

AWS S3 Compatible

Connect with the AWS CLI, rclone or Cyberduck. Use your storage zone’s access key as the access key ID (the secret value is not checked).

AWS CLI Configuration (~/.aws/credentials)

[veluraq] aws_access_key_id = YOUR_STORAGE_ZONE_ACCESS_KEY aws_secret_access_key = any-value

CLI Upload & Sync

# List files in Storage Zone aws --endpoint-url=https://www.veluraq.net/s3 s3 ls s3://my-zone/ # Upload a file aws --endpoint-url=https://www.veluraq.net/s3 s3 cp ./data.zip s3://my-zone/ # Sync an entire directory aws --endpoint-url=https://www.veluraq.net/s3 s3 sync ./assets/ s3://my-zone/assets/

Code Samples

Examples for uploading a video with Node.js and Python.

Node.js Upload Script

const fs = require('fs'); const axios = require('axios'); async function uploadVideo(filePath, title) { const { data: video } = await axios.post('https://www.veluraq.net/api/v1/library/1/videos', { title }, { headers: { AccessKey: 'YOUR_ACCESS_KEY' } }); const fileStream = fs.createReadStream(filePath); await axios.put(`https://www.veluraq.net/api/v1/library/1/videos/${video.guid}`, fileStream, { headers: { AccessKey: 'YOUR_ACCESS_KEY', 'Content-Type': 'video/mp4' } }); console.log('Video uploaded with GUID:', video.guid); return video; }

Python Upload Script

import requests def upload_video(file_path, title): headers = {'AccessKey': 'YOUR_ACCESS_KEY'} video = requests.post('https://www.veluraq.net/api/v1/library/1/videos', json={'title': title}, headers=headers).json() guid = video['guid'] with open(file_path, 'rb') as f: requests.put(f'https://www.veluraq.net/api/v1/library/1/videos/{guid}', data=f, headers=headers) print(f'Uploaded video GUID: {guid}') return video

Webhooks & HMAC Signature Verification

Cryptographically Signed

Receive automated notifications as videos progress through encoding states. Every webhook is signed with an X-Veluraq-Signature header.

Node.js / Express Webhook Receiver

const crypto = require('crypto'); const express = require('express'); const app = express(); app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-veluraq-signature']; const secretKey = 'YOUR_WEBHOOK_SECRET'; const hmac = crypto.createHmac('sha256', secretKey); const expected = 'sha256=' + hmac.update(req.body).digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(signature || ''), Buffer.from(expected))) { return res.status(403).send('Invalid webhook signature'); } const event = JSON.parse(req.body); console.log('Video event:', event.VideoGuid, 'Status:', event.Status); // Status: 0 Queued, 1 Processing, 2 Encoding, 3 Finished, 5 Failed res.sendStatus(200); });

Billing & Affiliate Program

Pay-as-you-go billing with a prepaid balance. Top up with card or PayPal when enabled, with a voucher code, or by contacting us.

Rates

Video storage: $0.01 / GB / month

Delivery: $0.005 / GB

Playback fee: $0.0002 / view + $0.001 / GB

Encoding & live classrooms: Included

Contact us

Custom invoices, wire top-ups and support:

Contact page

Start streaming with Veluraq today

Get $5 free credit when you sign up. No credit card required.

Get Started Free