Events
Widget receives few types of native events during lifetime. They are:
-
onWidgetLoad - Triggers when the widget is loaded or refreshed.
-
onEventReceived - Triggers on every event like a chat message, new tip, new follower, subscriber, etc.
-
onSessionUpdate – Similar to
onEventReceived
, but specifically triggers when the event affects session data such as latest subscriber, goals, totals, etc., visible in the Session Dashboard. It does not trigger for regular chat messages or events that don't update session stats.
Example:
window.addEventListener('onWidgetLoad', function (obj) {
console.log(obj); // You can check obj value in the browser console.
});
On Widget Load
Event received upon widget is loaded (or refreshed). Contains information about fieldData (fields values), channel information (including apiKey) and session data.
window.addEventListener('onWidgetLoad', function (obj) {
console.log(obj); // You can check obj value in the browser console.
//fancy stuff here
});
In this scope obj
has every information you could need to use. For better readibility, Let’s assign it:
window.addEventListener('onWidgetLoad', function (obj) {
let data = obj["detail"]["session"]["data"];
let recents = obj["detail"]["recents"];
let currency = obj["detail"]["currency"];
let channelName = obj["detail"]["channel"]["username"];
let apiToken = obj["detail"]["channel"]["apiToken"];
let fieldData = obj["detail"]["fieldData"];
});
Possible keys within data
:
Note:
The structure may change over time. To inspect the most up-to-date values, use
console.log(obj)
and check your browser console.
Common
Click to expand
data["merch-goal-items"]["amount"]
- Merch items goal progressdata["merch-goal-orders"]["amount"]
- Merch orders goal progressdata["merch-goal-total"]["amount"]
- Merch total goal progressdata["merch-latest"]
- Latest Merch eventdata["merch-latest"]["name"]
- Usernamedata["merch-latest"]["amount"]
- Merch amountdata["merch-latest"]["items"]
- Merch itemsdata["merch-latest"]["items"]["name"]
- Merch item namedata["merch-latest"]["items"]["quantity"]
- Merch item quantitydata["merch-latest"]["items"]["_id"]
- Merch item id
data["purchase-latest"]
- Latest Purchasedata["purchase-latest"]["name"]
- Usernamedata["purchase-latest"]["amount"]
- Purchase amountdata["purchase-latest"]["avatar"]
- Avatar imagedata["purchase-latest"]["message"]
- User messagedata["purchase-latest"]["items"]
- Purchase itemsdata["purchase-latest"]["items"]["name"]
- Purchase item namedata["purchase-latest"]["items"]["image"]
- Purchase item imagedata["purchase-latest"]["items"]["price"]
- Purchase item pricedata["purchase-latest"]["items"]["quantity"]
- Purchase item quantitydata["purchase-latest"]["items"]["_id"]
- Purchase item id
data["tip-latest"]
- Latest tipdata["tip-latest"]["name"]
- Latest tipper usernamedata["tip-latest"]["amount"]
- Latest tip amountdata["tip-latest"]["message"]
- Latest tip message
data["tip-session-top-donation"]
- Top tip in the sessiondata["tip-session-top-donation"]["name"]
- Usernamedata["tip-session-top-donation"]["amount"]
- Tip amount
data["tip-weekly-top-donation"]
- Top tip in the weekdata["tip-weekly-top-donation"]["name"]
- Usernamedata["tip-weekly-top-donation"]["amount"]
- Tip amount
data["tip-monthly-top-donation"]
- Top tip in the monthdata["tip-monthly-top-donation"]["name"]
- Tip amountdata["tip-monthly-top-donation"]["amount"]
- Username
data["tip-alltime-top-donation"]
- Top tip all timedata["tip-alltime-top-donation"]["name"]
- Usernamedata["tip-alltime-top-donation"]["amount"]
- Tip amount
data["tip-session-top-donator"]
- Top tip donator in the sessiondata["tip-session-top-donator"]["name"]
- Usernamedata["tip-session-top-donator"]["amount"]
- Sum of the tip amounts
data["tip-weekly-top-donator"]
- Top tip donator in the weekdata["tip-weekly-top-donator"]["name"]
- Usernamedata["tip-weekly-top-donator"]["amount"]
- Sum of the tip amounts
data["tip-monthly-top-donator"]
- Top tip donator in the monthdata["tip-monthly-top-donator"]["name"]
- Tipper usernamedata["tip-monthly-top-donator"]["amount"]
- Sum of the tip amounts
data["tip-alltime-top-donator"]
- Top tip donatordata["tip-alltime-top-donator"]["name"]
- Tipper usernamedata["tip-alltime-top-donator"]["amount"]
- Sum of the tip amounts
data["tip-session"]["amount"]
- Sum of all donations since session startdata["tip-week"]["amount"]
- Sum of all donations this weekdata["tip-month"]["amount"]
- Sum of all donations this monthdata["tip-total"]["amount"]
- Sum of all donations this all timedata["tip-count"]["count"]
- Number of tip eventsdata["tip-goal"]["amount"]
- Donation goal
Twitch
Click to expand
data["follower-latest"]["name"]
- Name of latest followerdata["follower-session"]["count"]
- Followers since session startdata["follower-week"]["count"]
- Followers this weekdata["follower-month"]["count"]
- Followers this monthdata["follower-goal"]["amount"]
- Followers goaldata["follower-total"]["count"]
- Total count of followersdata["subscriber-alltime-gifter"]
data["subscriber-alltime-gifter"]["name"]
- Name of latest gifterdata["subscriber-alltime-gifter"]["amount"]
- Number of gifted subs
data["subscriber-gifted-latest"]
data["subscriber-gifted-latest"]["name"]
- Name of latest gifterdata["subscriber-gifted-latest"]["amount"]
- Number of gifted subs
data["subscriber-gifted-session"]["count"]
- Number of gifted subs during sessiondata["subscriber-latest"]
-data["subscriber-latest"]["name"]
- Name of latest subdata["subscriber-latest"]["amount"]
- Duration in monthsdata["subscriber-latest"]["tier"]
- Tier of sub (1-3)data["subscriber-latest"]["message"]
- Message attached to sub actiondata["subscriber-latest"]["sender"]
- If it was a gift, here’s a gifterdata["subscriber-latest"]["gifted"]
- If it was a gift, here’s a gifted
data["subscriber-new-latest"]
data["subscriber-new-latest"]["name"]
- Name of latest new subdata["subscriber-new-latest"]["amount"]
- Number of months (1)data["subscriber-new-latest"]["message"]
- user message
data["subscriber-new-session"]["count"]
- Number of new subs during sessiondata["subscriber-resub-latest"]
data["subscriber-resub-latest"]["name"]
- Name of latest resubdata["subscriber-resub-latest"]["amount"]
- Number of monthsdata["subscriber-resub-latest"]["message"]
- user message
data["subscriber-resub-session"]["count"]
- Number of resubs during sessiondata["subscriber-session"]["count"]
- Subscribers since session startdata["subscriber-week"]["count"]
- Subscribers this weekdata["subscriber-month"]["count"]
- Subscribers this monthdata["subscriber-goal"]["amount"]
- Subscribers goaldata["subscriber-total"]["count"]
- Total count of subscribersdata["subscriber-points"]["amount"]
- Subscriber points (used for unlocking additional channel emotes - more info on Twitch Partner Emoticon Guide)data["host-latest"]["name"]
- Latest hostdata["host-latest"]["amount"]
- Number of viewers in latest host (can be 0)data["raid-latest"]["name"]
- Name of latest raiderdata["raid-latest"]["amount"]
- Number of viewers in latest raiddata["cheer-session"]["amount"]
- Cheers since session startdata["cheer-month"]["amount"]
- Cheers this monthdata["cheer-total"]["amount"]
- Total amount of cheersdata["cheer-count"]["count"]
- Number of cheer eventsdata["cheer-goal"]["amount"]
- Cheer goaldata["cheer-latest"]
- Latest Cheer eventdata["cheer-latest"]["name"]
- Latest cheererdata["cheer-latest"]["amount"]
- Latest cheer amountdata["cheer-latest"]["message"]
- Latest cheer message
data["cheer-session-top-donation"]
- Top cheer in the sessiondata["cheer-session-top-donation"]["name"]
- Usernamedata["cheer-session-top-donation"]["amount"]
- Cheer amount
data["cheer-weekly-top-donation"]
- Top cheer in the weekdata["cheer-weekly-top-donation"]["name"]
- Usernamedata["cheer-weekly-top-donation"]["amount"]
- Cheer amount
data["cheer-monthly-top-donation"]
- Top cheer in the monthdata["cheer-monthly-top-donation"]["name"]
- Usernamedata["cheer-monthly-top-donation"]["amount"]
- Cheer amount
data["cheer-alltime-top-donation"]
- Top cheer all timedata["cheer-alltime-top-donation"]["name"]
- Usernamedata["cheer-alltime-top-donation"]["amount"]
- Cheer amount
data["cheer-session-top-donator"]
- Top cheerer in the sessiondata["cheer-session-top-donator"]["name"]
- Usernamedata["cheer-session-top-donator"]["amount"]
- Sum of the cheer amounts
data["cheer-weekly-top-donator"]
- Top cheerer in the weekdata["cheer-weekly-top-donator"]["name"]
- Usernamedata["cheer-weekly-top-donator"]["amount"]
- Sum of the cheer amounts
data["cheer-monthly-top-donator"]
- Top cheerer in the monthdata["cheer-monthly-top-donator"]["name"]
- Usernamedata["cheer-monthly-top-donator"]["amount"]
- Sum of the cheer amounts
data["cheer-alltime-top-donator"]
- Top cheerer all timedata["cheer-alltime-top-donator"]["name"]
- Usernamedata["cheer-alltime-top-donator"]["amount"]
- Sum of the cheer amounts
data["channel-points-latest"]
- Latest Channel Point eventdata["channel-points-latest"]["name"]
- Usernamedata["channel-points-latest"]["amount"]
- Channel point amountdata["channel-points-latest"]["message"]
- User messagedata["channel-points-latest"]["redemption"]
- Redemption name
data["hypetrain-latest"]
- Latest Hypetrain eventdata["hypetrain-latest"]["amount"]
- Hypetrain amountdata["hypetrain-latest"]["active"]
- Hypetrain activedata["hypetrain-latest"]["level"]
- Hypetrain leveldata["hypetrain-latest"]["levelChanged"]
- Hypetrain level changeddata["hypetrain-latest"]["name"]
- Usernamedata["hypetrain-latest"]["type"]
- Hypetrain type
data["hypetrain-level-goal"]["amount"]
- Hypetrain level goaldata["hypetrain-level-progress"]["amount"]
- Hypetrain level progressdata["hypetrain-level-progress"]["percent"]
- Hypetrain level progress percentagedata["hypetrain-total"]["amount"]
- Hypetrain total amountdata["hypetrain-latest-top-contributors"]
- An array of top Hypetrain contributorsdata["charityCampaignDonation-latest"]
- Latest Charity Campaign Donationdata["charityCampaignDonation-latest"]["name"]
- Usernamedata["charityCampaignDonation-latest"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-session-top-donation"]
- Top Charity Campaign donation in the sessiondata["charityCampaignDonation-session-top-donation"]["name"]
- Usernamedata["charityCampaignDonation-session-top-donation"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-weekly-top-donation"]
- Top Charity Campaign donation in the weekdata["charityCampaignDonation-weekly-top-donation"]["name"]
- Usernamedata["charityCampaignDonation-weekly-top-donation"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-monthly-top-donation"]
- Top Charity Campaign donation in the monthdata["charityCampaignDonation-monthly-top-donation"]["name"]
- Usernamedata["charityCampaignDonation-monthly-top-donation"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-alltime-top-donation"]
- Top Charity Campaign donation all timedata["charityCampaignDonation-alltime-top-donation"]["name"]
- Usernamedata["charityCampaignDonation-alltime-top-donation"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-session-top-donator"]
- Top Charity Campaign Donator in the sessiondata["charityCampaignDonation-session-top-donator"]["name"]
- Usernamedata["charityCampaignDonation-session-top-donator"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-weekly-top-donator"]
- Top Charity Campaign Donator in the weekdata["charityCampaignDonation-weekly-top-donator"]["name"]
- Usernamedata["charityCampaignDonation-weekly-top-donator"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-monthly-top-donator"]
- Top Charity Campaign Donator in the monthdata["charityCampaignDonation-monthly-top-donator"]["name"]
- Usernamedata["charityCampaignDonation-monthly-top-donator"]["amount"]
- Charity Campaign Donation amount
data["charityCampaignDonation-alltime-top-donator"]
- Top Charity Campaign Donator all timedata["charityCampaignDonation-alltime-top-donator"]["name"]
- Usernamedata["charityCampaignDonation-alltime-top-donator"]["amount"]
- Charity Campaign Donation amount
data["cheerPurchase-latest"]
- Latest Cheer Purchasedata["cheerPurchase-latest"]["name"]
- Usernamedata["cheerPurchase-latest"]["amount"]
- Cheer Purchase amount
data["cheerPurchase-session-top-donation"]
- Top Cheer donation in the sessiondata["cheerPurchase-session-top-donation"]["name"]
- Usernamedata["cheerPurchase-session-top-donation"]["amount"]
- Cheer Donation amount
data["cheerPurchase-weekly-top-donation"]
- Top Cheer donation in the weekdata["cheerPurchase-weekly-top-donation"]["name"]
- Usernamedata["cheerPurchase-weekly-top-donation"]["amount"]
- Cheer Donation amount
data["cheerPurchase-monthly-top-donation"]
- Top Cheer donation in the monthdata["cheerPurchase-monthly-top-donation"]["name"]
- Usernamedata["cheerPurchase-monthly-top-donation"]["amount"]
- Cheer Donation amount
data["cheerPurchase-alltime-top-donation"]
- Top Cheer donation all timedata["cheerPurchase-alltime-top-donation"]["name"]
- Usernamedata["cheerPurchase-alltime-top-donation"]["amount"]
- Cheer Donation amount
data["cheerPurchase-session-top-donator"]
- Top Cheer Donator in the sessiondata["cheerPurchase-session-top-donator"]["name"]
- Usernamedata["cheerPurchase-session-top-donator"]["amount"]
- Cheer Donator amount
data["cheerPurchase-weekly-top-donator"]
- Top Cheer Donator in the weekdata["cheerPurchase-weekly-top-donator"]["name"]
- Usernamedata["cheerPurchase-weekly-top-donator"]["amount"]
- Cheer Donator amount
data["cheerPurchase-monthly-top-donator"]
- Top Cheer Donator in the monthdata["cheerPurchase-monthly-top-donator"]["name"]
- Usernamedata["cheerPurchase-monthly-top-donator"]["amount"]
- Cheer Donator amount
data["cheerPurchase-alltime-top-donator"]
- Top Cheer Donator all timedata["cheerPurchase-alltime-top-donator"]["name"]
- Usernamedata["cheerPurchase-alltime-top-donator"]["amount"]
- Cheer Donator amount
YouTube
Note: Youtube member used to be called sponsor, which is why the key is named "sponsor"
Click to expand
data["sponsor-goal"]["amount"]
- Amount of members goaldata["sponsor-session"]["count"]
- Members since session startdata["sponsor-week"]["count"]
- Members this weekdata["sponsor-month"]["count"]
- Members this monthdata["sponsor-total"]["count"]
- Total count of membersdata["sponsor-latest"]
- Latest memberdata["sponsor-latest"]["name"]
- Usernamedata["sponsor-latest"]["amount"]
- amount
data["sponsor-recent"]
- An array of latest member events with each element structure as insponsor-latest
data["sponsor-gifted-latest"]
- Latest member gifteddata["sponsor-gifted-latest"]["name"]
- Username getting the giftdata["sponsor-gifted-latest"]["amount"]
- Amount of member giftsdata["sponsor-gifted-latest"]["tier"]
- Tier of member giftsdata["sponsor-gifted-latest"]["message"]
- Message from gifterdata["sponsor-gifted-latest"]["sender"]
- username giving the gift
data["subscriber-latest"]["name"]
- Name of latest subscriberdata["subscriber-session"]["count"]
- Subscribers since session startdata["subscriber-week"]["count"]
- Subscribers this weekdata["subscriber-month"]["count"]
- Subscribers this monthdata["subscriber-goal"]["amount"]
- Subscribers goaldata["subscriber-total"]["count"]
- Total count of subscribersdata["superchat-count"]["count"]
- Total count of superchatsdata["superchat-goal"]["amount"]
- Amount of superchat goaldata["superchat-session"]["count"]
- Superchats since session startdata["superchat-week"]["count"]
- Superchats this weekdata["superchat-month"]["count"]
- Superchats this monthdata["superchat-total"]["count"]
- Total count of superchatsdata["superchat-latest"]
- Latest superchatdata["superchat-latest"]["name"]
- Usernamedata["superchat-latest"]["amount"]
- amount
data["superchat-recent"]
- An array of latest superchat events with each element structure as insuperchat-latest
data["superchat-session-top-donator"]
- Top Superchat Donator in the sessiondata["superchat-session-top-donator"]["name"]
- Usernamedata["superchat-session-top-donator"]["amount"]
- Superchat Donation amount
data["superchat-weekly-top-donator"]
- Top Superchat Donator in the weekdata["superchat-weekly-top-donator"]["name"]
- Usernamedata["superchat-weekly-top-donator"]["amount"]
- Superchat Donation amount
data["superchat-monthly-top-donator"]
- Top Superchat Donator in the monthdata["superchat-monthly-top-donator"]["name"]
- Usernamedata["superchat-monthly-top-donator"]["amount"]
- Superchat Donation amount
data["superchat-alltime-top-donator"]
- Top Superchat Donatordata["superchat-alltime-top-donator"]["name"]
- Usernamedata["superchat-alltime-top-donator"]["amount"]
- Superchat Donation amount
data["superchat-session-top-donation"]
- Top Superchat Donation in the sessiondata["superchat-session-top-donation"]["name"]
- Usernamedata["superchat-session-top-donation"]["amount"]
- Superchat Donation amount
data["superchat-weekly-top-donation"]
- Top Superchat Donation in the weekdata["superchat-weekly-top-donation"]["name"]
- Usernamedata["superchat-weekly-top-donation"]["amount"]
- Superchat Donation amount
data["superchat-monthly-top-donation"]
- Top Superchat Donation in the monthdata["superchat-monthly-top-donation"]["name"]
- Usernamedata["superchat-monthly-top-donation"]["amount"]
- Superchat Donation amount
data["superchat-alltime-top-donation"]
- Top Superchat Donationdata["superchat-alltime-top-donation"]["name"]
- Usernamedata["superchat-alltime-top-donation"]["amount"]
- Superchat Donation amount
There is a difference between:
cheer-*-donation
andcheer-*-donator
tip-*-donation
andtip-*-donator
donation
stands for single event (biggest one-time donation/cheer in period)
donator
stands for cumulative amount of all events by this user.
Example for better understanding:
User | Amount |
---|---|
UserA | 10 |
UserB | 15 |
UserA | 10 |
Then calling each scope will result:
tip-alltime- | amount | name |
---|---|---|
-donator | 20 | UserA |
-donation | 15 | UserB |
Recent events: You can access recent events of each type by calling:
data["follower-recent"];
data["subscriber-recent"];
data["host-recent"];
data["raid-recent"];
data["cheer-recent"];
data["tip-recent"];
data["merch-recent"];
data["charityCampaignDonation-recent"];
data["cheerPurchase-recent"];
data["superchat-recent"];
Each of them is an array (number indexes 0-24), and every subarray contains:
let recentFollows=data["follower-recent"][0];
recentFollows["name"]; // Username,
recentFollows["createdAt"];// Timestamp like "2018-06-11T08:08:33.180Z",
recentFollows["$hashKey"]; // unique ID for example"object:5024",
recentFollows["type"]; // Event type "follower", "subscriber", "host", "raid", "cheer", "tip"
Depending on type there can be also:
subscriber-recent
["tier"]; //Subscriber tier (1000,2000,3000)
["amount"]; // amount of months
host-recent
["amount"]; // amount of viewers
raid-recent
["amount"]; // amount of months
cheer-recent
["amount"]; // amount of bits
tip-recent
["amount"]; // amount of tip
There is also a list in chronological order of last 25 events (so if you want to make list of all events - use this one) - variable recents
initialized one line after variable data
.
It is an array of elements (each of them is array) with the same elements as in data["*-recent"]
The last element of obj
is currency, which contains:
code
- currency code (for example “USD”)name
- currency name (for example "U.S. Dollar)symbol
- currency symbol (for example “$”)
On Event Received:
Live event for alerts, chat messages, SE_API store updates, etc.
window.addEventListener('onEventReceived', function (obj) {
console.log(obj); // You can check obj value in the browser console.
// fancy stuff here
});
In the example above you have obj forwarded to that function, which has two interesting scopes within obj.detail
:
-
obj.detail.listener
: Will provide you information about event type. This value is a string. Possible values:follower-latest
- New Followersubscriber-latest
- New Subscriberhost-latest
- New hostcheer-latest
- New cheertip-latest
- New tipraid-latest
- New raidmessage
- New chat message receiveddelete-message
- Chat message removeddelete-messages
- Chat messages by userId removedevent:skip
- User clicked "skip alert" button in activity feedalertService:toggleSound
- User clicked "mute/unmute alerts" button in activity feedbot:counter
- Update of bot counterkvstore:update
- Update of SE_API store value.widget-button
- User clicked custom field button in widget properties
-
obj.detail.event
: Will provide you information about event details. It contains few keys. For-latest
events it is:.name
- user who triggered action.amount
- amount of action.message
- message attached to sub.gifted
- if this is a gift event for viewer.sender
- if it was a gift, a gifter (for community and single gifts).bulkGifted
- if it is INITIAL event of community gift (${event.sender} gifted ${event.amount} subs to community
).isCommunityGift
- if it is one of community gifts train (${event.sender} gifted ${event.name} a sub as part of random giveaway!
).playedAsCommunityGift
- if the event was played as part of "cumulative sub bomb alert"
-
there is also
userCurrency
for donations, you can use it (if initialized bylet userCurrency;
). For example:usercurrency.symbol
So expanding our sample code above you can have
window.addEventListener('onEventReceived', function (obj) {
const listener = obj.detail.listener;
const data = obj["detail"]["event"];
// Assigned new const value, for easier handling. You can do it with .property or ["property"].
// I personally recommend using [""] as some of keys can have "-" within,
// so you won't be able to call them (JS will try to do math operation on it).
// jQuery is included by default, so you can use following
$("#usernameContainer").html(data["name"]);
$("#actionContainer").html(listener);
// You can use vanilla JS as well
document.getElementById("amount").innerHTML = data["amount"]
});
Chat Message
For message events, there is an additional object that's accessible at obj.detail.event.data
, which looks like this:
Twitch:
Click to expand
{
"time": 1552400352142,
"tags": {
"badges": "broadcaster/1",
"color": "#641FEF",
"display-name": "SenderName",
"emotes": "25:5-9",
"flags": "",
"id": "885d1f33-8387-4206-a668-e9b1409a998b",
"mod": "0",
"room-id": "85827806",
"subscriber": "0",
"tmi-sent-ts": "1552400351927",
"turbo": "0",
"user-id": "85827806",
"user-type": ""
},
"nick": "sendername",
"userId": "123123",
"displayName": "senderName",
"displayColor": "#641FEF",
"badges": [
{
"type": "broadcaster",
"version": "1",
"url": "https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3",
"description": "Broadcaster"
}
],
"channel": "channelname",
"text": "Test Kappa test",
"isAction": false,
"emotes": [
{
"type": "twitch",
"name": "Kappa",
"id": "25",
"gif": false,
"urls": {
"1": "https://static-cdn.jtvnw.net/emoticons/v1/25/1.0",
"2": "https://static-cdn.jtvnw.net/emoticons/v1/25/2.0",
"4": "https://static-cdn.jtvnw.net/emoticons/v1/25/4.0"
},
"start": 5,
"end": 9
}
],
"msgId": "885d1f33-8387-4206-a668-e9b1409a99Xb"
}
Every emote displayed on chat is within array of objects emotes
with start/end index of text
you can replace with image
NOTE: if you are creating chat widget, remember to store msgId
and userId
of each message (for example <div class="message" data-msgId="${msgId}" data-userId="${userId}"></div>
) for message deletion events handling.
Youtube:
Click to expand
{
"kind": "youtube#liveChatMessage",
"etag": "joNqfOov4YhUTK1ly5QnEw2O_04",
"id": "LCC.EhwKGkNQakd1YS0tZ293REZWa1AxZ0FkMFU0VzNn",
"snippet": {
"type": "textMessageEvent",
"liveChatId": "KicKGFVDT2p0eVFPaTNNUjhYT3lzMFdOZmtKZxILMXFObko0UHU5bTA",
"authorChannelId": "noRfodywm2MXfIUCp9nm2MX",
"publishedAt": "2025-03-11T16:51:20.385245+00:00",
"hasDisplayContent": true,
"displayMessage": ":face-blue-smiling: Testing message",
"textMessageDetails": {
"messageText": ":face-blue-smiling: Testing message"
}
},
"authorDetails": {
"channelId": "noRfodywm2MXfIUCp9nm2MX",
"channelUrl": "http://www.youtube.com/channel/noRfodywm2MXfIUCp9nm2MX",
"displayName": "userName",
"profileImageUrl": "https://yt3.ggpht.com/MkVId1UPvXogOyUqSyaFRZD2eFHqNaThFYO4-YNWAA4sQGvCPdoZKDkN5qgPUQ9BRiajmtcU=s88-c-k-c0x00ffffff-no-rj",
"isVerified": false,
"isChatOwner": false,
"isChatSponsor": false,
"isChatModerator": true
},
"msgId": "LCC.EhwKGkNQakd1YS0tZ293REZWa1AxZ0FkMFU0VzNn",
"userId": "noRfodywm2MXfIUCp9nm2MX",
"nick": "username",
"badges": [
],
"displayName": "userName",
"isAction": false,
"time": 1741711893915,
"tags": [
],
"displayColor": null,
"channel": "noRfodywm2MXfIUCp9nm2MX",
"text": ":face-blue-smiling: Testing message",
"emotes": [
],
"avatar": "https://yt3.ggpht.com/MkVId1UPvXogOyUqSyaFRZD2eFHqNaThFYO4-YNWAA4sQGvCPdoZKDkN5qgPUQ9BRiajmtcU=s88-c-k-c0x00ffffff-no-rj"
}
Message deletion
When user message is removed by channel moderator there is an event emited either:
delete-message
- with msgId of message to be removeddelete-messages
- with userId of user whose messages have to be removed This functionality is to prevent abusive content displayed in chat widget.
Bot counter
Contains two elements counter name (counter
) and current value (value
)
window.addEventListener('onEventReceived', function (obj) {
const listener = obj.detail.listener;
const data = obj.detail.event;
if (listener === 'bot:counter' && data.counter === counter) {
document.getElementById("mycounter").innerHTML = data.value;
}
});
Button click
Contains two elements - field name (field
) and value (value
). Example below will send simplified event to test your chat widget
window.addEventListener('onEventReceived', function (obj) {
const data = obj.detail.event;
if (data.listener === 'widget-button') {
if (data.field === 'chat' && data.value === 'First Message') {
const emulated = new CustomEvent("onEventReceived", {
detail: {
"listener": "message",
event: {
data: {
text: "Example message!",
displayName: "StreamElements"
}
}
}
});
window.dispatchEvent(emulated);
}
}
});
On Session Update
window.addEventListener('onSessionUpdate', function (obj) {
console.log(obj); // You can check obj value in the browser console.
//fancy stuff here
});
This event is triggered every time a session data is updated (new tip/cheer/follower), basically most of the scenarios can be covered by onEventReceived
, but onSessionUpdate
provides a lot of more data you can use. The biggest advantage of using this is that you can check if top donator (not donation) changed. Also it is the recommended option for goal widgets.
Note: Due to complexity of object in
onSessionUpdate
, aonEventReceived
event listener will be the best way to use for most of scenarios (easier to implement and better performance).
Example:
window.addEventListener('onSessionUpdate', function (obj) {
const data = obj.detail.session;
const tipTopDonator = data["tip-session-top-donator"];
const cheerTopDonator = data["cheer-session-top-donator"];
document.getElementById("top-donator").innerHTML = `${tipTopDonator["name"]} - ${tipTopDonator["amount"]}`;
document.getElementById("top-cheerer").innerHTML = `${cheerTopDonator["name"]} - ${cheerTopDonator["amount"]}`;
});
data
is the same as in onWidgetLoad
so every property is listed in section above (check note below).
Note:
Be mindful of the object structure:
- In
onWidgetLoad
,data
is available atobj.detail.session.data
- In
onSessionUpdate
,data
is available atobj.detail.session