API
This document describes the APIs used for connecting any streaming client to the WebSocket server.
v1 OBS / Streamer.bot / Custom
Server Information
To connect to a server, use the following url:
wss://streamsocket.kadokta.com/api/{version}/streamer/{app_source}/channel/{channel_id}
Replace each {variable} with the following:
| Variable | Description | Allowed Value |
|---|---|---|
| app_source | Which app is used to connect to the server. Use “custom” if not in the list. | obs, streamerbot, custom |
| channel_id | The unique numeric identifier of the channel. | any |
| version | Version of the used API. | v1 |
Operations
The following operations with their corresponding messages should be managed by the client. WebSocket messages have a payload that include the type of the message and a data property (if required).
- To Server
- notification_category_lock
- notification_category_reset
- notification_category_unlock
- notification_config_reset
- notification_event_lock
- notification_event_reset
- notification_event_unlock
- notification_skip_cooldowns
- notification_status_change
- request_category_list
- request_config
- request_config_change
- request_event_list
- request_points_change
- request_secret_check
- response_connection_check
- response_event_data
- To Client
notification_category_lock
This operation is sent to the server.
Locks categories according to their category_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_category_lock
data:
type: object
properties:
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- category_ids
required:
- type
- data
Example payload (JSON):
{
"type": "notification_category_lock",
"data": {
"category_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_category_reset
This operation is sent to the server.
Resets the locks of the category to their default.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_category_reset
data:
type: object
properties:
all:
type: boolean
description: Whether to reset all categories (overrides 'categories' property if
present)
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- type
- data
Example payload (JSON):
{
"type": "notification_category_reset",
"data": {
"all": true,
"category_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_category_unlock
This operation is sent to the server.
Unlocks categories according to their category_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_category_unlock
data:
type: object
properties:
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- category_ids
required:
- type
- data
Example payload (JSON):
{
"type": "notification_category_unlock",
"data": {
"category_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_config_reset
This operation is sent to the server.
Resets the locks and limits of everything.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_config_reset
data:
type: object
properties:
scope:
type: array
items:
type: string
enum:
- all
- global_item
- user_item
uniqueItems: true
constraint:
type: array
items:
type: string
enum:
- all
- locks
- limits
uniqueItems: true
item_type:
type: array
items:
type: string
enum:
- all
- categories
- events
uniqueItems: true
item_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
user_ids:
type: array
items:
type: string
minLength: 1
maxLength: 256
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- type
Example payload (JSON):
{
"type": "notification_config_reset",
"data": {
"scope": ["global_item", "user_item"],
"constraint": ["locks", "limits"],
"item_type": ["categories", "events"],
"item_ids": ["example", "example2"],
"user_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_config_update
This operation is received by the client.
Received by the client if the config was updated.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_config_update
data:
type: object
properties:
categories:
type: array
description: List of categories
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
border_radius:
type: number
box_shadow:
type: boolean
category_bar_hide:
type: boolean
category_bar_position:
enum:
- top
- bottom
display_name:
type: string
maxLength: 64
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
list_additional_height:
type: integer
maximum: 1024
list_aspect_ratio:
enum:
- auto
- 3/2
- 2/1
- 1/1
- 1/2
- 2/3
list_center_vertical:
type: boolean
list_columns:
type: integer
minimum: 1
maximum: 5
list_gap_horizontal:
type: number
list_gap_vertical:
type: number
list_icons_align:
enum:
- left
- center
- right
list_icons_wrap:
type: boolean
list_line_breaks:
type: boolean
list_spacing:
enum:
- space_between
- center
list_text_align:
enum:
- left
- center
- right
- justify
locked:
type: boolean
locked_hide:
type: boolean
status_bar_hide:
type: boolean
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
required:
- id
maxItems: 512
events:
type: array
description: List of events
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
cooldown_global:
type: integer
description: Global cooldown in ms
cooldown_global_event:
type: integer
description: Global event specific cooldown in ms
cooldown_user:
type: integer
description: User specific cooldown in ms
cooldown_user_event:
type: integer
description: User specific and event specific cooldown in ms
description:
type: string
maxLength: 512
display_name:
type: string
maxLength: 64
exclude_cooldown_global:
type: boolean
description: Event can be sent regardless of global cooldown
exclude_cooldown_user:
type: boolean
description: Event can be sent regardless of user cooldown
following_minimum:
type: integer
description: Minimum follow duration in ms
inputs:
type: array
items:
oneOf:
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: text
default:
type: string
maxLength: 512
regex:
type: string
maxLength: 512
length_min:
type: number
length_max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: number
default:
type: number
step:
type: number
min:
type: number
max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: color
default:
type: string
maxLength: 512
color_settings:
oneOf:
- type: object
properties:
color_type:
type: string
const: rgb
r:
type: object
properties:
min:
type: number
max:
type: number
g:
type: object
properties:
min:
type: number
max:
type: number
b:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsl
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
l:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsv
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
v:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: choice
values:
type: array
items:
type: string
maxLength: 24
maxItems: 128
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: toggle
default:
type: boolean
required:
- input_type
maxItems: 64
limit:
type: integer
limit_user:
type: integer
locked:
type: boolean
locked_hide:
type: boolean
padding:
description: Sets the padding of an item. Adds placeholders before the event
list item.
type: number
points_disable_conversion:
type: boolean
points_required:
type: integer
maximum: 10000
product_sku:
description: Amount of bits required for the event. Only some combinations
(products) are allowed, as seen in the extension configuration
for events. By enabling bits, you confirm that you read and
follow the Twitch Bits Acceptable Use Policy
(https://legal.twitch.com/en/legal/bits-acceptable-use/).
type: string
pattern: ^(?:test_)?event_[0-9]{1,5}$
response:
type: boolean
span_horizontal:
type: integer
minimum: 1
maximum: 5
span_vertical:
type: integer
minimum: 1
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
subscription_minimum:
type: string
enum:
- twitch_sub_none
- twitch_sub_1000
- twitch_sub_2000
- twitch_sub_3000
write_chat:
type: boolean
write_chat_message:
description: "Replaces the default chat message. You can use the following
placeholders: %event_name%, %user_name%, %bits%, %points%."
type: string
maxLength: 412
quick_event:
description: Sends event after clicking button without showing dialog
type: boolean
required:
- id
maxItems: 512
style:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
fonts:
type: object
properties:
title:
type: string
maxLength: 128
title_size:
type: number
minimum: 8
body:
type: string
maxLength: 128
body_size:
type: number
minimum: 8
compressed:
type: string
maxLength: 65536
date:
type: number
description: Date the config was updated (number of milliseconds elapsed since
epoch)
size_current:
type: number
size_maximum:
type: number
required:
- date
required:
- type
- data
Example payload (JSON):
{
"type": "notification_config_update",
"data": {
"categories": [
{
"id": "example_id",
"border_radius": 100,
"box_shadow": true,
"category_bar_hide": true,
"category_bar_position": "top",
"display_name": "example_display_name",
"event_ids": ["example", "example2"],
"list_additional_height": 1024,
"list_aspect_ratio": "auto",
"list_center_vertical": true,
"list_columns": 1,
"list_gap_horizontal": 100,
"list_gap_vertical": 100,
"list_icons_align": "left",
"list_icons_wrap": true,
"list_line_breaks": true,
"list_spacing": "space_between",
"list_text_align": "left",
"locked": true,
"locked_hide": true,
"status_bar_hide": true,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
}
}
],
"events": [
{
"id": "example_id",
"category_ids": ["example", "example2"],
"cooldown_global": 5000,
"cooldown_global_event": 5000,
"cooldown_user": 5000,
"cooldown_user_event": 5000,
"description": "example_description",
"display_name": "example_display_name",
"exclude_cooldown_global": true,
"exclude_cooldown_user": true,
"following_minimum": "5",
"inputs": [
{
"id": "example_id",
"label": "example_label",
"input_type": "text",
"default": "example_default",
"regex": "example_regex",
"length_min": 100,
"length_max": 100
}
],
"limit": "5",
"limit_user": "5",
"locked": true,
"locked_hide": true,
"padding": 100,
"points_disable_conversion": true,
"points_required": 10000,
"product_sku": "event_100",
"response": true,
"span_horizontal": 1,
"span_vertical": 1,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
},
"subscription_minimum": "twitch_sub_none",
"write_chat": true,
"write_chat_message": "example_write_chat_message",
"quick_event": true
}
],
"style": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"fonts": {
"title": "example_title",
"title_size": 8,
"body": "example_body",
"body_size": 8
}
},
"compressed": "example_compressed",
"date": "1767222000000",
"size_current": "4.5",
"size_maximum": "4.5"
}
}
notification_error
This operation is received by the client.
When a message caused an error (e.g. invalid secret).
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_error
data:
type: object
properties:
error_message:
type: string
error_name:
enum:
- unknown
- invalid_secret
- invalid_format
required:
- error_name
required:
- type
- data
Example payload (JSON):
{
"type": "notification_error",
"data": {
"error_message": "example_error_message",
"error_name": "unknown"
}
}
notification_event
This operation is received by the client.
When an event is redeemed (either by a viewer or as a test by the streamer).
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_event
data:
type: object
properties:
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
event_display_name:
type: string
event_id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
is_test:
type: boolean
used_points:
type: number
user_display_name:
type: string
user_id:
type: string
minLength: 1
maxLength: 256
processed_at:
type: number
inputs:
type: array
items:
oneOf:
- type: object
properties:
value_type:
type: string
const: string
value:
type:
- string
- "null"
maxLength: 512
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: color
value:
type:
- string
- "null"
maxLength: 7
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: number
value:
type:
- number
- "null"
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: boolean
value:
type:
- boolean
- "null"
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
maxItems: 64
required:
- event_id
required:
- type
- data
Example payload (JSON):
{
"type": "notification_event",
"data": {
"category_ids": ["example", "example2"],
"event_display_name": "example_event_display_name",
"event_id": "example_event_id",
"is_test": true,
"used_points": 100,
"user_display_name": "example_user_display_name",
"user_id": "example_user_id",
"processed_at": "1767222000000",
"inputs": [
{
"value_type": "string",
"value": "example_value",
"id": "example_id"
}
]
}
}
notification_event_lock
This operation is sent to the server.
Locks events according to their event_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_event_lock
data:
type: object
properties:
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- event_ids
required:
- type
- data
Example payload (JSON):
{
"type": "notification_event_lock",
"data": {
"event_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_event_reset
This operation is sent to the server.
Resets the locks and limits of the event to their default.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_event_reset
data:
type: object
properties:
all:
type: boolean
description: Whether to reset all events (overrides 'events' property if present)
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- type
- data
Example payload (JSON):
{
"type": "notification_event_reset",
"data": {
"all": true,
"event_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_event_unlock
This operation is sent to the server.
Unlocks events according to their event_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_event_unlock
data:
type: object
properties:
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- event_ids
required:
- type
- data
Example payload (JSON):
{
"type": "notification_event_unlock",
"data": {
"event_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_skip_cooldowns
This operation is sent to the server.
Used to skip cooldowns, i.e. event or user cooldowns. There are multiple possible property combinations to target a specific group of users or events:
-
scope only: Defining only the scope with no event_ids or user_ids results in the following:
- all: resets every cooldown, including all event cooldowns, all user specific cooldowns, and global cooldowns.
- global: resets the global cooldown.
- global_event: resets all event cooldowns. User specific cooldowns will still run.
- user: resets all user cooldowns. Event specific user cooldowns will still run.
- user_event: resets all event-specific user cooldowns.
-
scope “global_event” with event_ids: Defining an array with event_ids resets all event cooldowns with the corresponding event_ids.
-
scope “user” with user_ids: Defining an array with user_ids resets all user cooldowns with the corresponding user_ids.
-
scope “user_event” with event_ids: Defining an array with event_ids and the scope users means all users who have a cooldown running on the specific event id will be reset.
-
scope “user_event with user_ids”: Defining an array with user_ids resets all event-specific user cooldowns for the corresponding user_ids.
-
scope “user_event” with event_ids and user_ids: Defining both event_ids and user_ids resets events with the corresponding event_id for each given user by user_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_skip_cooldowns
data:
type: object
properties:
scopes:
type: array
items:
type: string
enum:
- all
- global
- global_event
- user
- user_event
uniqueItems: true
item_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
user_ids:
type: array
items:
type: string
minLength: 1
maxLength: 256
maxItems: 512
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- type
- data
Example payload (JSON):
{
"type": "notification_skip_cooldowns",
"data": {
"scopes": ["user", "user_event"],
"item_ids": ["example", "example2"],
"user_ids": ["example", "example2"],
"secret": "example_secret",
"version": "example_version"
}
}
notification_skip_queue
This operation is sent to the server.
Used to skip queues, i.e. to immediately make other events redeemable again after an event with a set cooldown has been sent.
AsyncApi schema for message:
undefined```
Example payload (JSON):
```json
undefined
notification_status_change
This operation is sent to the server.
Used to enable or disable sending of events by viewers.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_status_change
data:
type: object
properties:
active:
type: boolean
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- active
required:
- type
- data
Example payload (JSON):
{
"type": "notification_status_change",
"data": {
"active": true,
"secret": "example_secret",
"version": "example_version"
}
}
notification_status_streamer
This operation is received by the client.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: notification_status_streamer
data:
type: object
properties:
updated_at:
type: number
ready:
type: boolean
reason:
type: string
enum:
- unknown
- disconnected
- disabled_via_streamer
- disabled_via_dashboard
- ready
required:
- type
- data
Example payload (JSON):
{
"type": "notification_status_streamer",
"data": {
"updated_at": 100,
"ready": true,
"reason": "unknown"
}
}
request_category_list
This operation is sent to the server.
Send this to receive a list of categories.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_category_list
data:
type: object
properties:
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
message_id:
type: string
maxLength: 256
required:
- type
Example payload (JSON):
{
"type": "request_category_list",
"data": {
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_category_list
Reply to request_category_list
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_category_list
data:
type: object
properties:
categories:
type: array
description: List of categories
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
border_radius:
type: number
box_shadow:
type: boolean
category_bar_hide:
type: boolean
category_bar_position:
enum:
- top
- bottom
display_name:
type: string
maxLength: 64
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
list_additional_height:
type: integer
maximum: 1024
list_aspect_ratio:
enum:
- auto
- 3/2
- 2/1
- 1/1
- 1/2
- 2/3
list_center_vertical:
type: boolean
list_columns:
type: integer
minimum: 1
maximum: 5
list_gap_horizontal:
type: number
list_gap_vertical:
type: number
list_icons_align:
enum:
- left
- center
- right
list_icons_wrap:
type: boolean
list_line_breaks:
type: boolean
list_spacing:
enum:
- space_between
- center
list_text_align:
enum:
- left
- center
- right
- justify
locked:
type: boolean
locked_hide:
type: boolean
status_bar_hide:
type: boolean
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
required:
- id
maxItems: 512
required:
- categories
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "response_category_list",
"data": {
"categories": [
{
"id": "example_id",
"border_radius": 100,
"box_shadow": true,
"category_bar_hide": true,
"category_bar_position": "top",
"display_name": "example_display_name",
"event_ids": ["example", "example2"],
"list_additional_height": 1024,
"list_aspect_ratio": "auto",
"list_center_vertical": true,
"list_columns": 1,
"list_gap_horizontal": 100,
"list_gap_vertical": 100,
"list_icons_align": "left",
"list_icons_wrap": true,
"list_line_breaks": true,
"list_spacing": "space_between",
"list_text_align": "left",
"locked": true,
"locked_hide": true,
"status_bar_hide": true,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
}
}
]
},
"message_id": "example_message_id"
}
request_config
This operation is sent to the server.
Send this to receive config information, including events and categories.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_config_save
data:
type: object
properties:
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
message_id:
type: string
maxLength: 256
required:
- type
Example payload (JSON):
{
"type": "request_config_save",
"data": {
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_config
Reply to request_config
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_config_save
data:
type: object
properties:
categories:
type: array
description: List of categories
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
border_radius:
type: number
box_shadow:
type: boolean
category_bar_hide:
type: boolean
category_bar_position:
enum:
- top
- bottom
display_name:
type: string
maxLength: 64
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
list_additional_height:
type: integer
maximum: 1024
list_aspect_ratio:
enum:
- auto
- 3/2
- 2/1
- 1/1
- 1/2
- 2/3
list_center_vertical:
type: boolean
list_columns:
type: integer
minimum: 1
maximum: 5
list_gap_horizontal:
type: number
list_gap_vertical:
type: number
list_icons_align:
enum:
- left
- center
- right
list_icons_wrap:
type: boolean
list_line_breaks:
type: boolean
list_spacing:
enum:
- space_between
- center
list_text_align:
enum:
- left
- center
- right
- justify
locked:
type: boolean
locked_hide:
type: boolean
status_bar_hide:
type: boolean
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
required:
- id
maxItems: 512
events:
type: array
description: List of events
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
cooldown_global:
type: integer
description: Global cooldown in ms
cooldown_global_event:
type: integer
description: Global event specific cooldown in ms
cooldown_user:
type: integer
description: User specific cooldown in ms
cooldown_user_event:
type: integer
description: User specific and event specific cooldown in ms
description:
type: string
maxLength: 512
display_name:
type: string
maxLength: 64
exclude_cooldown_global:
type: boolean
description: Event can be sent regardless of global cooldown
exclude_cooldown_user:
type: boolean
description: Event can be sent regardless of user cooldown
following_minimum:
type: integer
description: Minimum follow duration in ms
inputs:
type: array
items:
oneOf:
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: text
default:
type: string
maxLength: 512
regex:
type: string
maxLength: 512
length_min:
type: number
length_max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: number
default:
type: number
step:
type: number
min:
type: number
max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: color
default:
type: string
maxLength: 512
color_settings:
oneOf:
- type: object
properties:
color_type:
type: string
const: rgb
r:
type: object
properties:
min:
type: number
max:
type: number
g:
type: object
properties:
min:
type: number
max:
type: number
b:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsl
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
l:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsv
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
v:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: choice
values:
type: array
items:
type: string
maxLength: 24
maxItems: 128
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: toggle
default:
type: boolean
required:
- input_type
maxItems: 64
limit:
type: integer
limit_user:
type: integer
locked:
type: boolean
locked_hide:
type: boolean
padding:
description: Sets the padding of an item. Adds placeholders before the event
list item.
type: number
points_disable_conversion:
type: boolean
points_required:
type: integer
maximum: 10000
product_sku:
description: Amount of bits required for the event. Only some combinations
(products) are allowed, as seen in the extension configuration
for events. By enabling bits, you confirm that you read and
follow the Twitch Bits Acceptable Use Policy
(https://legal.twitch.com/en/legal/bits-acceptable-use/).
type: string
pattern: ^(?:test_)?event_[0-9]{1,5}$
response:
type: boolean
span_horizontal:
type: integer
minimum: 1
maximum: 5
span_vertical:
type: integer
minimum: 1
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
subscription_minimum:
type: string
enum:
- twitch_sub_none
- twitch_sub_1000
- twitch_sub_2000
- twitch_sub_3000
write_chat:
type: boolean
write_chat_message:
description: "Replaces the default chat message. You can use the following
placeholders: %event_name%, %user_name%, %bits%, %points%."
type: string
maxLength: 412
quick_event:
description: Sends event after clicking button without showing dialog
type: boolean
required:
- id
maxItems: 512
style:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
fonts:
type: object
properties:
title:
type: string
maxLength: 128
title_size:
type: number
minimum: 8
body:
type: string
maxLength: 128
body_size:
type: number
minimum: 8
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "request_config_save",
"data": {
"categories": [
{
"id": "example_id",
"border_radius": 100,
"box_shadow": true,
"category_bar_hide": true,
"category_bar_position": "top",
"display_name": "example_display_name",
"event_ids": ["example", "example2"],
"list_additional_height": 1024,
"list_aspect_ratio": "auto",
"list_center_vertical": true,
"list_columns": 1,
"list_gap_horizontal": 100,
"list_gap_vertical": 100,
"list_icons_align": "left",
"list_icons_wrap": true,
"list_line_breaks": true,
"list_spacing": "space_between",
"list_text_align": "left",
"locked": true,
"locked_hide": true,
"status_bar_hide": true,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
}
}
],
"events": [
{
"id": "example_id",
"category_ids": ["example", "example2"],
"cooldown_global": 5000,
"cooldown_global_event": 5000,
"cooldown_user": 5000,
"cooldown_user_event": 5000,
"description": "example_description",
"display_name": "example_display_name",
"exclude_cooldown_global": true,
"exclude_cooldown_user": true,
"following_minimum": "5",
"inputs": [
{
"id": "example_id",
"label": "example_label",
"input_type": "text",
"default": "example_default",
"regex": "example_regex",
"length_min": 100,
"length_max": 100
}
],
"limit": "5",
"limit_user": "5",
"locked": true,
"locked_hide": true,
"padding": 100,
"points_disable_conversion": true,
"points_required": 10000,
"product_sku": "event_100",
"response": true,
"span_horizontal": 1,
"span_vertical": 1,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
},
"subscription_minimum": "twitch_sub_none",
"write_chat": true,
"write_chat_message": "example_write_chat_message",
"quick_event": true
}
],
"style": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"fonts": {
"title": "example_title",
"title_size": 8,
"body": "example_body",
"body_size": 8
}
}
},
"message_id": "example_message_id"
}
request_config_change
This operation is sent to the server.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_config_change
data:
type: object
properties:
operation:
enum:
- insert
- update
- upsert
- delete
- clear
changes:
type: object
properties:
categories:
type: array
description: List of categories
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
border_radius:
type: number
box_shadow:
type: boolean
category_bar_hide:
type: boolean
category_bar_position:
enum:
- top
- bottom
display_name:
type: string
maxLength: 64
event_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
list_additional_height:
type: integer
maximum: 1024
list_aspect_ratio:
enum:
- auto
- 3/2
- 2/1
- 1/1
- 1/2
- 2/3
list_center_vertical:
type: boolean
list_columns:
type: integer
minimum: 1
maximum: 5
list_gap_horizontal:
type: number
list_gap_vertical:
type: number
list_icons_align:
enum:
- left
- center
- right
list_icons_wrap:
type: boolean
list_line_breaks:
type: boolean
list_spacing:
enum:
- space_between
- center
list_text_align:
enum:
- left
- center
- right
- justify
locked:
type: boolean
locked_hide:
type: boolean
status_bar_hide:
type: boolean
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
required:
- id
maxItems: 512
categories_order_index:
description: 'Set the array index to where items should be inserted (0: start,
-1: end). Can be used for reordering. For example, if you have
items with ids ["a", "b", "c"] and insert a new item "d" at index
1, the result will be ["a", "d", "b", "c"].'
type: number
events:
type: array
description: List of events
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
cooldown_global:
type: integer
description: Global cooldown in ms
cooldown_global_event:
type: integer
description: Global event specific cooldown in ms
cooldown_user:
type: integer
description: User specific cooldown in ms
cooldown_user_event:
type: integer
description: User specific and event specific cooldown in ms
description:
type: string
maxLength: 512
display_name:
type: string
maxLength: 64
exclude_cooldown_global:
type: boolean
description: Event can be sent regardless of global cooldown
exclude_cooldown_user:
type: boolean
description: Event can be sent regardless of user cooldown
following_minimum:
type: integer
description: Minimum follow duration in ms
inputs:
type: array
items:
oneOf:
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: text
default:
type: string
maxLength: 512
regex:
type: string
maxLength: 512
length_min:
type: number
length_max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: number
default:
type: number
step:
type: number
min:
type: number
max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: color
default:
type: string
maxLength: 512
color_settings:
oneOf:
- type: object
properties:
color_type:
type: string
const: rgb
r:
type: object
properties:
min:
type: number
max:
type: number
g:
type: object
properties:
min:
type: number
max:
type: number
b:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsl
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
l:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsv
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
v:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: choice
values:
type: array
items:
type: string
maxLength: 24
maxItems: 128
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: toggle
default:
type: boolean
required:
- input_type
maxItems: 64
limit:
type: integer
limit_user:
type: integer
locked:
type: boolean
locked_hide:
type: boolean
padding:
description: Sets the padding of an item. Adds placeholders before the event
list item.
type: number
points_disable_conversion:
type: boolean
points_required:
type: integer
maximum: 10000
product_sku:
description: Amount of bits required for the event. Only some combinations
(products) are allowed, as seen in the extension
configuration for events. By enabling bits, you confirm that
you read and follow the Twitch Bits Acceptable Use Policy
(https://legal.twitch.com/en/legal/bits-acceptable-use/).
type: string
pattern: ^(?:test_)?event_[0-9]{1,5}$
response:
type: boolean
span_horizontal:
type: integer
minimum: 1
maximum: 5
span_vertical:
type: integer
minimum: 1
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
subscription_minimum:
type: string
enum:
- twitch_sub_none
- twitch_sub_1000
- twitch_sub_2000
- twitch_sub_3000
write_chat:
type: boolean
write_chat_message:
description: "Replaces the default chat message. You can use the following
placeholders: %event_name%, %user_name%, %bits%, %points%."
type: string
maxLength: 412
quick_event:
description: Sends event after clicking button without showing dialog
type: boolean
required:
- id
maxItems: 512
events_order_index:
type: number
description: See description for categories_insertion_index.
style:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
fonts:
type: object
properties:
title:
type: string
maxLength: 128
title_size:
type: number
minimum: 8
body:
type: string
maxLength: 128
body_size:
type: number
minimum: 8
changes_raw:
description: Replace the current config with a raw config string (e.g. from a
config backup). Only works with insert and clear operation.
type: string
maxLength: 65536
reset:
description: Reset changed events (locks, limits and cooldowns).
type: boolean
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- operation
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "request_config_change",
"data": {
"operation": "insert",
"changes": {
"categories": [
{
"id": "example_id",
"border_radius": 100,
"box_shadow": true,
"category_bar_hide": true,
"category_bar_position": "top",
"display_name": "example_display_name",
"event_ids": ["example", "example2"],
"list_additional_height": 1024,
"list_aspect_ratio": "auto",
"list_center_vertical": true,
"list_columns": 1,
"list_gap_horizontal": 100,
"list_gap_vertical": 100,
"list_icons_align": "left",
"list_icons_wrap": true,
"list_line_breaks": true,
"list_spacing": "space_between",
"list_text_align": "left",
"locked": true,
"locked_hide": true,
"status_bar_hide": true,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
}
}
],
"categories_order_index": 100,
"events": [
{
"id": "example_id",
"category_ids": ["example", "example2"],
"cooldown_global": 5000,
"cooldown_global_event": 5000,
"cooldown_user": 5000,
"cooldown_user_event": 5000,
"description": "example_description",
"display_name": "example_display_name",
"exclude_cooldown_global": true,
"exclude_cooldown_user": true,
"following_minimum": "5",
"inputs": [
{
"id": "example_id",
"label": "example_label",
"input_type": "text",
"default": "example_default",
"regex": "example_regex",
"length_min": 100,
"length_max": 100
}
],
"limit": "5",
"limit_user": "5",
"locked": true,
"locked_hide": true,
"padding": 100,
"points_disable_conversion": true,
"points_required": 10000,
"product_sku": "event_100",
"response": true,
"span_horizontal": 1,
"span_vertical": 1,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
},
"subscription_minimum": "twitch_sub_none",
"write_chat": true,
"write_chat_message": "example_write_chat_message",
"quick_event": true
}
],
"events_order_index": 100,
"style": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"fonts": {
"title": "example_title",
"title_size": 8,
"body": "example_body",
"body_size": 8
}
}
},
"changes_raw": "example_changes_raw",
"reset": true,
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_config_change
Reply to request_config_change
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_config_change
data:
type: object
properties:
success:
type: boolean
size_current:
type: number
size_maximum:
type: number
compressed:
type: string
error:
type: object
properties:
error_type:
enum:
- unknown
- invalid_format
- already_exists
- does_not_exist
- limit_reached
- unsupported
- twitch
message:
type: string
required:
- error_type
required:
- success
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "response_config_change",
"data": {
"success": true,
"size_current": "4.5",
"size_maximum": "4.5",
"compressed": "example_compressed",
"error": {
"error_type": "unknown",
"message": "example_message"
}
},
"message_id": "example_message_id"
}
request_connection_check
This operation is received by the client.
A check used by the server to test whether the client is connected (similar to a ping). The reply includes information about the current status (whether the viewers can send events) and the secret.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_connection_check
required:
- type
Example payload (JSON):
{
"type": "request_connection_check"
}
This message requires a reply to be sent to the server:
response_connection_check
Reply to request_connection_check
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_connection_check
data:
type: object
properties:
active:
type: boolean
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
required:
- secret
- active
required:
- type
- data
Example payload (JSON):
{
"type": "response_connection_check",
"data": {
"active": true,
"secret": "example_secret",
"version": "example_version"
}
}
request_event_data
This operation is received by the client.
This is sent by the server if custom response is active for an event. Requires a response with the corresponding message_id.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_event_data
data:
type: object
properties:
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
event_display_name:
type: string
event_id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
is_test:
type: boolean
used_points:
type: number
user_display_name:
type: string
user_id:
type: string
minLength: 1
maxLength: 256
processed_at:
type: number
inputs:
type: array
items:
oneOf:
- type: object
properties:
value_type:
type: string
const: string
value:
type:
- string
- "null"
maxLength: 512
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: color
value:
type:
- string
- "null"
maxLength: 7
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: number
value:
type:
- number
- "null"
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
- type: object
properties:
value_type:
type: string
const: boolean
value:
type:
- boolean
- "null"
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
required:
- value_type
maxItems: 64
required:
- event_id
message_id:
type: string
maxLength: 256
required:
- type
- data
- message_id
Example payload (JSON):
{
"type": "request_event_data",
"data": {
"category_ids": ["example", "example2"],
"event_display_name": "example_event_display_name",
"event_id": "example_event_id",
"is_test": true,
"used_points": 100,
"user_display_name": "example_user_display_name",
"user_id": "example_user_id",
"processed_at": "1767222000000",
"inputs": [
{
"value_type": "string",
"value": "example_value",
"id": "example_id"
}
]
},
"message_id": "example_message_id"
}
This message requires a reply to be sent to the server:
response_event_data
Reply to request_event_data
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_event_data
data:
type: object
properties:
message:
type: string
description: The message that is sent to the viewer, to be shown within the
extension. Supports simple markdown with ** (bold) and \n (line
break).
error:
type: boolean
options:
type: object
properties:
cooldown_global:
type: integer
description: Global cooldown in ms to use. Overrides event configuration.
cooldown_global_event:
type: integer
description: Global event specific cooldown in ms to use. Overrides event
configuration.
cooldown_user:
type: integer
description: User cooldown in ms to use. Overrides event configuration.
cooldown_user_event:
type: integer
description: Event specific user cooldown in ms to use. Overrides event
configuration.
write_chat:
type: boolean
description: Whether to write a chat message. Overrides event configuration.
Requires chat capabilities.
write_chat_message:
type: string
description: "Custom chat message to use if one is written. You can use the
following placeholders: %event_name%, %user_name%, %points%."
maxLength: 412
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
message_id:
type: string
maxLength: 256
required:
- type
- message_id
Example payload (JSON):
{
"type": "response_event_data",
"data": {
"message": "example_message",
"error": true,
"options": {
"cooldown_global": 5000,
"cooldown_global_event": 5000,
"cooldown_user": 5000,
"cooldown_user_event": 5000,
"write_chat": true,
"write_chat_message": "example_write_chat_message"
},
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
request_event_list
This operation is sent to the server.
Send this to receive a list of events.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_event_list
data:
type: object
properties:
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
message_id:
type: string
maxLength: 256
required:
- type
Example payload (JSON):
{
"type": "request_event_list",
"data": {
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_event_list
Reply to request_event_list
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_event_list
data:
type: object
properties:
events:
type: array
description: List of events
items:
type: object
properties:
id:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
category_ids:
type: array
description: List of item ids
items:
type: string
minLength: 1
maxLength: 32
pattern: ^[\w-]+$
maxItems: 512
cooldown_global:
type: integer
description: Global cooldown in ms
cooldown_global_event:
type: integer
description: Global event specific cooldown in ms
cooldown_user:
type: integer
description: User specific cooldown in ms
cooldown_user_event:
type: integer
description: User specific and event specific cooldown in ms
description:
type: string
maxLength: 512
display_name:
type: string
maxLength: 64
exclude_cooldown_global:
type: boolean
description: Event can be sent regardless of global cooldown
exclude_cooldown_user:
type: boolean
description: Event can be sent regardless of user cooldown
following_minimum:
type: integer
description: Minimum follow duration in ms
inputs:
type: array
items:
oneOf:
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: text
default:
type: string
maxLength: 512
regex:
type: string
maxLength: 512
length_min:
type: number
length_max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: number
default:
type: number
step:
type: number
min:
type: number
max:
type: number
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: color
default:
type: string
maxLength: 512
color_settings:
oneOf:
- type: object
properties:
color_type:
type: string
const: rgb
r:
type: object
properties:
min:
type: number
max:
type: number
g:
type: object
properties:
min:
type: number
max:
type: number
b:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsl
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
l:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
- type: object
properties:
color_type:
type: string
const: hsv
h:
type: object
properties:
min:
type: number
max:
type: number
s:
type: object
properties:
min:
type: number
max:
type: number
v:
type: object
properties:
min:
type: number
max:
type: number
required:
- color_type
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: choice
values:
type: array
items:
type: string
maxLength: 24
maxItems: 128
required:
- input_type
- type: object
properties:
id:
type: string
maxLength: 32
pattern: ^[\w-]*$
label:
type: string
maxLength: 24
input_type:
type: string
const: toggle
default:
type: boolean
required:
- input_type
maxItems: 64
limit:
type: integer
limit_user:
type: integer
locked:
type: boolean
locked_hide:
type: boolean
padding:
description: Sets the padding of an item. Adds placeholders before the event
list item.
type: number
points_disable_conversion:
type: boolean
points_required:
type: integer
maximum: 10000
product_sku:
description: Amount of bits required for the event. Only some combinations
(products) are allowed, as seen in the extension configuration
for events. By enabling bits, you confirm that you read and
follow the Twitch Bits Acceptable Use Policy
(https://legal.twitch.com/en/legal/bits-acceptable-use/).
type: string
pattern: ^(?:test_)?event_[0-9]{1,5}$
response:
type: boolean
span_horizontal:
type: integer
minimum: 1
maximum: 5
span_vertical:
type: integer
minimum: 1
style_override:
type: object
properties:
light:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
dark:
type: object
properties:
color_font_title:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_font:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_1:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_2:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_3:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
color_background:
type: string
pattern: ^#(?:[0-9a-fA-F]{3}){1,2}$
subscription_minimum:
type: string
enum:
- twitch_sub_none
- twitch_sub_1000
- twitch_sub_2000
- twitch_sub_3000
write_chat:
type: boolean
write_chat_message:
description: "Replaces the default chat message. You can use the following
placeholders: %event_name%, %user_name%, %bits%, %points%."
type: string
maxLength: 412
quick_event:
description: Sends event after clicking button without showing dialog
type: boolean
required:
- id
maxItems: 512
required:
- events
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "response_event_list",
"data": {
"events": [
{
"id": "example_id",
"category_ids": ["example", "example2"],
"cooldown_global": 5000,
"cooldown_global_event": 5000,
"cooldown_user": 5000,
"cooldown_user_event": 5000,
"description": "example_description",
"display_name": "example_display_name",
"exclude_cooldown_global": true,
"exclude_cooldown_user": true,
"following_minimum": "5",
"inputs": [
{
"id": "example_id",
"label": "example_label",
"input_type": "text",
"default": "example_default",
"regex": "example_regex",
"length_min": 100,
"length_max": 100
}
],
"limit": "5",
"limit_user": "5",
"locked": true,
"locked_hide": true,
"padding": 100,
"points_disable_conversion": true,
"points_required": 10000,
"product_sku": "event_100",
"response": true,
"span_horizontal": 1,
"span_vertical": 1,
"style_override": {
"light": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
},
"dark": {
"color_font_title": "#ffffff",
"color_font": "#ffffff",
"color_1": "#ffffff",
"color_2": "#ffffff",
"color_3": "#ffffff",
"color_background": "#ffffff"
}
},
"subscription_minimum": "twitch_sub_none",
"write_chat": true,
"write_chat_message": "example_write_chat_message",
"quick_event": true
}
]
},
"message_id": "example_message_id"
}
request_points_change
This operation is sent to the server.
Adds points to specific users/viewers via id. Points added this way are not persisted and might be lost during server restarts or version updates.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_points_change
data:
type: object
properties:
user_ids:
type: array
items:
type: string
minLength: 1
maxLength: 256
maxItems: 512
points_change:
type: number
maximum: 10000
message:
type: string
maxLength: 128
required:
- user_ids
- points_change
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "request_points_change",
"data": {
"user_ids": ["example", "example2"],
"points_change": 10000,
"message": "example_message"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_points_change
Reply to request_points_change
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_points_change
data:
type: object
properties:
success:
type: boolean
required:
- success
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "response_points_change",
"data": {
"success": true
},
"message_id": "example_message_id"
}
request_secret_check
This operation is sent to the server.
Send this to check whether a secret is valid.
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: request_secret_check
data:
type: object
properties:
secret:
type: string
maxLength: 256
version:
type: string
maxLength: 32
description: Optional version information about the used streamer library.
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "request_secret_check",
"data": {
"secret": "example_secret",
"version": "example_version"
},
"message_id": "example_message_id"
}
On receiving a valid message, the server sends a reply:
response_secret_check
Reply to request_secret_check
AsyncApi schema for message:
type: object
properties:
type:
type: string
const: response_secret_check
data:
type: object
properties:
valid:
type: boolean
required:
- valid
message_id:
type: string
maxLength: 256
required:
- type
- data
Example payload (JSON):
{
"type": "response_secret_check",
"data": {
"valid": true
},
"message_id": "example_message_id"
}