Shared Schemas
Types used in more than one location.
CoinExchangePayload
amountnumberbonus?numbercoinType'paid' | 'free'source?ExchangeSourcetransactionIDTransactionIDexample?booleananonymous?booleantimestampnumberCrowdControlUserChannelRoleType
'moderator' | 'editor'
CSSProperties
A block of CSS declarations, as a plain object: keys are CSS property names in camelCase (backgroundColor for background-color) and values are the corresponding CSS values, as strings or — for unitless properties — numbers. Every property is optional. See the MDN CSS reference for the full list and what each one accepts.
Record<string, string>
EffectRequestParameters
type'options' | 'hex-color'titlestringvaluestringname?stringExchangeSource
'tiltify' | 'stripe' | 'paypal' | 'twitch-bits' | 'twitch-channel-points-redemption' | 'twitch-sub' | 'twitch-charity' | 'vpzone-channel-points-redemption'
GameDetails
gameIDstringGamePackEffectType
'input' | 'image' | 'game' | 'video' | 'audio' | 'live' | 'streamerbot' | 'human' | 'streamdeck' | 'chance'
GameRecord
gameIDGameIDnamestringimage?stringGameSessionEffectPaybackStatus
Lifecycle of a streamer-initiated payback against the requester of an effect: sent when dispatched to the viewer's extension, then exactly one of landed (playback confirmed, coins credited), failed, or expired (no ack).
'sent' | 'landed' | 'failed' | 'expired'
GameSessionEffectPayload
Another VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
pooled?booleanpricenumberunitPricenumberquantity?numberrequestIDGameSessionRequestIDexample?booleanlocalTimestamp?numberadmin?booleanWhether the requester is an administrator.
viaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
message?stringmessageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleantimestampnumberGameSessionEffectPayloadEffectData
One of 10 shapes:
GameSessionMenuEffect
One of 10 shapes:
GameSessionPrivateEffectPaybackPayload
Another VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
pooled?booleanpricenumberunitPricenumberquantity?numberrequestIDGameSessionRequestIDexample?booleanlocalTimestamp?numberadmin?booleanWhether the requester is an administrator.
viaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
message?stringmessageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleantimestampnumberpaybackStatusGameSessionEffectPaybackStatuscoinReward?numberCoins credited to the viewer when the payback lands.
paybackEffectName?stringDisplay name of the disrupt played against the viewer.
paybackEffectID?stringIdentity of the disrupt played against the viewer — lets the targeted viewer report custom disrupts straight from their activity feed.
paybackPackID?stringpaybackPackType?'user' | 'crowd-control'paybackExpiresAt?numberEpoch ms when a sent payback expires without an ack.
GameSessionPrivateTimedEffectUpdatePayload
timeRemainingnumberAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
pooled?booleanpricenumberunitPricenumberquantity?numberrequestIDGameSessionRequestIDexample?booleanlocalTimestamp?numberadmin?booleanWhether the requester is an administrator.
viaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
message?stringmessageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleantimestampnumberGameSessionPublicEffectFailurePayload
temporary?booleanmessage?stringadmin?booleanWhether the requester is an administrator.
quantity?numberpooled?booleanexample?booleantimestampnumberAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
requestIDGameSessionRequestIDlocalTimestamp?numberviaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
messageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleanGameSessionPublicEffectPaybackPayload
message?stringadmin?booleanWhether the requester is an administrator.
quantity?numberpooled?booleanexample?booleantimestampnumberAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
requestIDGameSessionRequestIDlocalTimestamp?numberviaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
messageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleanpaybackStatusGameSessionEffectPaybackStatuscoinReward?numberCoins credited to the viewer when the payback lands.
paybackEffectName?stringDisplay name of the disrupt played against the viewer.
paybackEffectID?stringIdentity of the disrupt played against the viewer — lets the targeted viewer report custom disrupts straight from their activity feed.
paybackPackID?stringpaybackPackType?'user' | 'crowd-control'paybackExpiresAt?numberEpoch ms when a sent payback expires without an ack.
GameSessionPublicEffectPayload
message?stringadmin?booleanWhether the requester is an administrator.
quantity?numberpooled?booleanexample?booleantimestampnumberAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
requestIDGameSessionRequestIDlocalTimestamp?numberviaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
messageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleanGameSessionPublicEffectPayloadEffectData
One of 10 shapes:
GameSessionPublicTimedEffectUpdatePayload
timeRemainingnumbermessage?stringadmin?booleanWhether the requester is an administrator.
quantity?numberpooled?booleanexample?booleantimestampnumberAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
requestIDGameSessionRequestIDlocalTimestamp?numberviaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
messageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleanGameSessionReadyStatusPhase
Live game ready / pending pill state from the host desktop app (native client games).
'wait' | 'ready' | 'pending'
GameSessionTimedEffectStatus
'begin' | 'end' | 'pause' | 'resume'
LobbyStatus
'left' | 'in-session' | 'checklist-green' | 'checklist-red'
LobbyUser
ccUIDCrowdControlUserIDimagestringnamestringprofileValidUserRecordProfileTypeoriginIDstringstatusLobbyStatusjoinedAtstringchannel?stringThe name or ID of the channel that the user streams on. May be missing for old lobbies or non-streaming platforms.
MinimalUserRecord
NativeClientCommandResponsePayload
requestIdstringmethodstringargs?unknownrpcRecord<string, unknown>packMessages?Record<string, unknown>[]PrivateEffectFailurePayload
temporary?booleanAnother VIEWER this effect was aimed at (viewer-to-viewer paybacks). target remains the streamer on these so this is what identifies who the effect was actually played on. Present only on viewer-aimed effects.
pooled?booleanpricenumberunitPricenumberquantity?numberrequestIDGameSessionRequestIDexample?booleanlocalTimestamp?numberadmin?booleanWhether the requester is an administrator.
viaTwitchExtension?booleanTrue when the request was sent from the Twitch extension. Paybacks can only reach viewers inside the extension, so the feed uses this to decide whether the payback action is offered as available.
paybackable?booleanTrue when a payback can be offered on this request (extension-sourced and the viewer allowed paybacks at request time). The feed hides the payback action when this is unset on an extension-sourced request; the server re-checks the live setting on click. The raw opt-out preference is never exposed.
paybackWindowEndsAt?numberEpoch ms deadline for the streamer to send a payback (acceptedAt + PAYBACK_SEND_WINDOW_MS). Server-enforced. Only set on paybackable success payloads.
When set, the refund or retry was performed by someone other than the host (e.g. an editor).
message?stringmessageID?stringSet on a parent effect's payloads once CHILD effect requests have been linked to it — chance (wheel/cards) winners and attachment-triggered effects. Lets the session event queue render the children nested under the parent entry. Carries only display info (no payment data).
parentRequestID?GameSessionRequestIDSet on payloads of CHILD effect requests (chance winners / linked attachment effects) — the ID of the parent request. The client uses this to route the child's timed updates into the parent's nested child row.
refundable?booleanTrue when this effect can be refunded (has a transaction and is not pooled). Allows host/editors to show the refund button without exposing payment details in public payloads.
notifyAfter?numberDelay 'success' notification in the extension by these milliseconds.
anonymous?booleantimestampnumberPublicCoinExchangePayload
coinType'paid' | 'free'source?ExchangeSourcetransactionIDTransactionIDexample?booleananonymous?booleantimestampnumberPublicGameSessionStartPayload
updatedAtstringgamePackIDstringccUIDstringstatus?stringendedAt?stringcreatedAtstringgameSessionIDstringprofileType'tiktok' | 'twitch' | 'youtube' | 'discord'additionalGamePackIDs?string[]menuNamestringstreamGame?stringgamePausedAt?numberMilliseconds since epoch the streamer paused the session (absent/0 means not paused). A paused session still exists and viewers still see it, but no effect can be ordered.
gamePausedUntil?numberMilliseconds since epoch the session should auto-resume at. Enforced server-side (lazily on session reads) so a crashed desktop app can never strand a session as paused.
parentGameSessionID?stringbankIDstringisHostOnly?booleanemailedAt?stringPublicUserBanUpdateBanPayload
type'ban'updatedAtstringccUIDstringcreatedAtstringscopestringreason?stringPublicUserBanUpdateUnbanPayload
type'unban'ccUIDstringPublicUserRoleUpdatePayload
action'add' | 'remove'PubSubEventTopic
A subscription topic, formatted as <domain>/<scope>/<target> or <domain>/<target>, where scope and target are each either a Crowd Control user ID or *. Every domain can be subscribed to except direct, which is reserved for messages the server addresses to a single connection. Some domains do not support/utilize targets.
string
PurchaseTransactionPayments
RequiredPartialGameSessionMenu
excludePaidEffectsFromRateLimit?booleanRpcCall
One of the calls documented under RPC calls. method selects which, and args is shaped to match it. See the dedicated doc page for more information.
idstringA client-generated identifier for this call.
type'call'methodstringThe RPC method being invoked.
argsunknown[]Arguments for method.
SanitizedSourceDetails
One of 22 shapes:
SanitizedUserRecord
SortableString
"String" that can optionally choose to supply an object containing a custom string to be used for sorting its parent. Max 64 characters.
One of 2 shapes, including:
string
SourceDetails
One of 22 shapes:
TikTokCoinGoalProgress
Live progress of a single TikTok coin-goal trigger (tracked by the host desktop app).
keystringStable accumulator key for the goal (trigger groupID || uuid).
namestringDisplay name for the goal (trigger name or effect name).
image?stringOptional effect image URL for display.
targetnumberCoin amount required to trigger.
raisednumberCoins accumulated so far toward the target.
UserDisplay
ccUID?CrowdControlUserIDnamestringsafeNamestringimage?stringOptional portrait URL for synthetic sources (e.g. chaos mode bot) shown like a user avatar.
UserDisplayBadge
type'platform' | 'role'urlstringlabelstringUserRecord
subscriptions('max' | 'pro')[]roles('admin' | 'ambassador' | 'trial' | 'debug' | 'dev' | 'event-host' | 'partner' | 'staff' | 'hog' | 'subscription-blocked' | 'alternate-tiktok' | 'tiktoklegacy' | 'twitch-onboarded' | 'alt-ban' | 'alt-exempt')[]imagestringsplit?numberccUIDstringnamestringprofile'tiktok' | 'twitch' | 'youtube' | 'discord' | 'tiktok-gifter'originIDstringValidLinkedProfileType
'tiktok' | 'twitch' | 'vpzone' | 'youtube' | 'discord' | 'pulsoid'
ValidUserRecordProfileType
'tiktok' | 'twitch' | 'youtube' | 'discord' | 'tiktok-gifter'
