Skip to content

REST API reference

Every web address of Cuebot's REST API, made from the same description Cuebot serves at /api/v1/openapi.json. New to this? Read Controlling Cuebot from other programs first: it shows how to turn the API on, where the token is, and how to try it.

  • Address: http://127.0.0.1:7475/api/v1 (the port is on the REST API card on Apps > Servers).
  • Token: every request needs the header Authorization: Bearer YOUR_TOKEN. Without it you get 401.
  • Data: requests and answers are JSON. Errors look like {"error": "...", "details": [{"path": "...", "message": "..."}]}.
  • {id} in an address can be the id or the name of the action, command or timer. Put %20 for a space.

The examples use curl, a small program that comes with Windows 10 and 11, macOS and Linux. Put your token in place of YOUR_TOKEN.

System

GET /status

Tells you Cuebot's version, which platforms are connected, which servers run, and how many actions, commands, timers and variables you have. A quick way to check your token works.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed.

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/status"

GET /openapi.json

Gives you this whole list of addresses as one OpenAPI file. OpenAPI is a standard way to describe an API, so tools like Postman or Swagger can read it and build requests for you.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed.

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/openapi.json"

Actions

GET /actions

Lists your actions in short form: id, name, group, whether they are on, their triggers and how many steps they have. Add ?group=Alerts or ?search=raid to show only some.

In the address What it is
group (optional, after ?) Only this group
search (optional, after ?) Name or group contains

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/actions"

POST /actions

Makes a new action from the JSON you send. Cuebot checks every trigger and sub-action type and setting first; mistakes come back as 400 with a list of problems. Find type ids with GET /triggers and GET /subactions.

The body is one Action.

Answers: 201 Created; 400 Invalid request (details lists each problem); 409 An action with this id exists; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Say hello","group":"Chat","enabled":true,"triggers":[{"type":"command.triggered","settings":{"command":"Hello"}}],"subActions":[{"type":"chat.send","parameters":{"platform":"All","message":"Hi %user%, welcome in!"}}]}' \
  "http://127.0.0.1:7475/api/v1/actions"

GET /actions/{id}

Gives you one whole action: its settings, triggers and every sub-action, with the steps inside If and Group branches. Good to copy, change and send back with PUT.

In the address What it is
id (required, in the path) Action id or name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers"

PUT /actions/{id}

Swaps the whole action for the one you send. The id in the address is kept. Fields you leave out go back to their defaults, so send the full action (get it with GET first). Use PATCH to change only a part.

In the address What it is
id (required, in the path) Action id or name

The body is one Action.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PUT -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Say hello","group":"Chat","enabled":true,"triggers":[{"type":"command.triggered","settings":{"command":"Hello"}}],"subActions":[{"type":"chat.send","parameters":{"platform":"All","message":"Hi %user%, welcome in!"}}]}' \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers"

PATCH /actions/{id}

Changes only the top-level fields you send and keeps the rest. Example: {"enabled": false} or {"name": "New name"}. A list like subActions is replaced as a whole, not added to.

In the address What it is
id (required, in the path) Action id or name

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PATCH -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Say hello (new)","group":"Chat"}' \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers"

DELETE /actions/{id}

Deletes the action for good. Its triggers stop at once. There is no undo, so export it first (GET /export) if you may want it back.

In the address What it is
id (required, in the path) Action id or name

Answers: 200 Deleted; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers"

POST /actions/{id}/run

Runs an action, as if its trigger happened. Without wait, Cuebot starts it and answers at once (202). With "wait": true, Cuebot answers when the action has finished, with how it went. A turned-off action answers 409.

In the address What it is
id (required, in the path) Action id or name
Body field Type What it is
args object Variables for the action, like {"user": "Bob"}. Each one becomes a %name% word in its steps, so %user% turns into Bob.
wait true/false true: answer only when the action has finished, with how it went. false or left out: answer at once (202) while it runs.
timeoutSeconds number With wait: the most seconds to wait, from 1 to 300 (default 30). If it takes longer, you get 202 and the action keeps running.

Answers: 202 Queued; 200 Finished (wait); 404 Not found; 409 The action is disabled; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"args":{"user":"Bob","message":"hello"},"wait":true,"timeoutSeconds":10}' \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers/run"

POST /actions/{id}/enable

Turns the action on, so its triggers work again. The change is saved. You get the action's short form back.

In the address What it is
id (required, in the path) Action id or name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers/enable"

POST /actions/{id}/disable

Turns the action off. Its triggers are ignored and it cannot be run until you turn it on again. The change is saved.

In the address What it is
id (required, in the path) Action id or name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/actions/Thank%20followers/disable"

Catalogue

GET /triggers

Lists every kind of trigger Cuebot knows, like twitch.follow or command.triggered, with their settings. Add ?category=Twitch or ?search=raid to show only some. The answer also lists all categories.

In the address What it is
category (optional, after ?) Exact category
search (optional, after ?) Words in type id, name or category

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/triggers"

GET /triggers/{type}

Tells you everything about one trigger type, like twitch.follow: its settings with help, live suggestions (for example your command names) and a settingsSchema that tools can check against.

In the address What it is
type (required, in the path) Trigger type id

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/triggers/twitch.follow"

GET /subactions

Lists every kind of sub-action (step) Cuebot knows, like chat.send or core.delay, with their settings and branches. Add ?category=OBS or ?search=scene to show only some.

In the address What it is
category (optional, after ?) Exact category
search (optional, after ?) Words in type id, name or category

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/subactions"

GET /subactions/{type}

Tells you everything about one sub-action type, like chat.send: its settings with help, its branches and a parametersSchema that tools can check against.

In the address What it is
type (required, in the path) Sub-action type id

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/subactions/chat.send"

GET /scriptfunctions

Lists the functions you can call from C# or Python code steps, with a short description and their inputs. Add ?search=chat to find some.

In the address What it is
search (optional, after ?) Name or description contains

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/scriptfunctions"

Commands

GET /commands

Lists all your chat commands with their settings.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/commands"

POST /commands

Makes a new chat command, like !hello. A command does nothing alone: give an action a command.triggered trigger with the command's name so it runs when someone types it.

The body is one Command.

Answers: 201 Created; 400 Invalid request (details lists each problem); 409 A command with this id exists; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Hello","group":"Chat","enabled":true,"mode":"Basic","location":"Start","commands":["!hello","!hi"],"sources":[],"minimumRole":"Everyone","userCooldownSeconds":30}' \
  "http://127.0.0.1:7475/api/v1/commands"

GET /commands/{id}

Gives you one command and, in linkedActions, the actions it runs (the ones with a command.triggered trigger for it). Use the command's name, like Hello, not what viewers type.

In the address What it is
id (required, in the path) Command id or name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/commands/Hello%20command"

PUT /commands/{id}

Swaps the whole command for the one you send. The id in the address is kept. Fields you leave out go back to their defaults, so send the full command. Use PATCH to change only a part.

In the address What it is
id (required, in the path) Command id or name

The body is one Command.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PUT -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Hello","group":"Chat","enabled":true,"mode":"Basic","location":"Start","commands":["!hello","!hi"],"sources":[],"minimumRole":"Everyone","userCooldownSeconds":30}' \
  "http://127.0.0.1:7475/api/v1/commands/Hello%20command"

PATCH /commands/{id}

Changes only the fields you send and keeps the rest. Example: {"enabled": false} or {"userCooldownSeconds": 60}. A list like commands is replaced as a whole.

In the address What it is
id (required, in the path) Command id or name

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PATCH -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"userCooldownSeconds":60,"commands":["!hello","!hi","!hey"]}' \
  "http://127.0.0.1:7475/api/v1/commands/Hello%20command"

DELETE /commands/{id}

Deletes the command for good. Actions that used it stay, but nothing starts them from chat any more.

In the address What it is
id (required, in the path) Command id or name

Answers: 200 Deleted; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/commands/Hello%20command"

Timers

GET /timers

Lists your timers. While timers run, each one also has a state: on or off right now, its interval and when it goes off next.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/timers"

POST /timers

Makes a new timer. A timer only goes off; to make it do something, give an action a core.timer trigger with the timer's name. The answer has a hint with that trigger.

The body is one Timer.

Answers: 201 Created; 400 Invalid request (details lists each problem); 409 A timer with this id exists; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Social links","enabled":true,"intervalSeconds":1200,"repeat":true,"minChatLines":5}' \
  "http://127.0.0.1:7475/api/v1/timers"

GET /timers/{id}

Gives you one timer, with its state right now when timers run.

In the address What it is
id (required, in the path) Timer id or name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/timers/Reminder"

PUT /timers/{id}

Swaps the whole timer for the one you send. The id in the address is kept. Fields you leave out go back to their defaults (300 seconds, repeat on). Use PATCH to change only a part.

In the address What it is
id (required, in the path) Timer id or name

The body is one Timer.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PUT -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Social links","enabled":true,"intervalSeconds":1200,"repeat":true,"minChatLines":5}' \
  "http://127.0.0.1:7475/api/v1/timers/Reminder"

PATCH /timers/{id}

Changes only the fields you send and keeps the rest, and saves it. Example: {"intervalSeconds": 600}. For a change that is not saved, use POST /timers/{id}/state.

In the address What it is
id (required, in the path) Timer id or name

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PATCH -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"intervalSeconds":600}' \
  "http://127.0.0.1:7475/api/v1/timers/Reminder"

DELETE /timers/{id}

Deletes the timer for good. Actions with a core.timer trigger for it stay, but nothing starts them any more.

In the address What it is
id (required, in the path) Timer id or name

Answers: 200 Deleted; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/timers/Reminder"

POST /timers/{id}/state

Turns a timer on or off, or changes how often it goes off, only until Cuebot restarts. Nothing is saved, like the Set timer state sub-action. Turning it on or changing the time starts the wait again from now.

In the address What it is
id (required, in the path) Timer id or name
Body field Type What it is
enabled true/false true: turn the timer on. false: turn it off. Leave it out to keep it as it is. Not saved.
intervalSeconds whole number New seconds between goes, like 600. 0 stops it going off. Leave it out to keep it. Not saved; does nothing for cron or random timers.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"enabled":true,"intervalSeconds":600}' \
  "http://127.0.0.1:7475/api/v1/timers/Reminder/state"

Globals

GET /globals

Lists your global variables, the ~name~ words every action can use. Add ?persisted=true for only the saved ones, or ?persisted=false for only the temporary ones.

In the address What it is
persisted (optional, after ?) true: persisted only, false: temporary only

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/globals"

GET /globals/{name}

Gives you one global variable: its value, what kind of value it is, whether it is saved, and when it last changed.

In the address What it is
name (required, in the path) Variable name

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/globals/deaths"

PUT /globals/{name}

Sets a global variable, and makes it if it is new. Example: {"value": 3} for ~deaths~. It is saved unless you send "persisted": false.

In the address What it is
name (required, in the path) Variable name
Body field Type What it is
value any The new value: text like "Bob", a number like 3, true/false, or null for empty.
persisted true/false true (default): the variable is saved and kept after a restart. false: it is temporary and gone when Cuebot closes.

Answers: 200 OK; 400 Invalid request (details lists each problem); 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X PUT -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"value":3,"persisted":true}' \
  "http://127.0.0.1:7475/api/v1/globals/deaths"

DELETE /globals/{name}

Deletes a global variable. Actions that use ~name~ then find it empty.

In the address What it is
name (required, in the path) Variable name

Answers: 200 Deleted; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/globals/deaths"

Runs

GET /history

Lists recent action runs, newest first, with runs still waiting or running. You see what started each one, how long it took and any error. Add ?action=Say%20hello for one action or ?includeArgs=true for its variables.

In the address What it is
limit (optional, after ?) Maximum runs (default 50)
action (optional, after ?) Only this action (id or name)
includeArgs (optional, after ?) Include the arguments

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/history"

Media requests

GET /media

Tells you about media requests: the video playing, the waiting queue, whether viewers may request now, whether the player is paused, and the volume.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/media"

POST /media/requests

Adds a YouTube video to the media request queue. It is free and does not count toward a viewer's limit. If Cuebot refuses it (closed, queue full, private video...), you get 400 with the reason.

Body field Type What it is
link text The YouTube video: a normal link, a youtu.be or shorts link, or just the video id, like "dQw4w9WgXcQ".
user text The name shown as who asked for it, like "Bob". Empty means "API".

Answers: 200 Added; 400 Invalid request (details lists each problem); 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"link":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","user":"Bob"}' \
  "http://127.0.0.1:7475/api/v1/media/requests"

DELETE /media/requests/{id}

Takes a waiting video out of the queue and gives the viewer their points back. Find the id in GET /media. A video that is already playing cannot be removed here; use skip.

In the address What it is
id (required, in the path) Request id

Answers: 200 Removed; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X DELETE -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/media/requests/REQUEST_ID"

POST /media/{command}

Controls media requests. skip: play the next video (404 if nothing plays). pause / resume: stop or go on with the player. clear: empty the waiting queue and refund it. open / close: let viewers request, or stop them.

In the address What it is
command (required, in the path) skip, pause, resume, clear (refunds the queue), open or close requests

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/media/skip"

Giveaways

GET /giveaway

Tells you about the giveaway running now, or the last one: the prize, how to enter, how many people and tickets, and the winners. giveaway is empty if there has never been one.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/giveaway"

POST /giveaway

Opens a giveaway. Viewers on every platform enter with a chat command, like !join (or !join 3 for 3 tickets). Tickets can cost Cuebot points. Only one giveaway at a time: draw or cancel the last one first (else 409).

Body field Type What it is
title text The prize, like "Steam game key". It must not be empty.
command text What viewers type to enter, like "!join" (the default). "!join 3" then buys 3 tickets.
ticketCost whole number Cuebot points one ticket costs, like 100. 0 (default) means free.
maxTickets whole number The most tickets one viewer can have, like 5. Default 1.
currency text Which points currency pays for tickets, like "Coins". Empty means your main currency.
subscriberLuck number How many times a subscriber's tickets count, like 2 for double chance. 1 (default) means the same as everyone. Not below 1.
subscribersOnly true/false true: only subscribers can enter. false (default): everyone can.
seconds whole number How many seconds it takes entries, like 300 for 5 minutes. 0 (default) means until you close it.
winners whole number How many winners to draw, like 3. Default 1. The same viewer never wins twice.

Answers: 200 Opened; 400 Invalid request (details lists each problem); 409 A giveaway is still running; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"title":"Steam game key","command":"!join","ticketCost":100,"maxTickets":5,"subscriberLuck":2,"subscribersOnly":false,"seconds":300,"winners":1}' \
  "http://127.0.0.1:7475/api/v1/giveaway"

POST /giveaway/{command}

Controls the giveaway. close: stop taking entries. draw: pick the winners at random. redraw: pick one more winner (for example if one did not answer). cancel: stop it and give every ticket's points back.

In the address What it is
command (required, in the path) close, draw, redraw (one more winner) or cancel (refunds tickets)

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/giveaway/draw"

Store

GET /store

Tells you about the points store: the chat command to buy (like !redeem), the items, purchases waiting for your OK, and the latest 20 finished ones.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/store"

POST /store/redemptions/{id}/{command}

Answers a store purchase that waits for your OK. approve: accept it. reject: say no; the viewer gets the points back and the item goes back in stock. Find the id in pending from GET /store.

In the address What it is
id (required, in the path) Redemption id
command (required, in the path) approve or reject (refunds the points)

Answers: 200 OK; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/store/redemptions/REDEMPTION_ID/approve"

Polls

GET /polls

Tells you the latest poll and prediction from each place (Twitch, YouTube and Cuebot's own), with votes and points, plus the chat commands to vote and bet in Cuebot's own ones.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/polls"

POST /polls

Starts a Cuebot chat poll that works on every platform. Viewers vote with the vote command, like !vote 2. Give 2 to 10 choices. Only one poll at a time (else 409).

Body field Type What it is
title text The question, like "Which game next?". It must not be empty.
choices list of text The answers, 2 to 10 different ones, like ["Minecraft", "Tetris"]. Viewers vote by number (!vote 1) or by the answer.
duration whole number How many seconds the poll runs, like 120. Default 60. 0 means until you end it.

Answers: 200 Started; 400 Invalid request (details lists each problem); 409 A chat poll is already running; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"title":"Which game next?","choices":["Minecraft","Elden Ring","Tetris"],"duration":120}' \
  "http://127.0.0.1:7475/api/v1/polls"

POST /polls/end

Ends the Cuebot chat poll that runs now and shows the result. 404 if no poll runs.

Answers: 200 Ended; 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/polls/end"

POST /predictions

Starts a Cuebot prediction. Viewers bet Cuebot points on an outcome with the bet command, like !bet 1 500. Winners share all the points. Needs Cuebot points, and only one at a time (else 409).

Body field Type What it is
title text The question, like "Will I beat the boss?". It must not be empty.
outcomes list of text The possible results, 2 to 10 different ones, like ["Yes", "No"].
window whole number How many seconds viewers can bet, like 120 (the default). 0 means until you lock it.
currency text Which points currency viewers bet, like "Coins". Empty means your main currency.

Answers: 200 Started; 400 Invalid request (details lists each problem); 409 A prediction is still open, or points are not available; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"title":"Will I beat the boss?","outcomes":["Yes","No"],"window":120,"currency":""}' \
  "http://127.0.0.1:7475/api/v1/predictions"

POST /predictions/{command}

Controls the Cuebot prediction. lock: stop taking bets. resolve: pick the winning outcome, with {"winner": 1} (count from 1) or its title, and pay the winners. cancel: stop it and give every bet back.

In the address What it is
command (required, in the path) lock, resolve (body {winner: number from 1 or title}) or cancel (refunds every bet)
Body field Type What it is
winner text Only for resolve: the winning outcome's number counting from 1, like "1", or its title, like "Yes". Leave it out for lock and cancel.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"winner":"1"}' \
  "http://127.0.0.1:7475/api/v1/predictions/lock"

Speech

GET /speech

Tells you about Cuebot's speech (text read out loud): whether it is on, paused, how many texts wait, and the text playing now.

Answers: 200 OK; 503 Speech is not available; 401 Missing or wrong token; 403 Origin not allowed.

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/speech"

POST /speech/{command}

Controls the speech queue. pause / resume: hold or go on. skip: stop the text playing now. next: stop the text playing and, while paused, let one waiting text play, so you can go through them one by one.

In the address What it is
command (required, in the path) next, pause, resume or skip

Answers: 200 OK; 404 Not found; 503 Speech is not available; 401 Missing or wrong token; 403 Origin not allowed.

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/speech/pause"

Overlays

GET /alerts

Tells you whether the alerts on your stream overlay are paused (new ones wait) or muted (no sound).

Answers: 200 OK; 503 Overlays are not available; 401 Missing or wrong token; 403 Origin not allowed.

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/alerts"

POST /alerts/{command}

Controls the alerts on every overlay page. pause: the alert playing finishes, new ones wait. resume: go on. skip: end the alert playing now. mute / unmute: turn alert sounds and videos off or on.

In the address What it is
command (required, in the path) pause, resume, skip, mute or unmute

Answers: 200 OK; 404 Not found; 503 Overlays are not available; 401 Missing or wrong token; 403 Origin not allowed.

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/alerts/pause"

Chat

GET /chat

Gives you the latest chat messages from all platforms in one list, plus the activity feed (follows, subs, raids...). Add ?limit=20 for fewer. It also lists which platforms can send.

In the address What it is
limit (optional, after ?) Maximum items (default 50)

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/chat"

POST /chat

Writes a chat message. Pick a platform, like "Twitch", or "All" (the default) for every connected one. 409 if no platform could send.

Body field Type What it is
message text What to write, like "Thanks for watching!". It must not be empty.
platform text Where to write, like "Twitch" or "YouTube". "All" or empty writes on every connected platform. GET /chat lists the ones that can send.

Answers: 200 Sent; 400 Invalid request (details lists each problem); 409 No platform could send; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"message":"Thanks for watching! See you tomorrow.","platform":"All"}' \
  "http://127.0.0.1:7475/api/v1/chat"

Companion

GET /dashboard

Everything a companion app's dashboard shows, in one answer: which platforms are connected, this stream's totals, your subathon timers and points goals, your top spenders, and the latest 50 activity items (newest first). revision goes up whenever any of it changes; GET /events sends dashboard.changed with the new revision, so an app only fetches this again when it needs to.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/dashboard"

GET /decks

Lists your Cuebot Decks with their id, name, whether they are on, their grid size and how many pages they have. The decks themselves (their buttons, presses and live updates) are on the HTTP server at /deck/{id}.

Answers: 200 OK; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/decks"

POST /subathon/{timer}/{command}

Controls one subathon timer, by id or name. start, pause, resume, toggle and reset need no body. time adds or takes away time with {"add": 300} (seconds, negative to take away) or sets the time left with {"set": 3600}. multiplier sets how much time events add, like {"value": 0.5} when too much is coming in. Answers with every timer and goal.

In the address What it is
timer (required, in the path) Timer id or name
command (required, in the path) start, pause, resume, toggle, reset, time ({"add": seconds} or {"set": seconds}) or multiplier ({"value": 2})
Body field Type What it is
add number For time: seconds to add, like 300. Negative takes time away.
set number For time: the time left to set, in seconds, like 3600.
value number For multiplier: how much time events add, like 0.5 for half or 2 for double.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"add":300}' \
  "http://127.0.0.1:7475/api/v1/subathon/{timer}/pause"

POST /goals/{goal}/{command}

Changes one points goal, by id or name. points adds points with {"add": 5} or sets them with {"set": 20}. multiplier sets how many points events give, like {"value": 2}. reset starts the goal again from 0. Answers with every timer and goal.

In the address What it is
goal (required, in the path) Goal id or name
command (required, in the path) points ({"add": n} or {"set": n}), multiplier ({"value": 2}) or reset
Body field Type What it is
add number For points: points to add, like 5. Negative takes points away.
set number For points: the goal's points to set, like 20.
value number For multiplier: how many points events give, like 2 for double.

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"add":5}' \
  "http://127.0.0.1:7475/api/v1/goals/{goal}/pause"

Import/export

POST /import/preview

Shows what an import would add or change, without changing anything. Send the import text in data: a Cuebot share text (starts with CUEBOT1:) or a Streamer.bot export.

Body field Type What it is
data text The import text: a Cuebot share text (starts with CUEBOT1:), Cuebot share JSON, or a Streamer.bot export string.

Answers: 200 OK; 400 Invalid request (details lists each problem); 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"data":"CUEBOT1:PASTE_THE_WHOLE_IMPORT_TEXT_HERE"}' \
  "http://127.0.0.1:7475/api/v1/import/preview"

POST /import/apply

Imports a Cuebot share text (CUEBOT1:...) or a Streamer.bot export. Nothing in it runs. mode says what to do when something with the same id or name is already there. Check it with /import/preview first.

Body field Type What it is
data text The import text: a Cuebot share text (starts with CUEBOT1:), Cuebot share JSON, or a Streamer.bot export string.
mode one of overwrite, addAsNew, skip What to do when something with the same id or name is already there. overwrite: replace it. addAsNew: add a copy with a new name. skip: keep yours.
items list of object Choices for single things, like [{"kind": "action", "name": "Say hello", "include": false}]. kind is action, queue, command, timer or global. Leave it out to import everything.

Answers: 200 Imported; 400 Invalid request (details lists each problem); 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"data":"CUEBOT1:PASTE_THE_WHOLE_IMPORT_TEXT_HERE","mode":"addAsNew","items":[{"kind":"action","name":"Say hello","include":true,"mode":"overwrite"}]}' \
  "http://127.0.0.1:7475/api/v1/import/apply"

GET /export

Makes a share text (starts with CUEBOT1:) for the things you name, like ?actions=Say%20hello,Raid%20alert. Others can paste it into their import. Things they need, like queues and other actions, come along unless includeDependencies=false.

In the address What it is
actions (optional, after ?) Actions
commands (optional, after ?) Commands
timers (optional, after ?) Timers
globals (optional, after ?) Global variables
includeDependencies (optional, after ?) Include referenced actions, queues... (default true)
name (optional, after ?) Bundle name

Answers: 200 OK; 400 Invalid request (details lists each problem); 404 Not found; 401 Missing or wrong token; 403 Origin not allowed; 503 That part of Cuebot is not available (its module is not loaded or not ready).

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/export"

Events

GET /events

Keeps the connection open and sends you each Cuebot event as it happens (Server-Sent Events), like twitch.chatMessage, plus action.runCompleted when a run ends and dashboard.changed (with the new revision) when something GET /dashboard shows has changed. Add ?types=twitch.* for only some. At most 16 at once.

In the address What it is
types (optional, after ?) Comma separated event types; a trailing * matches a prefix (twitch.*)

Answers: 200 text/event-stream; data is {type, time, args}; 401 Missing or wrong token; 429 Too many open event streams.

curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://127.0.0.1:7475/api/v1/events"

Data shapes

The objects the answers above name, with their fields.

Error

Field Type What it is
error text What went wrong, in one sentence, like "Action 'Say hi' not found".
details list of Problem When there are several problems: one entry per problem, each with where it is and what is wrong.

Giveaway

Field Type What it is
id text The giveaway's id.
title text The prize, like "Steam game key".
status text Where it is: open (taking entries), closed (no more entries), drawn (winners picked) or canceled.
command text What viewers type to enter, like "!join".
ticketCost whole number Cuebot points one ticket costs. 0 means free.
maxTickets whole number The most tickets one viewer can have.
currency text The name of the points currency that pays for tickets.
subscribersOnly true/false true when only subscribers can enter.
endsAt text When entries close, as date and time (UTC). Empty when it runs until you close it.
entrants whole number How many viewers entered.
tickets whole number How many tickets there are in all.
recent list of text The names of the latest viewers who entered, newest first (up to 8).
winners list of object The winners so far, each with name and platform.

Poll

Field Type What it is
source text Where it runs: twitch, youtube or cuebot (Cuebot's own chat poll or prediction).
kind text What it is: poll (viewers vote) or prediction (viewers bet points on the result).
id text The poll's or prediction's id.
title text The question, like "Which game next?".
status text Where it is: active, locked (a prediction taking no more bets), ended or canceled.
choices list of object The answers, each with its id, title, votes (people), points bet and percent.
winner whole number The winning answer's place, counting from 0 (0 is the first answer). -1 while there is no winner.
endsAt text When voting or betting closes, as date and time (UTC). Empty when it has no time limit.
totalVotes whole number How many votes (or bettors) in all.
totalPoints whole number For predictions: how many points were bet in all.
currency text For Cuebot predictions: the name of the points currency bet.
command text For Cuebot's own: the chat command to vote or bet, like "!vote" or "!bet".

Problem

Field Type What it is
path text Where the problem is in the data you sent, like "subActions[0].parameters.platform" (the first step's platform setting).
message text What is wrong there, like "'Twich' is not one of: All, Twitch, YouTube".

Deleted

Field Type What it is
deleted true/false true when it was deleted.
id text The id of what was deleted. Global variables have none.
name text The name of what was deleted.

Status

Field Type What it is
app object About Cuebot itself: name, version (like "0.1.0"), the .NET version, your system, this copy's id, and the API version (v1).
connections list of object One entry per platform or app, like Twitch or OBS: its name, its state (like Connected) and a status message.
servers list of object One entry per Cuebot server, like the overlay server: its kind, name, whether it is turned on and running, its port and a status message.
counts object How many you have of each thing: actions, enabledActions, timers, queues, commands, globals, triggerTypes and subActionTypes.
chat object Which platforms chat comes from (platforms), and which can send messages now (sendablePlatforms).

ActionSummary

Field Type What it is
id text The action's id, a long code. You can use it, or the name, in addresses.
name text The action's name, like "Thank followers".
group text The action's folder, like "Alerts". Empty means no group.
enabled true/false true if the action is on.
queue text The action queue it waits in. Empty means the Default queue.
triggers list of object Its triggers in short: each one's type (like twitch.follow) and whether it is on.
subActionCount whole number How many steps it has, counting the steps inside branches.

Action

Field Type What it is
id text The action's id, a long code like "3f2b9c1e-...". Leave it out for a new action and Cuebot makes one.
name text The action's name, like "Thank followers". It must not be empty.
group text A folder name to keep actions tidy, like "Alerts". Empty means no group.
enabled true/false true: the action is on. false: it is off and its triggers are ignored.
queue text The name of the action queue it waits in, from the Queues page. Empty means the Default queue.
concurrent true/false Only without a queue. false (default): runs of this action wait for each other. true: they can run at the same time.
randomAction true/false true: run only ONE of the top steps, picked at random (steps with a bigger weight are picked more often).
concurrentSubActions true/false true: start all top steps at the same time instead of one after another. Ignored when randomAction is true.
alwaysRun true/false true: the action still starts while its queue is paused.
excludeFromHistory true/false true: runs of this action are left out of the history and the pending list. Good for actions that run very often.
triggers list of Trigger What starts the action, like a follow or a chat command. Each one has a type and its settings. With no triggers it only runs when you or another action start it.
subActions list of SubAction The steps the action does, in order, like "send a chat message" then "wait 2 seconds". Steps can hold more steps in their branches.
layout NodeLayout Where this box sits on the flowchart view, as x and y. Only for looks; leave it out and Cuebot places it.

Trigger

Field Type What it is
id text The trigger's id, a long code. Leave it out and Cuebot makes one.
type text What kind of trigger it is, like "twitch.follow" or "command.triggered". GET /triggers lists them all.
enabled true/false true (default): the trigger works. false: it is ignored.
settings object The trigger's settings, each one as text, like {"command": "Hello"}. Numbers and true/false are written in quotes too. GET /triggers/{type} lists them.
alwaysRun true/false Run even when a narrower trigger of the same type also matches (ranges such as cheer amounts)
layout NodeLayout Where this box sits on the flowchart view, as x and y. Only for looks; leave it out and Cuebot places it.

NodeLayout

Field Type What it is
x number How far from the left of the flowchart, in pixels.
y number How far from the top of the flowchart, in pixels.

SubAction

Field Type What it is
id text The step's id, a long code. Leave it out and Cuebot makes one.
type text What the step does, like "chat.send" or "core.delay". GET /subactions lists them all.
enabled true/false true (default): the step runs. false: it is skipped.
parameters object The step's settings, each one as text, like {"milliseconds": "2000"}. They may use %variables% and ~globals~. GET /subactions/{type} lists them.
branches object Steps inside this step, by branch name: like {"True": [...], "False": [...]} for an If, or {"Steps": [...]} for a Group.
weight number How likely this step is to be picked when only one random step runs. Default 1; 2 is twice as likely; 0 means never.
layout NodeLayout Where this box sits on the flowchart view, as x and y. Only for looks; leave it out and Cuebot places it.

Parameter

Field Type What it is
key text The setting's name to use in settings or parameters, like "message".
label text The setting's name as the app shows it, like "Message".
kind one of text, multiline, number, boolean, choice, code What to put in: text, multiline (several lines), number, boolean ("true" or "false"), choice (one from choices) or code.
default text The value used when you leave the setting out.
choices list of text For a choice setting: the values you may use, like ["All", "Twitch"].
language text For a code setting: the language, like "csharp" or "python".
help text A short help text that says what to put in.
suggestions list of text Values that fit right now, like your OBS scene or command names (only for one type). You may still type others.

TriggerType

Field Type What it is
typeId text The id to put in a trigger's type, like "twitch.follow".
name text The trigger's name as the app shows it, like "Command triggered".
category text The group it is in, like "Twitch".
eventTypes list of text The Cuebot events it listens to. They are the same names GET /events sends.
parameters list of Parameter Its settings, one entry per setting.
settingsSchema object Only for one type: its settings as a JSON Schema, a standard way for tools to check the settings before you send them.

SubActionType

Field Type What it is
typeId text The id to put in a step's type, like "chat.send".
name text The step's name as the app shows it, like "Send chat message (any platform)".
category text The group it is in, like "Chat" or "OBS".
branches list of text The branch names its inner steps can go under, like True and False for an If.
dynamicBranches true/false true: the branch names depend on the step's settings (for example the cases of a Switch).
container true/false true: the step holds and runs other steps itself, like a Group or a loop.
parameters list of Parameter Its settings, one entry per setting.
parametersSchema object Only for one type: its settings as a JSON Schema, a standard way for tools to check the settings before you send them.

Command

Field Type What it is
id text The command's id, a long code. Leave it out for a new command and Cuebot makes one.
name text The command's name, like "Hello". Triggers find the command by this name. It must not be empty.
group text A folder name to keep commands tidy, like "Fun". Empty means no group.
enabled true/false true: the command works. false: chat typing it does nothing.
mode one of Basic, Regex Basic: the texts are typed as they are, like !hello. Regex: each text is a search pattern (for advanced users).
location one of Start, Exact, Anywhere Where in the message the command must be. Start: at the start, like "!so bob". Exact: the whole message. Anywhere: anywhere, as its own word.
commands list of text What viewers type, like ["!hello", "!hi"]. They share one cooldown and one counter. With none, the command never works.
sources list of text Where it listens, like ["Twitch", "YouTube"] or "Twitch:Whisper" for whispers. Empty means every platform.
caseSensitive true/false true: capital letters must match, so !Hello is not !hello. false (default): they do not matter.
globalCooldownSeconds number Seconds to wait before anyone can use it again, like 10. 0 means no wait.
userCooldownSeconds number Seconds one viewer must wait before using it again, like 30. 0 means no wait.
minimumRole one of Everyone, Subscriber, Vip, Moderator, Broadcaster Who may use it: Everyone, Subscriber, Vip, Moderator or Broadcaster (you). Higher roles can always use it too.
include true/false Listed by the "Get commands" sub-action
ignoreBotAccount true/false Ignore the bot account's own messages
ignoreInternal true/false Ignore messages sent from Cuebot's own chat window
allowedUsers list of text Viewer names or ids that may always use the command, even without the minimum role.
allowedGroups list of text Viewer groups whose members may always use the command, even without the minimum role.
deniedUsers list of text Viewer names or ids that may never use the command. You, the broadcaster, always can.
deniedGroups list of text Viewer groups whose members may never use the command.
persistCounter true/false Keep the use counter after a restart
persistUserCounter true/false Keep each viewer's use counter after a restart
linkedActions list of object The actions this command runs (each with id and name): those with a command.triggered trigger for it. Cuebot fills this in; it is ignored when you send it.

Timer

Field Type What it is
id text The timer's id, a long code. Leave it out for a new timer and Cuebot makes one.
name text The timer's name, like "Social links". core.timer triggers find the timer by this name. It must not be empty.
enabled true/false true: the timer runs. false: it is off.
intervalSeconds whole number How many seconds between two goes, like 1200 for 20 minutes. At least 1 when there is no cron and no random interval.
repeat true/false true (default): it goes off again and again. false: it goes off once, then waits until it is turned on again.
randomInterval true/false true: wait a random time between minIntervalSeconds and maxIntervalSeconds each time, instead of intervalSeconds.
minIntervalSeconds whole number With randomInterval: the shortest wait, in seconds, like 600. At least 1.
maxIntervalSeconds whole number With randomInterval: the longest wait, in seconds, like 1800. Not smaller than minIntervalSeconds.
minChatLines whole number Only go off if at least this many chat messages came in since last time, like 5. Else that turn is skipped. 0 means always.
cron text A clock schedule instead of a wait, in your local time, like "0 * * * " (every hour) or "/15 * * * *" (every 15 minutes). Empty: use the interval.
state object What the timer does right now (only while timers run): on or off, its interval, when it goes off next, and chat lines since last time. Cuebot fills this in; it is ignored when you send it.

GlobalVariable

Field Type What it is
name text The variable's name without the ~ signs, like "deaths".
value any What it holds now: text, a number, true/false, or null when empty.
type text What kind of value it is: text, integer (whole number), decimal, boolean (true/false) or empty.
persisted true/false true: saved and kept after a restart. false: temporary, gone when Cuebot closes.
lastWrite text When it last changed, as date and time, like "2026-11-01T20:15:00+01:00".

Run

Field Type What it is
runId text This run's own id, a long code.
actionId text The id of the action that ran.
actionName text The name of the action that ran.
queue text The action queue it waited in, like "Default".
source text What started it, like a trigger's name, "API" or "Manual".
state one of Pending, Running, Completed, Cancelled, Failed Where it is: Pending (waiting in its queue), Running, Completed, Cancelled or Failed.
queuedAt text When it was started and put in its queue, as date and time.
startedAt text When it really began. Empty while it still waits.
completedAt text When it ended. Empty while it still waits or runs.
durationMs whole number How long it ran, in milliseconds (1000 = 1 second), not counting the wait in its queue.
error text What went wrong, if it failed. Empty when all went well.
depth whole number 0 when a trigger, you or the API started it. 1 or more when another action or a code step started it.
args object Only with includeArgs: the %variables% it started with.
argsAfterRun object Only with includeArgs: the %variables% when it finished, with the ones its steps added.

RunResult

Field Type What it is
queued true/false true when Cuebot accepted the run.
completed true/false Only with wait: true when it finished in time. false when it still runs after timeoutSeconds.
success true/false Only when completed: true when the action went well, false when it failed.
action object Which action it was: its id and name.
run Run Only when completed: the run's details, like its state, duration, error and variables.
message text Only when it did not finish in time: tells you to look in GET /history later.

ImportPlan

Field Type What it is
source one of Cuebot, StreamerBot Where the import comes from: Cuebot (a Cuebot share text) or StreamerBot (a Streamer.bot export).
header object About the import: its name, author, description, version, when it was made and which program made it.
items list of object One entry per thing in the import: its kind, name, whether it clashes with one you have, what will happen, and things to check.
warnings list of text Things to check after the import, like steps that point to something you do not have.
mapped list of text For Streamer.bot imports: what was turned into what, like "Send Message → twitch.sendMessage".
placeholders whole number How many Streamer.bot steps Cuebot could not turn into its own. They come in as turned-off stand-in steps for you to redo.
containsCode true/false true when the import has C# or Python code steps. Read code before you run it.