Platforms this livestream is configured to broadcast to (UI toggles).
Per-platform-only options (e.g. YouTube categoryId, live comment settings).
OptionalscheduledISO 8601 scheduled start time; undefined while still a draft.
OptionalscheduledIANA timezone for interpreting scheduledStartTime in the schedule picker (e.g. America/Toronto).
OptionalthumbnailR2 object key for a custom thumbnail image (JPG or PNG), or undefined if none.
OptionalthumbnailMIME type of the thumbnail object (for platform upload and preview).
OptionalthumbnailEphemeral presigned GET URL for the livestream form preview. Not stored in persistent storage.
OptionalyoutubeYouTube liveBroadcasts resource id after the broadcast is created.
OptionalyoutubeYouTube liveStreams resource id bound to this broadcast.
OptionalkeyWhich connected-account stream key slot is assigned (main or temp).
OptionalkeyISO timestamp when a temp key slot was promoted to main during reconciliation.
OptionalkeyISO timestamp when a main-slot livestream never went live and was moved to temp / ended so a queued livestream could take the main key.
OptionalautoWhen true on a temp-slot livestream, a background job promotes it to the main key before start. Defaults to enabled for temp-slot rows when unset.
OptionalautoMinutes before scheduled start to auto-promote temp → main (5–60, step 5; default 30).
OptionalyoutubeRaw YouTube liveBroadcasts.status.lifeCycleStatus value (polled later).
OptionalfacebookFacebook LiveVideo object id; created at arm time, not at schedule time.
OptionalfacebookRTMPS ingest URL returned when the Facebook LiveVideo is created
(rtmps://live-api-s.facebook.com:443/rtmp/FB-<id>-0-<token>). Single-use per object;
there is no reusable/persistent equivalent. Encrypted at rest in the livestream document JSON.
OptionalfacebookISO timestamp when the Facebook LiveVideo object was created (arm time).
OptionalfacebookRaw Facebook LiveVideo.status value (UNPUBLISHED, LIVE_NOW, VOD; polled later).
Persistence system attribute (ISO string).
Persistence system attribute (ISO string).
Scheduled livestream document stored in the
livestreamscollection.YouTube key-slot lifecycle: A new livestream starts as a
draftwith noscheduledStartTimeorkeySlot. When the user schedules it, the server assigns either themainortempYouTube stream key from the connected account. If the main key is already in use, scheduling usestempinstead. A background reconciliation job may later promotetemp→mainwhen the main slot frees up (keySwapPromotedAtrecords when that promotion occurred).keySlotand related fields are YouTube-only; Facebook livestreams never use them.Facebook arm lifecycle: Facebook has no main/temp stream-key concept. Only one Facebook livestream per user may be "armed" (have a real
facebookLiveVideoId) at a time. The first scheduled Facebook livestream creates itsLiveVideoimmediately; additional queued rows create theirs automatically at the auto-preparation window before start (autoPromoteToMainKey/autoPromoteToMainKeyMinutes, shared with YouTube temp→main promotion timing).