Restream / simulcast
Forward your Kardolive live stream simultaneously to YouTube Live, Twitch, Facebook Live, X/Twitter Live, LinkedIn Live, or any custom RTMP endpoint. One source, many destinations.
/app/restream. Attach destinations to a live stream from /app/streams/<id> → Restream tab.
On this page
1. How it works
When a stream starts publishing to Kardolive (via RTMP/RTMPS/WHIP), our ingest server tees the same source feed to every restream destination you've attached. We don't re-encode — we just pass-through the existing H.264 / AAC bitstream, so there's no extra CPU cost and no quality loss. Each destination shows up as if you published directly to it.
┌─ rtmp://a.rtmp.youtube.com/live2/<key>
[Your publisher] │
│ │
▼ ├─ rtmp://live.twitch.tv/app/<key>
[Kardolive SRS ingest] ─── tee ──►│
│ │
▼ ├─ rtmps://live-api-s.facebook.com:443/rtmp/<key>
[HLS / WHEP / chat …] │
└─ rtmp://your-custom-endpoint/path/<key>
Destinations run for the entire duration of the stream and stop when the stream ends.
2. Save a destination
Targets are saved once and reused across many streams. Each target = one RTMP URL.
POST https://api.kardocloud.com/v1/me/restream/targets
Authorization: Bearer kl_live_xxx
{
"name": "Brand YouTube channel",
"platform": "youtube",
"rtmpUrl": "rtmp://a.rtmp.youtube.com/live2/abcd-efgh-ijkl-mnop"
}
→ { "id": "rt_xxx", "name": "Brand YouTube channel", "platform": "youtube",
"rtmpUrl": "rtmp://a.rtmp.youtube.com/live2/****-mnop", // tail masked
"active": true, "createdAt": "..." }
The full RTMP URL is stored encrypted at rest. When listed it's masked — only the last 6 characters are shown.
List existing destinations:
GET /v1/me/restream/targets
→ [{ "id": "rt_xxx", "name": "...", "platform": "youtube", "rtmpUrl": "rtmp://a.rtmp.youtube.com/live2/****-mnop" }]
Delete a destination (also stops any running routes):
DELETE /v1/me/restream/targets/rt_xxx
3. Attach destinations to a stream
Before starting your live stream, attach the destinations you want to simulcast to. Up to 8 destinations per stream.
POST /v1/me/restream/streams/<streamId>
{ "targetIds": ["rt_xxx", "rt_yyy", "rt_zzz"] }
→ { "attached": 3 }
When the stream goes live, Kardolive automatically starts forwarding to every attached destination. Status moves pending → live → ended (or failed with an error message if the target rejects the connection).
Check current routes:
GET /v1/me/restream/streams/<streamId>
→ [
{ "id": "rr_1", "targetId": "rt_xxx", "target": { "name": "YouTube", "platform": "youtube" },
"status": "live", "startedAt": "...", "endedAt": null, "errorMessage": null },
{ "id": "rr_2", "targetId": "rt_yyy", "target": { "name": "X / Twitter", "platform": "x" },
"status": "live", "startedAt": "...", "endedAt": null, "errorMessage": null }
]
4. Detach destinations
Detaching a destination mid-stream stops the forwarder for that one target. The main stream keeps publishing on Kardolive + other attached destinations.
DELETE /v1/me/restream/streams/<streamId>/<targetId>
5. Webhook events
| Event | When |
|---|---|
restream.started | FFmpeg forwarder connected to target successfully |
restream.ended | Stream ended; forwarder shut down cleanly |
restream.failed | Target rejected the connection — see errorMessage in payload |
6. Per-platform setup
YouTube Live
- YouTube Studio → Go Live → Streaming settings
- Copy "Stream URL" + "Stream key"
- Combine:
rtmp://a.rtmp.youtube.com/live2/<your-stream-key> - Save as a Kardolive target with
platform: "youtube"
Twitch
- Twitch Creator Dashboard → Settings → Stream → Primary Stream key
- RTMP URL:
rtmp://live.twitch.tv/app/<your-stream-key>
Facebook Live
- Facebook → Live Producer → Use stream key
- RTMPS URL:
rtmps://live-api-s.facebook.com:443/rtmp/<your-stream-key>
X / Twitter Live
- Twitter Media Studio → Producer → Create broadcast
- Use the provided RTMP URL + key combination
LinkedIn Live
- LinkedIn → Create → Event → Live video
- Approved publishers only — request access through LinkedIn
Custom RTMP
Set platform: "custom" and pass the full URL. Anything that accepts H.264 + AAC over RTMP/RTMPS works (Wowza, nginx-rtmp, Vimeo, BoxCast, Akamai, etc.).