Video meetings and conferences
A video meeting on Orbit is a scheduled room — a persistent, named room on the Orbit Media stack that exists before anyone joins and outlives any single session. A scheduled room is built for groups, not a single peer-to-peer call: it carries a host, a capacity, a guest link, and an inbox entry, and it survives a hang-up so people can rejoin or a recording can live on. Reach for a scheduled room when you want a meeting — a standup, a sales call, a webinar, a training session — rather than a single peer-to-peer video.Two ways to run a meeting
The dashboard is the fastest path: open Rooms, name the room, optionally
set a time and capacity, and share the invite link. Use the API when the
meeting must be created from your own product or scheduled on a recurrence.
Create a meeting
Give the room a name — that is the label your guests and your inbox will use. Set scheduled_at to put it at a time, or leave it unset to start it now. max_participants caps the room from 2 up to 300; omit it to inherit your tenant’s participant ceiling.A meeting that repeats — a daily standup, a weekly sync — is one scheduled
room with a
recurrence_rule (an RFC 5545 RRULE value) rather than
separate rooms per occurrence. The calendar invite guests receive then carries
the full series, so it lands correctly in Gmail, Apple Mail, and Outlook.Bring people in, at the right permission level
Get a person in one of two ways. For a guest, mint an invite link and send it; they open the link, redeem it, and are placed in the room with no account and nothing to install. For someone whose meeting you own, callPOST /video/rooms-scheduled/:id/join to mint a per-participant token.
Whenever you join a participant, decide their permission tier rather than
assuming everyone is the same. The tier maps to what they may publish and see:
- host — full control; mute, spotlight, lock, and remove participants.
- panelist — can publish audio, video, and screen share; the working default for meeting attendees.
- viewer — can watch and hear but publish nothing.
- hidden_supervisor — joins silently for compliance listen-in; publishes and is listed nowhere.
role on a join is participant, so a guest cannot promote
themselves to host over the wire — host is only granted explicitly by an
operator or by the room creator’s own path.
string
default:"panelist"
Set per joiner.
viewer is right for an audience, panelist for a working
attendee, and host only for a meeting moderator.Turn the room into a registration-gated webinar
When the audience is people you do not invite one by one — a course, a product launch, a lead-gen signup page — open registration on the room instead of handing out invite links. Registrants send their name and email on a form you shape, and you decide who gets in before the session starts. In the dashboard this lives in Voice → Video → Webinars; over the API it is a small set of routes under the room:enabled— open or close the gate. Closing registration stops new signups without touching people already on the list.require_approval— when on, new registrants wait aspendinguntil you approve them; when off, they are approved automatically until the capacity is reached.capacity— the maximum number of approved attendees. Registrations past the cap land on the waitlist instead of being approved. Leave it unset for no cap.custom_fields— extra questions the registration form asks, each with a stablekey, a humanlabel, and arequiredflag.
Work the registrant list
GET /video/rooms-scheduled/:id/registration returns the config, the full
registrant list, and a registered-vs-attended report in one call. Each
registrant moves through pending → approved (or straight to approved
when approval is off), with waitlisted, declined, and blocked for
the ones you keep out. Every registrant carries a per-person
join_token — copy it from the dashboard row’s Manage menu and hand
it to that one attendee, rather than sharing a single link with everyone.
Check attendees in and read the report
When the webinar starts, check people in as they arrive:report block then answers the follow-up
question every webinar host has — did the registrants show up. It
carries totals, the approved count against your capacity, the attended
count, no-shows, and an attendance_rate (attended over approved). In
the dashboard the same numbers sit as stat cards above the registrant
list, so registered-vs-attended is visible without running a query.
Where this sits
The webinar gate is a layer on the scheduled room, not a separate product. Video covers the room itself — join tokens, recording, moderation, broadcast; this guide’s webinar routes only decide who may join it. Create and schedule the room as above, then gate it.Capacity and recording behave like a meeting, not a one-off call
max_participants is a real participant ceiling (2–300), not a dialer fan-out
limit. Recording decisions are first-class: turn recording on at create with
recording_enabled, start and stop it on the live room, and exclude an
individual participant from the artifact if they ask not to be recorded.
Because a join can carry allow_recording: false, a participant can opt out
before their media ever lands in an egress.
When an operator needs the meeting to end at a fixed bound, max_duration_minutes
opts in a hard auto-end — useful for rooms left open accidentally.
Search your meeting catalog
Once your tenant accumulates rooms, finding a specific meeting becomes a lookup problem rather than a creation problem. The rooms list — the sameGET /video/rooms-scheduled index the dashboard Rooms page renders —
accepts a keyword query parameter that filters the returned rooms by
case-insensitive substring match against the room name and its
room_sid (the internal room identifier, useful when you have an
Orbit Media-side reference).
keyword— 1 to 120 characters. LIKE/ILIKE metacharacters (%,_,\) are treated as literal text, so guests cannot widen the match with wildcards.status— still applies, so combinekeywordwithscheduled/live/endedto search only the relevant slice.limit— the page size; defaults to 100, maximum 500.
keyword parameter — the list refreshes as you type,
so you can jump to a room’s join page or copy its invite link without
scrolling through history.
The keyword filter matches on the room name and
room_sid, not on the
transcript content or participant list. To search what was actually said
during a meeting, query the room’s transcript endpoint
(GET /video/rooms-scheduled/:id/transcripts) and search client-side.Meeting URLs on the list projection
Every room returned by the list route carries ameeting_url field — a
relative join path (e.g. /join/meeting/weekly-sales-sync) that resolves
against your dashboard origin. The dashboard uses this field for the
Share and open-actions on the Rooms page, and a workspace’s own links
can safely copy it without reconstructing the public join route. Combine
it with your current origin and locale, or use the returned path directly
when both are relative to the same dashboard host.
Where to go next
- Persistent video rooms — create a room that stays open for up to 10 years and re-opens automatically when the next participant joins.
- Room access tokens — what an access token grants and exactly where to pass it to connect over WebRTC.
- Transcript-verified video-only gate — how audio-only rooms re-open camera and screen-share only after the transcript gate verifies a speaker, and why the gate never turns a subscriber into a publisher.
- Monitor in-call video quality — pre-join preflight checks, the live per-participant quality snapshot, and the post-session QoE report.
- Video API reference — the full scheduled-room endpoint surface, including recording, moderation, and simulive.