Realtime video infrastructure

The only live video API
you will ever need.

Go beyond basic video calls — 50ms runs realtime sessions on the networks they actually happen on, with per-participant quality, automatic recovery, and signed recordings when a call must stand up as evidence.

Rust + str0m media plane — Web, Android, iOS SDKs — Signed evidence manifest

Video infrastructure for a video-first world.

Easy-to-integrate SDKs and a small, frozen API to help you build high-quality, auditable audio/video experiences into your applications.

Solutions

Live video for every use case.

The same realtime core — 50 ms glass-to-glass, per-participant quality, signed recordings — across KYC, education, telehealth, and more.

Video KYC

Frictionless video onboarding

Online Education

1-on-1 classes, tutoring, and live lessons

Telehealth

Remote check-ins with a permanent record

Proctoring

Supervised exams and assessments

Customer Verification

Identity and documents, checked live

Live Support

Video support calls, fully auditable

The problem

Live video runs on the hardest networks.

The usual way50ms
Third-party video API, black-box media pathFirst-party SFU — every hop measurable
One video quality for everyone in the roomPer-subscriber layers; audio never degrades
Recording is best-effort and unverifiableWAL journaled, SHA-256 checksummed, signed
A Wi-Fi drop ends the sessionRejoin without restarting the workflow
No way to explain a bad call after the factFull QoE and failure diagnostics per session

Live video runs on exactly the networks WebRTC is hardest on: one participant on a phone that will switch from Wi-Fi to cellular mid-session. Generic video tooling treats that as an edge case. The 50ms product contract treats it as the default.

So the media plane is built around it — and everything else is built to keep a running session alive.

Platform

Everything a live session needs.

One SFU per room, server-enforced roles, per-participant quality, signed recordings, and recovery that carries a session across network changes.

One SFU per room

px-sfu admits peers over HTTP offer/answer, runs one str0m Rtc per peer on one shared UDP socket, and routes packets by index — no per-peer scan in the data path. VP8 and Opus are forwarded; the control data channel is session-scoped.

Per-subscriber quality

Three-RID simulcast with keyframe-gated layer switching. Each subscriber's layer follows its own downlink with hysteresis — a flapping network holds its layer, recovery is one level at a time, and a manual intent pins the level. Video degrades first. Audio is never stepped.

Server-enforced roles

Who can publish, who only subscribes, who only watches — enforced by the SFU, not the client. Application data can never change forwarding policy.

Evidence, end to end

The recorder receives a bounded copy of depayloaded frames, journals before muxing, writes WebM (VP8/Opus) plus a deterministic composite, uploads with SHA-256 digests, and commits an Ed25519-signed manifest. It finalizes from Postgres when the last peer leaves and replays after a crash — a required-recording workflow can never silently continue as if recording were healthy.

Recovery, not restart

ICE rejoin with ufrag rotation and server-initiated in-band rejoin, a rejoin grace window for network migration, and UDP → TURN/UDP → TURN/TLS fallback for blocked paths. A full PeerConnection recreation restores media without creating a second logical participant.

How it works

Four steps from API call to signed evidence.

01

Create

POST /v1/sessions with an API key and an Idempotency-Key. The session is placed on a ready SFU node and returns join material.

02

Join

Mint single-use join tokens — short-lived Ed25519 JWTs with JWKS discovery and replay protection. Customer on mobile, agent on desktop, monitor anywhere.

03

Go live

The session runs with server-enforced roles, per-participant video quality, and a document-detail mode when you need to inspect something close up. A monitor watches without touching any participant's upstream.

04

Prove

The session ends in WebM evidence with a deterministic composite, SHA-256 digests, and a signed manifest. Durable webhooks and audit events follow.

Developers

A small, frozen API.

The control plane is a frozen OpenAPI contract: every route, parameter, and response shape is versioned, and the server's route table is asserted against the spec by a test, so the contract cannot drift.

Create a session
$ curl -s https://api.example.com/v1/sessions \ -H "Authorization: Bearer px_live_…" \ -H "Idempotency-Key: verify-0001" -d '{"participant_count": 2}'
{
"session": {
"id": "4f8b2c1e-…",
"status": "created",
"join_base_url": "https://join.example.com"
}
}
Illustrative request and response shape.
POST/v1/sessionsidempotent create
GET/v1/sessions/{session_id}status + placement
POST/v1/sessions/{session_id}/tokenssingle-use join tokens
POST/v1/sessions/{session_id}/endfinalize + evidence
GET/v1/webhooksdeliveries + dead-letters
GET/v1/api-keysbearer credentials
GET/v1/templatessession templates
POST/v1/resumeresume credentials

Frozen at OpenAPI 1.0.0.

SDKs

One session contract, three platforms.

The mobile participant is the one on the bad network. The SDKs exist so the join flow, camera handling, and recovery work there without you writing WebRTC.

px-sdk-webWeb — TypeScript, npm

Join flow, camera/mic publishing, quality intents, reconnect UX. This is what the demo and e2e suites drive in a real browser.

px-sdk-androidAndroid

Camera and microphone publishing with front/rear camera switching, the quality intents, and the same session contract.

px-sdk-iosiOS

Same contract as the other SDKs: join, publish, quality intent, reconnect — written for the networks real sessions run on.

Security

Verification has to survive an audit.

Single-use tokens

Join tokens are short-lived Ed25519 JWTs — five-minute default TTL — with JWKS discovery and single-use replay protection. API keys are bearer-scoped to the control plane.

Encrypted in transit

DTLS-SRTP media, HTTPS signaling, and TURN/TLS fallback for environments that block UDP. Session state lives in Postgres and Valkey behind scoped, least-privilege credentials.

Signed evidence

Every finalized manifest is Ed25519-signed and every asset SHA-256 checksummed; signature, sequence, and asset verification all pass before a manifest counts.

Auditable

Durable transactional webhooks with delivery logs and a dead-letter queue, plus complete per-session QoE and failure diagnostics for post-hoc review.

Start building on 50ms.

Control plane, SFU, evidence recorder, and three SDKs — Apache-2.0 licensed.