pub domain
Events intended to be received by any viewer of a Crowd Control streamer, including clients managing a session, reacting to the session, or a literal human viewer in the extension.
Payment information, e-mail addresses and other sensitive fields omitted; see the prv domain for the unredacted equivalents.
Subscribe with a pub/<ccUID> topic.
game-session-start type
The streamer started a session. Carries the full session record along with the game and pack being played.
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?stringgame-session-stop type
The streamer ended a session.
gameSessionIDGameSessionIDgame-session-pause type
The streamer paused or resumed the session. The session stays alive and visible to viewers; only ordering is blocked. gamePausedAt absent means resumed.
gameSessionIDGameSessionIDgamePausedAt?numbergamePausedUntil?numbercoin-exchange type
A viewer bought or was granted coins. To view the amount exchanged, refer to the prv event.
coinType'paid' | 'free'source?ExchangeSourcetransactionIDTransactionIDexample?booleananonymous?booleantimestampnumberlobby-user-update type
A viewer joined the lobby, or their lobby entry changed.
lobby-user-remove type
A viewer left the lobby.
ccUIDCrowdControlUserIDeffect-request type
A viewer is attempting to redeem coins for an effect.
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?booleantimed-effect-update type
A timed effect started, paused, resumed or ended. timeRemaining is in milliseconds.
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?booleaneffect-success type
An effect was applied successfully.
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?booleaneffect-refund type
The streamer has manually requested the cost of the effect be refunded.
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?booleaneffect-retry type
The streamer has manually requested an effect attempt to be executed again.
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?booleaneffect-failure type
An effect failed. temporary marks a failure that may still be retried.
GameSessionPublicEffectFailurePayload
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?booleaneffect-payback type
The streamer played a disrupt back against the viewer who requested an effect. paybackStatus tracks the attempt through its lifecycle.
GameSessionPublicEffectPaybackPayload
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.
game-session-menu-update type
A list of patches for effects in the menu. Each effect is guaranteed to have only effectID and type and should be merged onto existing matching effects.
game-session-menu-sync type
A list of patches for effects in the menu. It is not guaranteed to have every effect, but every effect is guaranteed to have its full payload, so you can replace existing matching effects.
game-session-menu-effects-deleted type
Effects that no longer exist and should be dropped from the menu.
game-session-menu-force-reload type
The menu changed too much to describe as a patch. Re-fetch the menu from the API.
This event carries no payload.
pro-subscription-update type
The streamer's Crowd Control Pro subscription became active or lapsed.
activebooleanbonus-coin-reset type
A viewer's bonus coin allowance was reset. resetAt is an ISO timestamp.
resetAtstringgame-session-ready-status type
gameSessionIDGameSessionIDgameStatenull | stringRaw pack gameStateChanged value when known; null while waiting for telemetry.
profile-link-success type
DEPRECATED
[Deprecated] A platform profile was linked to the account.
profileTypeValidLinkedProfileTypemergedIntoCcUID?stringPresent when the session account was merged into an existing account (reverse link).
profile-link-failure type
DEPRECATED
[Deprecated] A platform profile could not be linked.
profileTypeValidLinkedProfileTypeerrorstringprofile-unlink type
DEPRECATED
[Deprecated] A platform profile was unlinked from the account.
profileTypeValidLinkedProfileTypeuser-ban-update type
A viewer was banned or unbanned from the streamer's channel.
One of 2 shapes:
user-role-update type
A viewer gained or lost a role in the streamer's channel.
action'add' | 'remove'tiktok-coin-goal-update type
Broadcast by the host desktop app (via tiktok.publishCoinGoalProgress) so overlays can render live coin-goal progress bars.
