Skip to main content

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.
The response returns the room plus a host_token for the creator, so you can join right away without a second call. It also creates an inbox conversation for the room.
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, call POST /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.
The default 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 as pending until 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 stable key, a human label, and a required flag.
Scheduled room or webinar? Reach for a plain scheduled room when the audience is a known group — a standup, a sales call, a team training — and invite links are enough. Reach for a webinar when signup is open to people outside that group and you need a front door: approval, a cap, custom questions, and per-attendee attendance. A weekly team sync is a room; a public launch broadcast is a webinar.

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.
The same shape drives the Webinars → Registration tab in the dashboard: pick the room, flip the config, and the registrant table lists each attendee’s status, registration date, and attended flag. From the row’s Manage menu you approve/decline/waitlist/block, copy the join token, or remove the registrant — removing them also kills their join token.

Check attendees in and read the report

When the webinar starts, check people in as they arrive:
The registration read’s 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.
If a join returns 503 SERVICE_UNAVAILABLE, Orbit Media is not configured on your cluster — every video meeting endpoint depends on it. Check the cluster configuration and retry; do not fall back to the one-to-one voice flow as a substitute.

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 same GET /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 combine keyword with scheduled/live/ended to search only the relevant slice.
  • limit — the page size; defaults to 100, maximum 500.
The search is tenant-scoped: results are always rooms in your own tenant, never another tenant’s. On the dashboard, the Rooms page’s search field sends the same 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 a meeting_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.