API reference

Quick start

Upload video, run live streams, and receive events — from your own backend, with no browser and no dashboard session.

Base URL

Every endpoint in this reference lives under one host and one prefix.

text
https://api.streamos.in/api/public/v1

Note there is no organization id in the path. The API key identifies your organization, so a request cannot name a tenant — key A, org B is not something the API lets you express.

Three calls

Three calls, from nothing to a video that is transcoding. Create a key in Settings → API keys, then:

quick-start.sh
KEY="sk_live_…"
BASE="https://api.streamos.in/api/public/v1"

# 1. ask for somewhere to put the file
UP=$(curl -s -X POST "$BASE/videos/upload-url/" \
  -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' \
  -d '{"file_name":"lecture.mp4"}')

URL=$(echo "$UP" | jq -r '.data.upload_url')
PUBLIC=$(echo "$UP" | jq -r '.data.public_url')

# 2. send the bytes straight to storage
curl -X PUT "$URL" -H 'Content-Type: video/mp4' --data-binary @lecture.mp4

# 3. register it, which queues transcoding
curl -s -X POST "$BASE/videos/" \
  -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' \
  -d "{\"title\":\"Lecture 1\",\"source_url\":\"$PUBLIC\"}"

How the pieces fit

Everything is asynchronous. A call that starts work returns immediately with an id and a status; the result arrives later, either when you ask for it or when we call you.

Two ways to learn the outcome

Poll the resource until its status settles — simple, and fine at low volume. Subscribe to a webhook and we post to you the moment it changes — no waiting, no wasted calls.

A webhook is optional. Without one, every endpoint still works exactly the same — you just have to ask for the result rather than being told.

Where to next