Skip to content

Using Data Storage in Custom Widgets

Custom widgets in StreamerCatalyst can access and persist data through two primary methods: the SC_API (SC runtime) and the SE_API (StreamElements compatibility layer).

The SC_API provides per-widget key-value storage. This data is local to the specific widget instance. This storage is subject to the following limits:

  • Maximum value size: 8 KB per value
  • Maximum keys: 100 keys per widget
  • Total storage capacity: 100 KB per widget

If you are migrating a widget from StreamElements or prefer its syntax, you can use the SE_API compatibility layer.

The SE_API provides store.get and store.set methods for managing data in a StreamElements-style way.

You can retrieve channel-wide data using counters.get. The way you name the argument determines what data is returned:

  • Chatters Counters: Use a bare name to retrieve a specific chatter counter. These names must be lowercase and can include a-z, 0-9, and _ (up to 32 characters). For example, deaths is a valid bare name for a counter.
  • Module Metrics: Use dotted notation to retrieve metrics from specific modules. Examples include numbers.follows, rewards.total_bits, or chatters.regulars_count.

[!CAUTION] Do not combine these formats. For example, calling chatters.deaths will result in an error because deaths is a counter and must be called as a bare name.

For imported widgets, session.data is available within the onWidgetLoad detail. This allows imported goal or counter widgets to resume their running totals from real history rather than restarting at zero when the overlay is reloaded.

The following example demonstrates how to use the SE_API to retrieve a counter, a module metric, and use the store for custom data.

// 1. Retrieving a channel-wide Chatters counter
// Use a bare name (lowercase, a-z, 0-9, _)
const deathCount = SE_API.counters.get('deaths');
// 2. Retrieving a module metric
// Use dotted notation for module-specific data
const followCount = SE_API.counters.get('numbers.follows');
// 3. Using the SE_API store for custom key-value data
SE_API.store.set('last_event_type', 'sub');
const lastEvent = SE_API.store.get('last_event_type');
// Example of handling the session data on load (for imported widgets)
// This data is part of the onWidgetLoad detail
function handleWidgetLoad(event) {
if (event.session && event.session.data) {
const currentGoal = event.session.data;
console.log("Resuming from session data:", currentGoal);
}
}