Choose which platforms receive your stream
Set the RTMP destination, stream key, and frame layout for each platform your video is fanned out to.
stream/targets is the video fan-out side of a platform connection — paired with
stream/ingest (where the feed comes from). One row per (owner, platform): the
platform's RTMP address, its stream key, a wide/vertical frame choice, and an "armed"
toggle.
Read your current targets
GET /api/admin/stream/targets returns every target you've configured, keyed by
platform. The stream key is never echoed back — only a boolean hasKey.
Set or update a target
PUT /api/admin/stream/targets/{platform} — a partial patch:
| Field | Notes |
|---|---|
url | The platform's RTMP ingest address. |
key | The stream key. An empty value means "leave it as-is" — the same pattern as the platform's own stream key and native-settings token, so a form can resend the field without accidentally wiping it. |
enabled | Arms or disarms fan-out to this platform. Arming is only accepted for a target that already has both a URL and a key — an incomplete target that showed "armed" would be a green toggle lying about whether anything is actually going out. |
frame | Which frame layout (wide or tall) this platform receives — see Build a vertical frame. Empty defaults to wide. |
A target can only be created for a platform whose registry entry declares a
video_sink — platforms without one (TikTok, LiveJasmin) don't accept an RTMP push at
all, so the API won't let you save an address that was never going to be used.
Remove a target
DELETE /api/admin/stream/targets/{platform}.
A per-owner database row, not a shared config file
Targets used to live in a file next to ffmpeg on the motor — fine when every creator
had their own box, but on a shared GPU box that same file would mean one model's
targets are visible to, and overwritable by, another. Targets are keyed by
owner_id instead, and the motor learns which owner it's serving from the publish
path itself — so one motor safely serves any number of creators at once.
Verify it worked
GET /api/admin/stream/targets again and check enabled and hasKey for the
platform. The stream key itself is decrypted and used in exactly one place — the
token-gated motor resolver ffmpeg reads from — so you can't verify the key's value
directly through the API; verify that going live actually reaches the platform instead.
What's next
Set your room title and category — the other half of a platform connection: what it shows about you, not what video it receives.