twitch-eventsub-client
Version:
A Twitch EventSub WebSocket client for Node.js
1,798 lines (1,796 loc) • 119 kB
TypeScript
import { EventEmitter } from 'events';
import { AxiosError } from 'axios';
interface KeepaliveMessageMetadata extends EventSubMessageMetadata {
message_type: 'session_keepalive';
}
type KeepaliveMessagePayload = {};
type KeepaliveMessage = EventSubMessage<KeepaliveMessageMetadata, KeepaliveMessagePayload>;
interface AutomodMessageHoldEventV1 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message: [
{
text: string;
fragments: [
{
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
category: string;
level: number;
held_at: string;
}
interface AutomodMessageHoldEventV2 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message: [
{
text: string;
fragments: [
{
type: 'text' | 'emote' | 'cheermote';
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
held_at: string;
reason: 'automod' | 'blocked_term';
automod: {
category: string;
level: number;
boundaries: [
{
start_pos: number;
end_pos: number;
}
];
blocked_term: {
terms_found: [
{
term_id: string;
boundary: {
start_pos: number;
end_pos: number;
};
owner_broadcaster_user_id: string;
owner_broadcaster_user_login: string;
owner_broadcaster_user_name: string;
}
];
} | null;
} | null;
}
interface AutomodMessageUpdateEventV1 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
message_id: string;
message: [
{
text: string;
fragments: [
{
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
category: string;
level: number;
status: 'Approved' | 'Denied' | 'Expired';
held_at: string;
}
interface AutomodMessageUpdateEventV2 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
message_id: string;
message: [
{
text: string;
fragments: [
{
type: 'text' | 'emote' | 'cheermote';
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
status: 'Approved' | 'Denied' | 'Expired';
held_at: string;
reason: 'automod' | 'blocked_term';
automod: {
category: string;
level: number;
boundaries: [
{
start_pos: number;
end_pos: number;
}
];
blocked_term: {
terms_found: [
{
term_id: string;
boundary: {
start_pos: number;
end_pos: number;
};
owner_broadcaster_user_id: string;
owner_broadcaster_user_login: string;
owner_broadcaster_user_name: string;
}
];
} | null;
} | null;
}
interface AutomodSettingsUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
bullying: number;
overall_level: number | null;
disability: number;
race_ethnicity_or_religion: number;
misogyny: number;
sexuality_sex_or_gender: number;
aggression: number;
sex_based_terms: number;
swearing: number;
}
interface AutomodTermsUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
action: 'add_permitted' | 'remove_permitted' | 'add_blocked' | 'remove_blocked';
from_automod: boolean;
terms: string[];
}
interface ChannelAdBreakBeginEvent {
duration_seconds: number;
started_at: string;
is_automatic: boolean;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
requester_user_id: string;
requester_user_login: string;
requester_user_name: string;
}
interface ChannelBanEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
reason: string;
banned_at: string;
ends_at: string | null;
is_permanent: boolean;
}
interface ChannelBitsUseEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
bits: number;
type: 'cheer' | 'power_up';
message: [
{
text: string;
type: 'text' | 'cheermote' | 'emote';
fragments: [
{
text: string;
emote: {
id: string;
emote_set_id: string;
owner_id: string;
format: string[];
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
] | null;
power_up: {
type: 'message_effect' | 'celebration' | 'gigantify_an_emote';
emote: {
id: string;
name: string;
};
message_effect_id: string;
};
}
interface ChannelChatClearEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcast_user_login: string;
}
interface ChannelChatClearUserMessagesEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcast_user_login: string;
target_user_id: string;
target_user_login: string;
target_user_name: string;
}
interface ChannelChatMessageEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcast_user_login: string;
chatter_user_id: string;
chatter_user_name: string;
chatter_user_login: string;
message_id: string;
message: {
text: string;
fragments: [
{
type: 'text' | 'cheermote' | 'emote' | 'mention';
text: string;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
emote: {
id: string;
emote_set_id: string;
owner_id: string;
format: string[];
} | null;
mention: {
user_id: string;
user_name: string;
user_login: string;
} | null;
}
];
};
message_type: 'text' | 'channel_points_highlighted' | 'channel_points_sub_only' | 'user_intro' | 'power_ups_message_effect' | 'power_ups_gigantified_emote';
badges: [
{
set_id: string;
id: string;
info: string;
cheer: {
bits: number;
} | null;
}
];
color: string;
reply: {
parent_message_id: string;
parent_message_body: string;
parent_user_id: string;
parent_user_name: string;
parent_user_login: string;
thread_message_id: string;
thread_user_id: string;
thread_user_name: string;
thread_user_login: string;
} | null;
channel_points_custom_reward_id: string | null;
source_broadcaster_user_id: string | null;
source_broadcaster_user_login: string | null;
source_broadcaster_user_name: string | null;
source_message_id: string | null;
source_badges: [
{
set_id: string;
id: string;
info: string;
}
] | null;
}
interface ChannelChatMessageDeleteEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
target_user_id: string;
target_user_name: string;
target_user_login: string;
message_id: string;
}
interface ChannelChatNotificationEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
chatter_user_id: string | null;
chatter_user_name: string | null;
chatter_user_login: string | null;
chatter_is_anonymous: boolean;
color: string;
badges: [
{
set_id: string;
id: string;
info: string;
}
];
system_message: string;
message_id: string;
message: {
text: string;
fragments: [
{
type: 'text' | 'cheermote' | 'emote' | 'mention';
text: string;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
emote: {
id: string;
emote_set_id: string;
owner_id: string;
format: string[];
} | null;
mention: {
user_id: string;
user_name: string;
user_login: string;
} | null;
}
];
};
notice_type: 'sub' | 'resub' | 'sub_gift' | 'community_sub_gift' | 'gift_paid_upgrade' | 'prime_paid_upgrade' | 'raid' | 'unraid' | 'pay_it_forward' | 'announcement' | 'bits_badge_tier' | 'charity_donation' | 'shared_chat_sub' | 'shared_chat_resub' | 'shared_chat_sub_gift' | 'shared_chat_community_sub_gift' | 'shared_chat_gift_paid_upgrade' | 'shared_chat_prime_paid_upgrade' | 'shared_chat_raid' | 'shared_chat_pay_it_forward' | 'shared_chat_announcement';
sub: {
sub_tier: number;
is_prime: boolean;
duration_months: number;
} | null;
resub: {
cumulative_months: number;
duration_months: number;
streak_months: number;
sub_tier: number;
is_prime: boolean;
is_gift: boolean;
gifter_is_anonymous: boolean;
gifter_user_id: string | null;
gifter_user_name: string | null;
gifter_user_login: string | null;
} | null;
sub_gift: {
duration_months: number;
cumulative_total: number | null;
recipient_user_id: string;
recipient_user_name: string;
recipient_user_login: string;
sub_tier: number;
community_gift_id: string | null;
} | null;
community_sub_gift: {
id: string;
total: number;
sub_tier: number;
cumulative_total: number | null;
} | null;
gift_paid_upgrade: {
gifter_is_anonymous: boolean;
gifter_user_id: string | null;
gifter_user_name: string | null;
gifter_user_login: string | null;
} | null;
prime_paid_upgrade: {
sub_tier: number;
} | null;
pay_it_forward: {
gifter_is_anonymous: boolean;
gifter_user_id: string | null;
gifter_user_name: string | null;
gifter_user_login: string | null;
};
raid: {
user_id: string;
user_name: string;
user_login: string;
viewer_count: number;
profile_image_url: string;
} | null;
unraid: null;
announcement: {
color: string;
} | null;
bits_badge_tier: {
tier: number;
} | null;
charity_donation: {
charity_name: string;
amount: {
value: number;
decimal_place: number;
currency: string;
};
} | null;
source_broadcaster_user_id: string | null;
source_broadcaster_user_name: string | null;
source_broadcaster_user_login: string | null;
source_message_id: string | null;
source_badges: [
{
set_id: string;
id: string;
info: string;
}
] | null;
shared_chat_sub: {
sub_tier: number;
is_prime: boolean;
duration_months: number;
} | null;
shared_chat_resub: {
cumulative_months: number;
duration_months: number;
streak_months: number;
sub_tier: number;
is_prime: boolean;
is_gift: boolean;
gifter_is_anonymous: boolean;
gifter_user_id: string;
gifter_user_name: string;
gifter_user_login: string;
} | null;
shared_chat_sub_gift: {
duration_months: number;
cumulative_total: number | null;
recipient_user_id: string;
recipient_user_name: string;
recipient_user_login: string;
sub_tier: number;
community_gift_id: string | null;
} | null;
shared_chat_community_sub_gift: {
id: string;
total: number;
sub_tier: number;
cumulative_total: number | null;
} | null;
shared_chat_gift_paid_upgrade: {
gifter_is_anonymous: boolean;
gifter_user_id: string | null;
gifter_user_name: string | null;
gifter_user_login: string | null;
} | null;
shared_chat_prime_paid_upgrade: {
sub_tier: number;
} | null;
shared_chat_pay_it_forward: {
gifter_is_anonymous: boolean;
gifter_user_id: string | null;
gifter_user_name: string | null;
gifter_user_login: string | null;
} | null;
shared_chat_raid: {
user_id: string;
user_name: string;
user_login: string;
viewer_count: number;
profile_image_url: string;
} | null;
shared_chat_announcement: {
color: string;
} | null;
}
interface ChannelChatSettingsUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
emote_mode: boolean;
follower_mode: boolean;
follower_mode_duration_minutes: number;
slow_mode: boolean;
slow_mode_wait_time_seconds: number;
subscriber_mode: boolean;
unique_chat_mode: boolean;
}
interface ChannelChatUserMessageHoldEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message: [
{
text: string;
fragments: [
{
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
}
interface ChannelChatUserMessageUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
status: 'approved' | 'denied' | 'invalid';
message_id: string;
message: [
{
text: string;
fragments: [
{
text: string;
emote: {
id: string;
emote_set_id: string;
} | null;
cheermote: {
prefix: string;
bits: number;
tier: number;
} | null;
}
];
}
];
}
interface ChannelSubscribeEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
tier: string;
is_gift: boolean;
}
interface ChannelCheerEvent {
is_anonymous: boolean;
user_id: string | null;
user_login: string | null;
user_name: string | null;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
message: string;
bits: number;
}
interface ChannelUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
title: string;
language: string;
category_id: string;
category_name: string;
content_classification_labels: string[];
}
interface ChannelUnbanEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
}
interface ChannelUnbanRequestCreateEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
text: string;
created_at: string;
}
interface ChannelUnbanRequestResolveEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
user_id: string;
user_login: string;
user_name: string;
resolution_text: string;
status: 'approved' | 'canceled' | 'denied';
}
interface ChannelFollowEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
followed_at: string;
}
interface ChannelRaidEvent {
from_broadcaster_user_id: string;
from_broadcaster_user_login: string;
from_broadcaster_user_name: string;
to_broadcaster_user_id: string;
to_broadcaster_user_login: string;
to_broadcaster_user_name: string;
viewers: number;
}
interface ChannelModerateEventV1 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
source_broadcaster_user_id: string;
source_broadcaster_user_login: string;
source_broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete';
followers: {
follow_duration_minutes: number;
} | null;
slow: {
wait_time_seconds: number;
} | null;
vip: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unvip: {
user_id: string;
user_login: string;
user_name: string;
} | null;
mod: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unmod: {
user_id: string;
user_login: string;
user_name: string;
} | null;
ban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
timeout: {
user_id: string;
user_login: string;
user_name: string;
reason: string;
expires_at: string;
} | null;
untimeout: {
user_id: string;
user_login: string;
user_name: string;
} | null;
raid: {
user_id: string;
user_login: string;
user_name: string;
viewer_count: number;
} | null;
unraid: {
user_id: string;
user_login: string;
user_name: string;
} | null;
delete: {
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message_body: string;
} | null;
automod_terms: {
action: 'add' | 'remove';
list: 'blocked' | 'permitted';
terms: string[];
from_automod: boolean;
} | null;
unban_request: {
is_approved: boolean;
user_id: string;
user_login: string;
user_name: string;
moderator_message: string;
} | null;
shared_chat_ban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_unban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_timeout: {
user_id: string;
user_login: string;
user_name: string;
reason: string;
expires_at: string;
} | null;
shared_chat_untimeout: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_delete: {
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message_body: string;
} | null;
}
interface ChannelModerateEventV2 {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
source_broadcaster_user_id: string;
source_broadcaster_user_login: string;
source_broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'warn' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete';
followers: {
follow_duration_minutes: number;
} | null;
slow: {
wait_time_seconds: number;
} | null;
vip: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unvip: {
user_id: string;
user_login: string;
user_name: string;
} | null;
mod: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unmod: {
user_id: string;
user_login: string;
user_name: string;
} | null;
ban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
unban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
timeout: {
user_id: string;
user_login: string;
user_name: string;
reason: string;
expires_at: string;
} | null;
untimeout: {
user_id: string;
user_login: string;
user_name: string;
} | null;
raid: {
user_id: string;
user_login: string;
user_name: string;
viewer_count: number;
} | null;
unraid: {
user_id: string;
user_login: string;
user_name: string;
} | null;
delete: {
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message_body: string;
} | null;
automod_terms: {
action: 'add' | 'remove';
list: 'blocked' | 'permitted';
terms: string[];
from_automod: boolean;
} | null;
unban_request: {
is_approved: boolean;
user_id: string;
user_login: string;
user_name: string;
moderator_message: string;
} | null;
warn: {
user_id: string;
user_login: string;
user_name: string;
reason: string | null;
chat_rules_cited: string[] | null;
} | null;
shared_chat_ban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_unban: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_timeout: {
user_id: string;
user_login: string;
user_name: string;
reason: string;
expires_at: string;
} | null;
shared_chat_untimeout: {
user_id: string;
user_login: string;
user_name: string;
} | null;
shared_chat_delete: {
user_id: string;
user_login: string;
user_name: string;
message_id: string;
message_body: string;
} | null;
}
interface ChannelModeratorAddEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
}
interface ChannelModeratorRemoveEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
}
interface ChannelGuestStarSessionBeginEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
session_id: string;
started_at: string;
}
interface ChannelGuestStarSessionEndEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
session_id: string;
started_at: string;
ended_at: string;
host_user_id: string;
host_user_name: string;
host_user_login: string;
}
interface ChannelGuestStarGuestUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
session_id: string;
moderator_user_id: string | null;
moderator_user_name: string | null;
moderator_user_login: string | null;
guest_user_id: string | null;
guest_user_name: string | null;
guest_user_login: string | null;
slot_id: string | null;
state: 'invited' | 'accepted' | 'ready' | 'backstage' | 'live' | 'removed';
host_user_id: string;
host_user_name: string;
host_user_login: string;
host_video_enabled: boolean | null;
host_audio_enabled: boolean | null;
host_volume: number | null;
}
interface ChannelGuestStarSettingsUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
is_moderator_send_live_enabled: boolean;
slot_count: number;
is_browser_source_audio_enabled: boolean;
group_layout: 'tiled' | 'screenshare' | 'horizontal_top' | 'horizontal_bottom' | 'vertical_left' | 'vertical_right';
}
interface ChannelPollBeginEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
choices: [
{
id: string;
title: string;
bits_votes: number;
channel_points_votes: number;
votes: number;
}
];
bits_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
channel_points_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
started_at: string;
ends_at: string;
}
interface ChannelPollProgressEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
choices: [
{
id: string;
title: string;
bits_votes: number;
channel_points_votes: number;
votes: number;
}
];
bits_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
channel_points_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
started_at: string;
ends_at: string;
}
interface ChannelPollEndEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
choices: [
{
id: string;
title: string;
bits_votes: number;
channel_points_votes: number;
votes: number;
}
];
bits_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
channel_points_voting: {
is_enabled: boolean;
amount_per_vote: number;
};
status: 'completed' | 'archived' | 'terminated';
started_at: string;
ended_at: string;
}
interface ChannelPointsAutomaticRewardRedemptionAddEventV1 {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
user_id: string;
user_login: string;
user_name: string;
id: string;
reward: {
type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock' | 'message_effect' | 'gigantify_an_emote' | 'celebration';
cost: number;
unlocked_emote: {
id: string;
name: string;
} | null;
};
message: {
text: string;
emotes: [
{
id: string;
begin: number;
end: number;
}
];
};
user_input: string | null;
redeemed_at: string;
}
interface ChannelPointsAutomaticRewardRedemptionAddEventV2 {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
user_id: string;
user_login: string;
user_name: string;
id: string;
reward: {
type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock';
channel_points: number;
emote: {
id: string;
name: string;
} | null;
};
message: {
text: string;
type: 'text' | 'emote';
emotes: [
{
id: string;
}
] | null;
} | null;
redeemed_at: string;
}
interface ChannelPointsCustomRewardAddEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
is_enabled: boolean;
is_paused: boolean;
is_in_stock: boolean;
title: string;
cost: number;
prompt: string;
is_user_input_required: boolean;
should_redemptions_skip_request_queue: boolean;
max_per_stream: {
is_enabled: boolean;
value: number;
};
max_per_user_per_stream: {
is_enabled: boolean;
value: number;
};
background_color: string;
image: {
url_1x: string;
url_2x: string;
url_4x: string;
} | null;
default_image: {
url_1x: string;
url_2x: string;
url_4x: string;
};
global_cooldown: {
is_enabled: boolean;
seconds: number;
};
cooldown_expires_at: string | null;
redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardUpdateEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
is_enabled: boolean;
is_paused: boolean;
is_in_stock: boolean;
title: string;
cost: number;
prompt: string;
is_user_input_required: boolean;
should_redemptions_skip_request_queue: boolean;
max_per_stream: {
is_enabled: boolean;
value: number;
};
max_per_user_per_stream: {
is_enabled: boolean;
value: number;
};
background_color: string;
image: {
url_1x: string;
url_2x: string;
url_4x: string;
} | null;
default_image: {
url_1x: string;
url_2x: string;
url_4x: string;
};
global_cooldown: {
is_enabled: boolean;
seconds: number;
};
cooldown_expires_at: string | null;
redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardRemoveEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
is_enabled: boolean;
is_paused: boolean;
is_in_stock: boolean;
title: string;
cost: number;
prompt: string;
is_user_input_required: boolean;
should_redemptions_skip_request_queue: boolean;
max_per_stream: {
is_enabled: boolean;
value: number;
};
max_per_user_per_stream: {
is_enabled: boolean;
value: number;
};
background_color: string;
image: {
url_1x: string;
url_2x: string;
url_4x: string;
} | null;
default_image: {
url_1x: string;
url_2x: string;
url_4x: string;
};
global_cooldown: {
is_enabled: boolean;
seconds: number;
};
cooldown_expires_at: string | null;
redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardRedemptionAddEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
user_id: string;
user_login: string;
user_name: string;
user_input: string | null;
status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled';
reward: {
id: string;
title: string;
cost: number;
prompt: string;
};
redeemed_at: string;
}
interface ChannelPointsCustomRewardRedemptionUpdateEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
user_id: string;
user_login: string;
user_name: string;
user_input: string | null;
status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled';
reward: {
id: string;
title: string;
cost: number;
prompt: string;
};
redeemed_at: string;
}
interface ChannelPredictionBeginEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
outcomes: [
{
id: string;
title: string;
color: 'pink' | 'blue';
users: number;
channel_points: number;
top_predictors: [
{
user_id: string;
user_login: string;
user_name: string;
channel_points_won: number | null;
channel_points_used: number;
}
];
}
];
started_at: string;
locks_at: string;
}
interface ChannelPredictionProgressEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
outcomes: [
{
id: string;
title: string;
color: 'pink' | 'blue';
users: number;
channel_points: number;
top_predictors: [
{
user_id: string;
user_login: string;
user_name: string;
channel_points_won: number | null;
channel_points_used: number;
}
];
}
];
started_at: string;
locks_at: string;
}
interface ChannelPredictionLockEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
outcomes: [
{
id: string;
title: string;
color: 'pink' | 'blue';
users: number;
channel_points: number;
top_predictors: [
{
user_id: string;
user_login: string;
user_name: string;
channel_points_won: number | null;
channel_points_used: number;
}
];
}
];
started_at: string;
locked_at: string;
}
interface ChannelPredictionEndEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
title: string;
winning_outcome_id: string;
outcomes: [
{
id: string;
title: string;
color: 'pink' | 'blue';
users: number;
channel_points: number;
top_predictors: [
{
user_id: string;
user_login: string;
user_name: string;
channel_points_won: number | null;
channel_points_used: number;
}
];
}
];
started_at: string;
locked_at: string;
}
interface ChannelSharedChatSessionBeginEvent {
session_id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
host_broadcaster_user_id: string;
host_broadcaster_user_name: string;
host_broadcaster_user_login: string;
participants: [
{
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
}
];
}
interface ChannelSharedChatSessionUpdateEvent {
session_id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
host_broadcaster_user_id: string;
host_broadcaster_user_name: string;
host_broadcaster_user_login: string;
participants: [
{
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
}
];
}
interface ChannelSharedChatSessionEndEvent {
session_id: string;
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
host_broadcaster_user_id: string;
host_broadcaster_user_name: string;
host_broadcaster_user_login: string;
}
interface ChannelSubscriptionEndEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
tier: string;
is_gift: boolean;
}
interface ChannelSubscriptionGiftEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
total: number;
tier: string;
cumulative_total: number | null;
is_anonymous: boolean;
}
interface ChannelSubscriptionMessageEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
tier: string;
message: {
text: string;
emotes: [
{
begin: number;
end: number;
id: string;
}
] | null;
};
cumulative_total: number;
streak_months: number | null;
duration_months: number;
}
interface ChannelSuspiciousUserUpdateEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
moderator_user_id: string;
moderator_user_name: string;
moderator_user_login: string;
user_id: string;
user_name: string;
user_login: string;
low_trust_status: 'none' | 'active_monitoring' | 'restricted';
}
interface ChannelSuspiciousUserMessageEvent {
broadcaster_user_id: string;
broadcaster_user_name: string;
broadcaster_user_login: string;
user_id: string;
user_name: string;
user_login: string;
low_trust_status: 'none' | 'active_monitoring' | 'restricted';
shared_ban_channel_ids: string[];
types: 'manually_added' | 'ban_evader' | 'banned_in_shared_channel';
ban_evasion_evaluation: 'unknown' | 'possible' | 'likely';
message: {
message_id: string;
text: string;
fragments: [
{
type: 'text' | 'cheermote' | 'emote';
text: string;
cheermote: {
prefix: string;
bits: string;
tier: string;
} | null;
emote: {
id: string;
emote_set_id: string;
} | null;
}
];
};
}
interface ChannelVIPAddEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
}
interface ChannelVIPRemoveEvent {
user_id: string;
user_login: string;
user_name: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
}
interface ChannelWarningAcknowledgeEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
}
interface ChannelWarningSendEvent {
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
moderator_user_id: string;
moderator_user_login: string;
moderator_user_name: string;
user_id: string;
user_login: string;
user_name: string;
reason: string | null;
chat_rules_cited: string[] | null;
}
interface CharityDonationEvent {
id: string;
campaign_id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
charity_name: string;
charity_description: string;
charity_logo: string;
charity_website: string;
amount: {
value: number;
decimal_places: number;
currency: string;
};
}
interface CharityCampaignStartEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
charity_name: string;
charity_description: string;
charity_logo: string;
charity_website: string;
current_amount: {
value: number;
decimal_places: number;
currency: string;
};
target_amount: {
value: number;
decimal_places: number;
currency: string;
};
started_at: string;
}
interface CharityCampaignProgressEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
charity_name: string;
charity_description: string;
charity_logo: string;
charity_website: string;
current_amount: {
value: number;
decimal_places: number;
currency: string;
};
target_amount: {
value: number;
decimal_places: number;
currency: string;
};
}
interface CharityCampaignStopEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
charity_name: string;
charity_description: string;
charity_logo: string;
charity_website: string;
current_amount: {
value: number;
decimal_places: number;
currency: string;
};
target_amount: {
value: number;
decimal_places: number;
currency: string;
};
stopped_at: string;
}
interface ConduitShardDisabledEvent {
conduit_id: string;
shard_id: string;
status: string;
transport: string;
method: string;
callback: string | null;
session_id: string | null;
connected_at: string | null;
disconnected_at: string | null;
}
interface DropEntitlementGrantEvent {
id: string;
data: [
{
organization_id: string;
category_id: string;
category_name: string;
campaign_id: string;
user_id: string;
user_name: string;
user_login: string;
entitlement_id: string;
benefit_id: string;
created_at: string;
}
];
}
interface ExtensionBitsTransactionCreateEvent {
extension_client_id: string;
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
user_id: string;
user_login: string;
user_name: string;
product: {
name: string;
bits: number;
sku: string;
in_development: boolean;
};
}
interface GoalsEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer ';
description: string;
current_amount: number;
target_amount: number;
started_at: string;
ended_at: string;
}
interface GoalsEndEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer ';
description: string;
is_achieved: boolean;
current_amount: number;
target_amount: number;
started_at: string;
ended_at: string;
}
interface HypeTrainBeginEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
total: number;
progress: number;
goal: number;
top_contributions: [
{
user_id: string;
user_login: string;
user_name: string;
type: 'bits' | 'subscription' | 'other';
total: number;
}
];
last_contribution: {
user_id: string;
user_login: string;
user_name: string;
type: 'bits' | 'subscription' | 'other';
total: number;
};
level: number;
started_at: string;
expires_at: string;
is_golden_kappa_train: boolean;
}
interface HypeTrainBeginEventV2 {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
total: number;
progress: number;
goal: number;
top_contributions: [
{
user_id: string;
user_login: string;
user_name: string;
type: 'bits' | 'subscription' | 'other';
total: number;
}
];
level: number;
all_time_high_level: number;
all_time_high_total: number;
shared_train_participants: [
{
broadcaster_user_id: string;
broadcaster_user_login: string;
broadcaster_user_name: string;
}
] | null;
started_at: string;
expires_at: string;
type: 'treasure' | 'golden_kappa' | 'regular';
is_shared_train: boolean;
}
interface HypeTrainProgressEvent {
id: string;
broadcaster_user_id: string;
broadcaster_user_login: string;
b