Skip to content

Widgets — API endpoints

Base domains

  • https://widgets.streamercatalyst.com
  • https://preview.widgets.streamercatalyst.com

Browser-source URLs (/widget/*, /v1/scene/*, /event-page) and the /ws/* socket are loaded straight from widgets.streamercatalyst.com by OBS or other capture software. preview.widgets.streamercatalyst.com serves the same routes for the dashboard’s editor previews.

The StreamerCatalyst dashboard calls the session endpoints same-origin through https://streamercatalyst.com/m/widgets/* (for example /m/widgets/api/channels/:id/token reaches /api/channels/:id/token here). That proxy forwards the session cookie over a Cloudflare service binding and never forwards /internal/*.

Endpoints

PathMethodAuthDescription
/widget/:channelIdGETWidget tokenA custom widget for an OBS browser source (?token=&widget_id=). ?thumb=1 renders a still with no live-event socket.
/widget/native/:channelIdGETWidget tokenA built-in widget for an OBS browser source (?token=&type=, plus instance_id and an optional pack skin).
/v1/scene/:sceneIdGETWidget tokenA whole scene as one browser source: every widget placed on it, composited (?token=).
/event-pageGETWidget tokenThe Event Page as an OBS browser source (?token=). Same data as the public page at streamercatalyst.com/e/<login>, and it renders whether or not that page is published.
/ws/:channelIdGET (WebSocket)Widget tokenLive event socket for overlays (?token=): Twitch and StreamerCatalyst events pushed to the widget, replayed after a reconnect.
/api/widgets/templates/nativeGETPublicCatalogue of built-in widget templates and their settings schemas; …/templates/native/:templateId returns one.
/api/widgets/kv/:widgetId/:keyGET/PUT/DELETEWidget tokenPer-widget key-value storage for custom widgets; GET /api/widgets/kv/:widgetId?prefix= lists keys.
/api/widgets/counters/:channelIdGETWidget tokenOne counter value for SE_API.counters.get: a Chatters channel counter or a module metric.
/api/widgets/sc/twitch/*GETWidget tokenTwitch reads for custom widgets: user/:login, stream/:login, followers, clips, polls, predictions, charity. Rate-limited per channel.
/api/widgets/sc/rewards/*GETWidget tokenEvents data for widgets: recent, goal, leaderboard, metric.
/api/widgets/sc/numbers/*GETWidget tokenNumbers data for widgets: metric, and plus (Plus Points; a figure that could not be read comes back as unavailable, never 0).
/api/widgets/sc/chatters/metricGETWidget tokenChatters metrics for widgets, such as named counters.
/api/widgets/sc/tip/goalGETWidget tokenActive Tipping donation-goal progress.
/api/widgets/sc/ai/*GET/POSTWidget tokenAI for widgets: complete (generic, rate-limited), persona-comment (the AI persona bubble), remaining (quota left).
/api/widgets/timer/stateGETWidget tokenSubathon timer state for the overlay (?token=&channel_id=).
/api/widgets/timer/add-timePOSTWidget tokenThe overlay reports a contribution to the subathon timer; each event counts once.
/api/widgets/goals/stateGETWidget tokenSubathon goals ladder tally for the overlay.
/api/widgets/goals/addPOSTWidget tokenThe overlay reports a contribution to the subathon goals ladder; each event counts once.
/api/widgets/credits/stateGETWidget tokenEnding-credits roll data (?sections=&window=). A section that could not be read is reported as unavailable, never as empty.
/api/widgets/sync-values/:channelIdGETWidget tokenLive values for widget fields bound to a goal (tip goal, a Numbers goal, or the charity campaign).
/api/widgets/runtime-errorsPOSTWidget tokenA widget reports a runtime error; GET/DELETE /api/widgets/runtime-errors/:widgetId reads and clears them.
/api/channels/:id/tokenGETSession cookieThe channel’s widget token, for building browser-source URLs.
/api/channels/:id/token/rotatePOSTSession cookieIssue a new widget token. Every URL carrying the old one stops working.
/api/channels/:id/widget-instancesGET/POSTSession cookieList or save the channel’s built-in widget instances and their settings.
/api/widgets/instances/:instanceIdDELETESession cookieDelete a widget instance; PATCH …/placement moves it on a scene.
/api/widgets/instances/:instanceId/sounds/:eventKeyPUT/DELETESession cookieAssign or clear the sound a widget plays for an event (one sound per event per scene).
/api/widgets/scenesGET/POSTSession cookieList or create scenes.
/api/widgets/scenes/:sceneIdPATCH/DELETESession cookieUpdate or delete a scene; POST …/duplicate copies it and GET …/sounds lists its sound assignments.
/api/widgets/customGETSession cookieList the channel’s custom widgets.
/api/widgets/custom/:widgetIdGET/POST/DELETESession cookieRead, save, or delete a custom widget; …/publish, …/versions and …/restore/:versionId manage its versions.
/api/widgets/custom/generatePOSTSession cookieGenerate or refine a custom widget with AI; GET /api/widgets/custom/ai-status reports availability.
/api/widgets/assetsGETSession cookieUploaded images, video and audio; POST /api/widgets/assets/upload adds one, DELETE /api/widgets/assets/:assetId removes one.
/api/widgets/soundsGETSession cookieThe sound library plus your own uploaded sounds, for the sound pickers.
/api/widgets/packsGETSession cookieWidget packs (overlay skins) available to the channel.
/api/widgets/tierGETSession cookieThe channel’s plan; GET /api/widgets/limits reports widget counts against its limits.
/api/channels/:id/timer/*GET/POSTSession cookieSubathon timer control from the dashboard: state, pause, resume, adjust, reset.
/api/channels/:id/goals/*GET/POSTSession cookieSubathon goals control: state, reset, adjust (a signed correction), backfill (count earlier activity).
/api/channels/:id/credits/*GET/POSTSession cookieEnding credits control: state, lists, control, clear.
/internal/eventsubPOSTService binding (internal)EventSub fan-out receiver (internal, from eventsub-router).
/internal/sc-eventPOSTService binding (internal)StreamerCatalyst events from other modules (tips, wheel spins, goal and metric updates) pushed to overlays (internal).
/internal/billing/downgradePOSTService binding (internal)Tier-downgrade handler (internal).

Auth model

  • Session cookie endpoints require an active StreamerCatalyst session (set at login via the platform Worker). A channel-scoped route (/api/channels/:id/…) answers only for the session’s own channel, and a read-only admin masquerade may read but not change anything.
  • Widget token endpoints are what OBS browser sources and overlays call. The channel’s widget token, passed as ?token=, is the credential: the channel comes from the token, and a token that does not match the channel in the URL is refused. Treat a URL that carries it like a password; rotating the token from the dashboard invalidates every URL with the old one.
  • Public endpoints require no authentication.
  • Service binding endpoints are for other StreamerCatalyst Workers, called over Cloudflare service bindings with a shared internal token. They are not a public API.