OpenVibe.Live/Docs
Source on GitHub

Stream slots API#

Everything the Go live screen does is an API call: list your slots, make one, change its title or settings, get its server and key, ask for title ideas, see its past streams, and end a stream. A phone app, a bot or a tool of your own goes live the same way the page does.

A slot is one stream of yours. It holds the title, the link (openvibe.live/@you/<slug>), how it goes out (your browser, OBS over RTMP, WHIP or FFmpeg), its restreams and its recording settings. Each slot has its own stream key.

Signing in#

Send Authorization: Bearer <token> with every call.

Every path below starts with https://openvibe.live/api/streams.

In JavaScript, openvibe-sdk/live wraps these calls: live.slots.list(), live.slots.create(), live.slots.update(), live.slots.profile(), live.slots.history(), live.slots.quality(), live.slots.titleIdeas(), live.goLive(), live.streams.end() and the WHIP helpers.

Slots#

CallWhat it does
GET /managedYour slots: { managed_streams: [{ id, title, slug, description, is_nsfw, streaming_method, browser_mode, … }] }
POST /managedMake a slot: { title, description?, slug?, is_nsfw?, streaming_method? } → { managed_stream }. The number of slots per account is limited; the error says the limit.
PUT /managed/:idChange a slot. Send only what changes: title, description, slug, is_nsfw, streaming_method (browser, rtmp, whip, cli), browser_mode (camera, camera_only, mic_only, screen), default_vod_visibility and default_clip_visibility (public, unlisted, private), slot_vod_recording_enabled, slot_clip_recording_enabled, slot_clip_notify_enabled (1 or 0), weather_zip and weather_detail.
DELETE /managed/:idDelete a slot. A live slot cannot be deleted (409): end its stream first.
GET /managed/:id/profileAll of a slot in one call: the slot, its quality settings (broadcast_settings), its restreams, its RTMP server (rtmp_url), its WHIP base (whip_url_base) and its stream_key.
PUT /broadcast-settingsA slot's quality: { managed_stream_id, settings: { resolution: "1080", fps: "30", bitrate: 4500 } } (the bitrate is in kbps).
POST /managed/:id/regenerate-keyA new stream key for the slot. The old one stops working at once.
GET /managed/:id/historyThe slot's past streams, newest first: { sessions: [{ id, title, started_at, duration_seconds, peak_viewers, vod_id, … }] }
POST /managed/:id/title-ideasThree title ideas for the next stream, written from the slot's last streams: { weekday?: "Sunday", hour?: 21, title?: "what is typed now" } → { titles: ["…", "…", "…"] }. A few calls a minute at most (429 says to wait). It uses your own AI allowance, and nothing is stored.

Going live#

How a slot goes live depends on its streaming_method.

GET /mine lists your streams, newest first. A live one has is_live: true, and its id is the stream's.

Ending a stream#

Errors#

Errors come back as { "error": "…" } in plain words:

CodeMeaning
400A field is not valid (the message says which).
401No sign-in, or it expired.
403Not your slot, or the token's scopes do not allow the call.
404No such slot or stream.
409That short link is taken on your account, or the slot is live and cannot be deleted.
429Too many calls: wait a little.

This page is rendered from docs/streams-api.md in the OpenVibe.Live repository. Found a mistake? Edit it there.