Video Piper APIv1 Home OpenAPI spec

Docs › Live streaming (Pro and Scale)

Live streaming (Pro and Scale)

Go live from the browser or from OBS, with viewers a few seconds behind, and every recorded stream saved as a normal video you can trim, caption, redact and embed. A live stream is a destination: make one, broadcast to it, share its watch link.

POST /live-streams
{ "title": "Product demo", "record": true, "captions": true, "maxDurationMinutes": 60 }

201 Created
{ "liveStreamId": "5c1e…", "status": "idle", "record": true, "maxDurationMinutes": 60,
  "ingest": { "rtmpsUrl": "rtmps://….global-contribute.live-video.net:443/app/", "streamKey": "sk_us-east-1_…" },
  "watch": { "url": "https://videopiper.com/embed/live/5c1e…?t=…", "iframe": "<iframe src=…></iframe>" },
  "playbackUrl": "https://….playback.live-video.net/api/video/v1/….m3u8?token=…", "playbackExpiresAt": 1790932000 }
  • Broadcast with the ingest: in OBS, Settings → Stream → Custom…, the server and stream key (1280×720 at 30 fps, 2,500–3,500 kbps, keyframes every 2 s). Or go live from the browser: Go live in the app, or <video-piper-recorder live-ingest="RTMPS_URL" stream-key="KEY"> on your page (camera, screen, or the screen with the camera in a corner). The stream key lets whoever holds it broadcast to this one stream until it ends: give it only to the person broadcasting. GET /live-streams/{id}/ingest returns it again while the stream is open.
  • Watch with watch.url: a page that plays the stream (starting soon, LIVE with the viewer count, ended), to share or open on a phone; watch.iframe puts it on your site (only your allowed domains can frame it). In your own player, <video-piper live links-url="WATCH_URL/links?t=…">, or play playbackUrl (low-latency HLS; open it within its two hours) with hls.js or Safari.
  • Status: idle (waiting for the broadcast) → live → ended; expired if it never started within a day, failed if it couldn't be processed. GET /live-streams/{id} adds viewers while live, startedAt, endedAt, durationSeconds, the recording's videoId once saved, and usage (broadcastMinutes, viewerHours) about 10 minutes after it ends.
  • End with POST /live-streams/{id}/end (or stop broadcasting). A stream stops by itself after maxDurationMinutes (default 120, at most 480). DELETE /live-streams/{id} removes it (a saved recording stays). GET /live-streams lists them, newest first.
  • The recording (record, default true) becomes a video in your list when the stream ends, at up to 720p, with the stream's title, description, metadata, captions and autoRedact; video.ready follows as for any video.
  • Webhooks: live.started, live.ended and live.recording.ready (with the recording's videoId), once you tick them for your endpoint.
  • Plans: Pro has 2 streams open at once and 100 viewer-hours a month included; Scale 10 and 400. Beyond that: $0.02 per broadcast minute and $0.09 per viewer-hour. Free and Starter get 403 PLAN_UPGRADE_REQUIRED. A test key makes free test streams of up to 5 minutes.