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.
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:
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.