Skip to content
Live streaming

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

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.

PlatformplatformServerWhere to find the key
YouTubeyoutubertmps://a.rtmps.youtube.com:443/live2YouTube Studio → Create → Go live → Stream. Copy the stream key.
Facebookfacebookrtmps://live-api-s.facebook.com:443/rtmpFacebook → Live video → Streaming software. Copy the stream key — a persistent one can be used again next time.
InstagraminstagramCopy it with the keyInstagram on a computer: Create → Live video → set it up. Copy the stream URL and the stream key.
LinkedInlinkedinCopy it with the keyLinkedIn → Create an event or Go live → Custom stream (RTMP). Copy the stream URL and the stream key.
Twitchtwitchrtmp://live.twitch.tv/appTwitch Creator Dashboard → Settings → Stream. Copy the primary stream key.
XxCopy it with the keyX Media Studio → Producer → Sources → Create source (RTMP). Copy the RTMP URL and the stream key.
TikToktiktokCopy it with the keyTikTok LIVE Center → Go LIVE with streaming software. Copy the server URL and the stream key.
KickkickCopy it with the keyKick dashboard → Settings → Stream URL & Key. Copy both.
Other (RTMP)customCopy it with the keyAny 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.

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 call

A 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 statusMeans
waitingEvery recorder was busy. It starts on its own as soon as one has room, usually within a couple of minutes.
startingBeing set up, and connecting to the platforms.
liveOn air: at least one platform has it.
endedStopped, or the call ended.
failedEvery destination refused it, or it couldn’t be kept going. error says why.
Destination statusMeans
connectingBeing connected to — or reconnected, after a hiccup.
liveThe platform is receiving it.
failedThe platform refused it or dropped it for good. error says why.
removedTaken off the stream while it ran.
endedThe 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

POST/v1/rooms/:code/streams
BodyDescription
destinationsarrayUp 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.
orientationstringlandscape or portrait. By default portrait only when every destination is Instagram or TikTok.
activityboolean | objectWhat shows on screen, as streamActivity. Kept for the room.
startedBystringYour id for who started it.
startedByNamestringTheir 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.

GET /v1/rooms/:code/streams/:id
{
  "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

POST/v1/rooms/:code/streams/:id/destinations

Body { destinations }, as above: they join the stream as it is.

DELETE/v1/rooms/:code/streams/:id/destinations/:destinationId

Takes one off; the others carry on. Taking off the last one still on air stops the stream.

3. Stop

POST/v1/rooms/:code/streams/:id/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

GET/v1/rooms/:code/streams

{ 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.

GET/v1/stream-destinations
POST/v1/stream-destinations
DELETE/v1/stream-destinations/:id

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.