Guides
Live streaming
Stream a call live to YouTube, Facebook, Instagram, LinkedIn, Twitch, X, TikTok or any RTMP server — to several at once — with its chat, questions and polls on screen.
Turn it on
With the call UI, pass streams: true to createFetchBackend and add the streams routes — the catch-all route forwards them; let only moderators through, since a stream key is a channel’s to give. Moderators then get a Go live button: they pick where to stream to, paste each platform’s stream key, choose what shows on screen, and go live. Everyone in the call sees a red Live pill, with where it’s going, for as long as it runs.
At /meet, the host of a meeting on a paid plan has the same button. Live streaming is part of the Pro, Business and Enterprise plans.
How it works
Nobody’s browser streams anything: it keeps going whoever leaves, until it’s stopped or the call ends.
The stream is drawn exactly like a recording: whoever is talking fills the picture, a shared screen takes over with the speaker in the corner, and the whiteboard shows while a host has it open. It’s encoded at 1280×720, 30 frames a second and about 3 Mbps, with a keyframe every 2 seconds — what the platforms ask for. A call can be streamed and recorded at the same time; they are separate.
Platforms and stream keys
Each platform gives you a stream key — and, for some, a stream URL that changes with every stream. Paste them into the Live tab or send them to the API.
| Platform | platform | Server | Where to find the key |
|---|---|---|---|
| YouTube | youtube | rtmps://a.rtmps.youtube.com:443/live2 | YouTube Studio → Create → Go live → Stream. Copy the stream key. |
facebook | rtmps://live-api-s.facebook.com:443/rtmp | Facebook → Live video → Streaming software. Copy the stream key — a persistent one can be used again next time. | |
instagram | Copy it with the key | Instagram on a computer: Create → Live video → set it up. Copy the stream URL and the stream key. | |
linkedin | Copy it with the key | LinkedIn → Create an event or Go live → Custom stream (RTMP). Copy the stream URL and the stream key. | |
| Twitch | twitch | rtmp://live.twitch.tv/app | Twitch Creator Dashboard → Settings → Stream. Copy the primary stream key. |
| X | x | Copy it with the key | X Media Studio → Producer → Sources → Create source (RTMP). Copy the RTMP URL and the stream key. |
| TikTok | tiktok | Copy it with the key | TikTok LIVE Center → Go LIVE with streaming software. Copy the server URL and the stream key. |
| Kick | kick | Copy it with the key | Kick dashboard → Settings → Stream URL & Key. Copy both. |
| Other (RTMP) | custom | Copy it with the key | Any RTMP or RTMPS server — Restream, Vimeo, a CDN, your own: its server URL and stream key. |
Pasting a platform’s whole address — rtmps://…/app/KEY — as the server, with no key, works too. Only rtmp:// and rtmps:// addresses on the public internet are accepted.
A stream key lets whoever has it stream to that channel. We use it only to stream, never show it again once it’s given — only its last four characters — and forget it when the stream ends, unless you save the destination.
Chat and activity on screen
Your live audience can’t see the call’s own chat, so the stream shows it — and questions, polls and reactions — over the picture, only while it matters, exactly as a recording can. It’s on by default for streams (chat, Q&A, polls and reactions; raised hands off), and its own setting, streamActivity, separate from the recording’s:
curl -X PATCH https://api.inlinemeet.com/v1/rooms/product-launch \
-H "Authorization: Bearer $INLINEMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"streamActivity": {"chat": true, "qna": true, "polls": true, "reactions": true, "hands": false}}'Moderators change it from the Live tab, even while live. Everyone in the call is told when their chat messages can appear on the stream, with their names.
Put a comment on screen
A moderator can pick any chat message — Show on screen beside it in the chat — to show it large on the stream and the recording, and as a banner in the call, until they take it down or pick another. It shows whatever streamActivity says: they put it there to be seen.
Portrait, for Instagram and TikTok
Instagram and TikTok show live video full screen on a phone, upright. Stream to them in portrait — 720×1280 — and the speaker fills the screen, a shared screen goes across the top with the speaker below it, and the chat and questions sit clear of the bands those apps draw their own comments over. A stream going only to Instagram or TikTok is portrait unless you say otherwise; anything else is landscape. One stream has one shape: other platforms show a portrait stream with bars at the sides, and Instagram a landscape one with bars above and below.
Your brand, scenes and a call to action
A stream can look like a broadcast rather than a call. Try them all in the webinar demo.
Logo, colour and speakers’ titles
Your workspace’s logo goes in the top corner, and its colour on the titles, banners and scenes. Each speaker’s name and title come up along the bottom for a few seconds as they start talking — the title from their join token’s title, or set by them in the call. Set the brand in the dashboard’s Settings or with PUT /v1/brand; a room’s look setting turns the logo and titles on or off. For the chat, questions and titles to match the colours of your embedded call, give the room’s template your colours.
Scenes
A moderator can put a scene up in place of the call — Starting soon, Be right back or Thanks for watching — from the Live tab, or with the room’s scene setting. A scene shows your logo, the call’s title and your colour, and turns the stream’s sound off, so nothing said meanwhile goes out; the call’s chat and questions still pop up over it. A webinar shows “Starting soon” by itself while it’s backstage, with a countdown when it’s booked for a set time. Each scene can say something of its own instead of its usual line — the room’s look.lines, or the Live tab — and a template can set them, and which scene a call opens on, ahead of time.
curl -X PATCH https://api.inlinemeet.com/v1/rooms/product-launch \
-H "Authorization: Bearer $INLINEMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scene": "break"}' # null goes back to the callA call to action
Put up a call to action and the stream shows it as a banner — the headline, the button’s words, the link written out and a QR code a phone can scan off the screen — while everyone in the call gets a button. In portrait, it goes near the top, clear of the platform’s comments.
Each destination’s status
A stream goes to each destination separately: one that refuses it — a wrong key, an event that isn’t set to start — fails on its own, with why, and the others carry on.
| Stream status | Means |
|---|---|
waiting | Every recorder was busy. It starts on its own as soon as one has room, usually within a couple of minutes. |
starting | Being set up, and connecting to the platforms. |
live | On air: at least one platform has it. |
ended | Stopped, or the call ended. |
failed | Every destination refused it, or it couldn’t be kept going. error says why. |
| Destination status | Means |
|---|---|
connecting | Being connected to — or reconnected, after a hiccup. |
live | The platform is receiving it. |
failed | The platform refused it or dropped it for good. error says why. |
removed | Taken off the stream while it ran. |
ended | The stream ended. |
If our recorder itself fails under a stream that was getting through, a new one is started straight away on the same keys, and the platforms pick it up again — up to three times per stream.
Streaming from your own server
1. Go live
| Body | Description |
|---|---|
destinationsarray | Up to 5: { platform, key, server?, name?, save? } — server only where the platform gives each stream its own; save keeps it for next time — or { savedId } for one saved before. |
orientationstring | landscape or portrait. By default portrait only when every destination is Instagram or TikTok. |
activityboolean | object | What shows on screen, as streamActivity. Kept for the room. |
startedBystring | Your id for who started it. |
startedByNamestring | Their display name. |
curl -X POST https://api.inlinemeet.com/v1/rooms/product-launch/streams \
-H "Authorization: Bearer $INLINEMEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"destinations": [
{ "platform": "youtube", "key": "'$YOUTUBE_STREAM_KEY'", "name": "Our channel" },
{ "platform": "linkedin", "server": "rtmps://….linkedin.com:443/live", "key": "'$LINKEDIN_KEY'" }
]
}'Returns 201 and the stream, starting. Someone has to be in the call (409 room_not_live otherwise), and only one stream runs in a room at a time — add destinations to it instead (409 stream_in_progress). If every recorder is busy you get 202 and the stream waiting: it starts on its own.
{
"id": "6702b1c4e1b2c3d4e5f60719",
"roomCode": "product-launch",
"status": "live",
"orientation": "landscape",
"startedBy": "host-7",
"startedByName": "Alex Morgan",
"startedAt": "2026-10-09T16:00:02.000Z",
"liveAt": "2026-10-09T16:00:06.000Z",
"endedAt": null,
"durationSec": 1260,
"error": null,
"destinations": [
{ "id": "d_3f9a1c22b0", "platform": "youtube", "name": "Our channel",
"server": "rtmps://a.rtmps.youtube.com:443/live2", "keyHint": "…x7q2", "status": "live", "error": null, "savedId": null },
{ "id": "d_81be0d4c19", "platform": "facebook", "name": "Facebook",
"server": "rtmps://live-api-s.facebook.com:443/rtmp", "keyHint": "…AbC9", "status": "failed",
"error": "The platform refused the stream. Check the stream key.", "savedId": null }
]
}2. Add or take off destinations while live
Body { destinations }, as above: they join the stream as it is.
Takes one off; the others carry on. Taking off the last one still on air stops the stream.
3. Stop
Takes it off every platform at once. Stopping twice is harmless. A stream also ends when the call does — everyone left, a moderator ended it for everyone, or you closed the room.
Find it
{ stream, streams, saved }: the stream running now (or null), the room’s recent ones, and your saved destinations. GET /v1/rooms/:code also carries the running stream’s id as streamId.
Saved destinations
A weekly webinar shouldn’t need its keys pasted every week. Save a destination — save: true when going live, or here — and stream to it by savedId. Its key is never returned, only keyHint.
Webhooks
Your webhook hears stream.started when a stream goes on air, stream.ended when it ends, and stream.failed when it couldn’t go on — each with the stream, as above, under data.stream.
Good to know
- Set the platform up first. Most platforms wait for the stream before going live to your audience; YouTube and Facebook can start the broadcast automatically, or let you press their own Go live once they’re receiving it.
- Everyone in the call knows. The Live pill shows for as long as it runs, and someone arriving later is told the call is public.
- Breakout rooms aren’t streamed — only the main room, as for recordings.
A live stream makes what’s said and shared in the call public. Tell people before you go live, and for webinars, consider webinar mode, where only the hosts and the people they bring on stage are seen and heard.