Official uStreamers Bot

@uStreamersBOT Documentation

Everything you need to activate, customize, and run your automated bot across Twitch and Kick without installing anything.

1. What is @uStreamersBOT

@uStreamersBOT is our official cloud-based chat assistant for Twitch and Kick creators. It runs entirely on our high-availability servers: you do not need to download software, leave browser windows open, or waste computing resources on your streaming PC.

What does the bot do today?

  • Announces approved voice alerts: whenever you approve a viewer audio clip on your mobile app or OBS dashboard, the bot instantly posts an announcement in Twitch and Kick showing who sent the audio and how long it lasts.
  • Responds to built-in commands: answers essential viewer queries including !followage, !uptime, !game, !title, !accountage, and !commands.
  • Executes custom commands: create custom chat triggers (like !discord, !socials, or !specs) with user-level access controls, aliases, cooldowns, and real-time variables.
  • Tracks atomic counters: manage death counters, win streaks, or community tally marks directly from chat or the mobile app without concurrency race conditions.
  • Posts automated timers: dispatch periodic rotating announcements only when your channel is live and your chat meets your minimum activity threshold.
  • Full in-chat moderator management: channel moderators can add, update, and remove commands or modify counters straight from chat.
  • One-click migration: effortlessly import your existing configuration from Nightbot, StreamElements, Botrix, or CSV/JSON backup files with automatic syntax translation.
  • Chat AI (uStreamers Plus+, optional): if you turn it on from Studio, it answers with artificial intelligence the questions your community types with the command you choose (!ia by default), always marked with 🤖.
  • AI drawings (uStreamers Plus+ or MAX, optional): if you turn on the command (!dibujo by default), it replies in chat to every drawing request: whether it's on its way, whether it goes through your moderators first, or why it can't be done. See AI drawings and characters.
  • Announces plan gifts: if someone gifts Plus+ or MAX to a viewer from their card in your channel's chat, the bot announces it. Turn it off with "Announce plan gifts" in its settings.

2. How to activate the bot (Step by step)

Setup takes less than two minutes right inside the official uStreamers mobile app.

  1. 1

    Enable the bot toggle in the app

    Open the uStreamers app logged in with your streamer account. Go to your streamer profile and open the bot screen (chip icon or Official Profile). In the Tools for streamers section, turn on the master switch labeled exactly: «Enable @uStreamersBOT on my channel».

  2. 2

    Connect your platforms (Twitch and Kick)

    Ensure your broadcast accounts are linked in your streamer profile. If both are connected, the bot will participate in Twitch and Kick chats simultaneously.

    Twitch permission: the app requests the channel:bot permission so @uStreamersBOT can enter your chat and post messages. Without this permission, the bot cannot speak.

    Permission for !followage: Twitch requires the moderator:read:followers scope to query follow durations. If you connected Twitch before this feature arrived, the bot will notify you in chat: «The channel needs to reconnect Twitch on uStreamers to use !followage.» In that case, simply tap "Connect Twitch" in your profile again to refresh authorization.

  3. 3

    Grant moderator status to the bot (Highly recommended)

    To ensure bot messages are never delayed or dropped by follower-only or slow mode chat settings, grant moderator privileges in your channels:

    • On Twitch: type /mod ustreamersbot in your chat
    • On Kick: type /mod uStreamersBOT in your chat

    Why is this important? On Twitch, non-moderated bot accounts face a strict rate limit of 20 messages per 30 seconds. With moderator status, the bot delivers instant replies with zero latency.

3. What the bot reads and stores (Privacy & Transparency)

We built @uStreamersBOT following strict privacy-by-design standards:

  • Only messages starting with ! are processed: regular conversations are dropped immediately in memory. The bot never analyzes or stores casual viewer messages.
  • Chat activity counter stores no content: to evaluate if a timer should trigger based on chat activity, the system increments a simple integer counter in volatile memory (1 per message). Message bodies, timestamps, and usernames are never stored. Once the timer fires, the count resets to zero.
  • No actions from shared streams (Stream Together / Shared Chat): if your channel participates in a shared chat session with another channel, messages originating from external channels are ignored. Moderator badges from guest channels carry no authority on your bot.
  • Loop prevention and ignoring other bots: the bot automatically ignores messages from known chatbot accounts (Nightbot, StreamElements, Botrix, etc.) and from its own account to prevent infinite loops.
  • Kick follower records: Kick's official API does not provide a public endpoint to retrieve historical follower dates. When a user follows your Kick channel, uStreamers receives a secure webhook and stores the Kick User ID, username, and timestamp in an internal table. This record exists exclusively to power the !followage command accurately on Kick.
  • Chat AI (only if you turn it on, with uStreamers Plus+): together with the drawings command, it is the only command whose text leaves uStreamers for an external provider. When someone types the AI command (!ia by default), their question and display name are sent to OpenAI to generate and moderate the answer and, if recent information is needed, a short keyword query, without the asker's name, is sent to Brave or Perplexity. We do not store questions or answers, and every answer is marked with 🤖. Details in section 17 of the Privacy Policy.
  • AI drawings (only if you turn them on, with uStreamers Plus+ or MAX): when someone types the drawings command (!dibujo by default), the request text is sent to OpenAI, without the requester's name, to check it and generate the image. The request is deleted when the drawing is done. Speech bubbles on the character stage don't go through the bot: the OBS source shows them on the spot and they aren't stored. Details in section 23 of the Privacy Policy.

4. Built-in commands

The bot includes standard channel commands enabled by default. Each command has a default cooldown of 5 seconds globally and 30 seconds per user to prevent spam. Channel broadcasters and moderators bypass cooldowns.

Command Description Chat output example Twitch Kick Cooldown
!followage
optional: @user
Shows how long a user has followed the current channel. Twitch: @martin has been following lucas_stream for 1 year, 2 months and 3 days (since 07/15/2025).
Kick (with record): @martin has been following lucas_stream since at least 07/15/2025.
Kick (no record): Kick does not yet allow checking how long someone has been following. If you follow the channel now, uStreamers will remember it. 💚
Full Local record 5s global
30s user
!uptime Shows how long the channel has been live on that platform. Live: lucas_stream is live for 2 h 15 min.
Offline: lucas_stream is not live right now.
Yes Yes 5s global
30s user
!game Displays the category or game currently configured on stream. Set: Current game: Just Chatting
Not set: No category set.
Yes Yes 5s global
30s user
!title Displays the current broadcast title. Set: Current title: Community chat and bot testing
Not set: No title set.
Yes Yes 5s global
30s user
!accountage
optional: @user
Shows how long the user account has existed. Twitch: The account @martin is 3 years and 4 months old.
Kick: Kick does not allow checking account age.
Yes Unavailable 5s global
30s user
!commands Lists public custom commands available to all viewers. With commands: Commands: !discord !socials !specs and 3 more
Empty: No custom commands available.
Yes Yes 5s global
30s user
How to toggle built-in commands: In the uStreamers app under the bot screen, navigate to the Built-in commands section. You will find a toggle switch for each command so you can disable any command you prefer not to use.

5. Custom commands from the app

Create custom automated responses via the mobile app (screen Custom commands → button New command).

Editor configuration fields

  • Command name: between 1 and 32 lowercase characters. Supports letters (a-z), numbers (0-9), underscores (_), and accented letters. Do not type the ! prefix.
  • Response: message sent by the bot (up to 500 characters). Supports plain text and dynamic bracketed variables (e.g. {user}).
  • Aliases (optional): up to 5 alternative keywords pointing to the same response (e.g. dc for !discord).
  • Required permission: restricts who can trigger the command:
    • Everyone: any viewer in chat.
    • Subscribers: subscribers and founders (plus VIPs, mods, and broadcaster).
    • VIPs: viewers with VIP status (plus mods and broadcaster).
    • Moderators: channel moderators and broadcaster.
    • Streamer only (Broadcaster): exclusively the channel owner.
  • Global cooldown: minimum seconds between uses by any viewer (0 to 3,600s; default: 5 seconds).
  • User cooldown: cooldown per specific viewer (0 to 3,600s; default: 15 seconds).
  • Platforms: choose whether the command runs on Twitch, Kick, or Both.
  • Only when live: if enabled, the bot remains silent when the stream is offline.
  • Enabled: master toggle to pause or reactivate a command without deleting it.
Reserved system names: The following names cannot be used as a custom command name or alias to protect platform moderation and built-in features:
so, shoutout, addcom, editcom, delcom, commands, counter, followage, uptime, game, title, accountage, raid, unraid, ban, timeout, unban, untimeout, clear, slow, slowoff, followers, followersoff, subscribers, subscribersoff, emoteonly, emoteonlyoff, uniquechat, uniquechatoff, announce, commercial, marker, mod, unmod, vip, unvip.

If an attempt is made to claim these names, the bot responds in chat: «!{name} is already a uStreamers command. Choose another name.»
@regular_viewer: !discord
BOT @uStreamersBOT: Join our community on Discord! discord.gg/example

6. Dynamic variables

Bring your command responses to life with real-time variables placed inside brackets {variable}:

Variable Replaced content Template written → Chat rendered output
{user} Username of the person who typed the command. Hello {user}! → Hello @lucas!
{touser} Username mentioned as the first argument, or {user} if none was given. Hug for {touser}! (with !hug @maria) → Hug for maria!
{1} to {9} Positional command arguments (up to 50 characters each). Score for {1}: {2} (with !score martin 100) → Score for martin: 100
{args} All text entered after the command name. You asked: {args} (with !ask when live) → You asked: when live
{channel} Channel name where the command is being executed. Welcome to {channel}! → Welcome to lucas_stream!
{platform} Current platform name (Twitch or Kick). You are watching on {platform} → You are watching on Twitch
{random:MIN-MAX} Random integer between MIN and MAX. Supports negative numbers (max range: 1,000,000). You rolled a d6: {random:1-6} → You rolled a d6: 5
{pick:opt1|opt2|...} Picks a random item from a pipe-separated list (up to 20 options). Dinner pick: {pick:Pizza|Burgers|Sushi} → Dinner pick: Sushi
{time:ZONE} Current local time in HH:mm format for an IANA timezone identifier. Local time in London: {time:Europe/London} → Local time in London: 18:30
{count} Execution counter for this specific command (increments automatically by 1). Command triggered {count} times → Command triggered 42 times
{count:name} Increments by 1 and prints the custom counter name. If the counter does not exist, it is created automatically initialized at 1. Lucas fell! Total falls: {count:falls} → Lucas fell! Total falls: 15
{getcount:name} Reads the current value of counter name without modifying it (returns 0 if not found). Accumulated falls: {getcount:falls} → Accumulated falls: 15
{uptime} Current stream duration text. Live time: {uptime} → Live time: lucas_stream is live for 2 h 15 min.
{game} Current broadcast game or category. Playing {game} → Playing Current game: Valorant
{title} Current broadcast stream title. Title: {title} → Title: Current title: Road to Radiant
{followage} Follow duration text of the viewer triggering the command. Your follow: {followage} → Your follow: @lucas has been following...
Variable constraints and unknown variables:
  • Expensive variables: variables that require external database or API lookups ({count}, {count:name}, {getcount:name}, {uptime}, {game}, {title}, {followage}) have a maximum cap of 10 per response.
  • Unknown variables: if you type an unrecognized variable or exceed the 10 expensive variables limit, the bot preserves the bracketed text literally in chat (e.g. {unknown_var}).

7. Chat management (Moderators & Broadcaster)

Channel moderators and the broadcaster can create, edit, and delete commands or adjust counters directly inside the live chat.

Command syntax reference

  • Create new command:
    !addcom <name> [-cd=seconds] [-ul=level] [-a=alias1,alias2] <response>
    Simple example: !addcom discord Join our community at discord.gg/example
    Advanced example: !addcom giveaway -cd=30 -ul=sub -a=prize Sub giveaway active!
  • Edit existing command:
    !editcom <name> [-cd=seconds] [-ul=level] [-a=alias1,alias2] <response>
    Example: !editcom discord New link: discord.gg/newlink
  • Delete command:
    !delcom <name>
    Example: !delcom giveaway
  • Nightbot command aliases:
    !commands add <name> ..., !commands edit <name> ..., and !commands delete <name> (or !commands del) are also fully supported.
  • Counter management:
    !counter <name> → Reads current counter value.
    !counter <name> +N or -N (or + / -) → Adds or subtracts.
    !counter <name> set <N> → Sets counter to a fixed number.
Inline Flag Accepted Values Description
-cd=N 0 to 86,400 seconds Sets global command cooldown in seconds.
-ul=LEVEL everyone, sub (or subscriber), vip, mod (or moderator), broadcaster (or owner) Defines minimum user level required.
-a=ALIASES Comma-separated names (up to 5) Assigns alternative aliases (e.g.: -a=dc,server).
MOD @moderator: !addcom twitter Follow me at x.com/mychannel
BOT @uStreamersBOT: ✅ !twitter created.
MOD @moderator: !counter deaths +1
BOT @uStreamersBOT: Counter 'deaths': 15 (+1)
Permissions: Only channel moderators and the broadcaster can use management commands. Regular viewers are silently ignored.
How to turn off chat management: If you prefer to manage commands exclusively through the mobile app, toggle off «Chat management (!addcom, !editcom, !delcom)» in your app settings.

8. Counters

Counters are persistent integer values that track stats live during your broadcast: souls-like deaths, battle royale victories, coffees drank, or inside jokes.

How counters work

  • From the mobile app: navigate to Counters to inspect your counter list, create new entries with custom initial values, update numbers, or delete them.
  • From live chat: moderators can adjust counts with !counter <name> +1 or reset them with !counter <name> set 0.
  • Inside custom commands: use {count:name} to increment and display the count in one step, or {getcount:name} to read the number without adding to it.
  • Automatic creation: referencing {count:newcounter} in a command automatically registers the counter initialized at 1 if it did not exist previously.
  • Safety and limits: each channel can create up to 100 custom counters. Increments are performed atomically in the database, preventing race conditions if multiple viewers trigger commands at the same time.

9. Automated timers

Timers publish automated announcements in your chat at set intervals to remind viewers of your Discord, social links, sponsor codes, or stream rules.

Trigger conditions

To avoid cluttering an inactive chat or posting when your stream is offline, the background worker evaluates timers every 30 seconds and only triggers when all three conditions are met simultaneously:

  1. Channel is live: your broadcast must be actively live on that specific platform.
  2. Interval elapsed: the configured Interval (5 to 240 minutes) must have passed since the timer last fired (or since the stream started if it hasn't fired yet).
  3. Minimum chat activity: chat must have received at least the number of messages specified in Minimum chat lines (0 to 500 lines) from real viewers (bots excluded) since the last message was posted.

What happens with 0 minimum lines? If you configure 0 lines, the timer will dispatch strictly based on elapsed time without requiring chat activity.

Rotating messages and behavior

  • 1 to 5 rotating messages: each timer can store up to 5 different message templates. The bot sends them in round-robin order, alternating one message on each trigger.
  • Collision prevention: if two timers become eligible at the exact same moment on your channel, the bot sends one and waits 30 seconds before sending the second, ensuring messages never crowd your chat.
  • Timer variables: viewer-specific variables (like {user} or {touser}) evaluate empty inside timers. Channel variables such as {channel}, {uptime}, {game}, {title}, {time:...}, {random:...}, {pick:...}, and counters {getcount:...} work seamlessly.
  • Capacity: each channel can configure up to 20 automated timers.

10. Import from another bot

Already have commands, counters, or timers set up in Nightbot, StreamElements, or Botrix? You don't need to rebuild them from scratch.

Available import sources

  • Nightbot (Official OAuth2 Connection):
    Connect your Nightbot account securely. uStreamers only requests read-only scopes for commands and timers. The temporary access token is used once in memory to pull your list and immediately discarded; it is never stored in a database or recorded in logs. If Nightbot is not configured on the server, it will display a "Coming soon" badge.
  • StreamElements (JWT Token):
    Paste your StreamElements personal JWT token. You can find it in your StreamElements dashboard → Account Settings → Channel → Show secrets / JWT Token.
    Security note: uStreamers never saves or logs your JWT token. It is used strictly in volatile memory during the request. We recommend regenerating your token in StreamElements after the import completes.
  • Botrix / Text / File Import:
    Paste command lists in 4 accepted formats:
    !name response
    !name - response
    !name: response
    !name<TAB>response
    You can also upload or paste a CSV file (up to 1,000 rows and 1 MB) with headers name,response,userlevel,globalcooldown,usercooldown,aliases,platforms,onlywhenlive, or an official uStreamers backup JSON file (format: "ustreamers-bot", version: 1).

Preview and conflict resolution

Before applying any changes, the app displays a clear preview screen indicating the status of each item:

  • Ready: 100% compatible and ready to import.
  • Ready with warnings: compatible with minor adjustments (e.g. truncated long response, clamped timer interval to 5–240m, or converted Nightbot "Regular" level to VIP).
  • Already exists (Conflict): name conflicts with an existing command, alias, counter, or timer. You can choose:
    • Skip: keeps your current command and ignores the imported item.
    • Overwrite: updates your existing command with imported settings.
    • Rename: appends a numeric suffix (e.g. !socials_2).
  • Unsupported: the item cannot be imported and is omitted.

What is omitted and why?

  • External requests: variables like $(urlfetch), $(customapi), $(eval), or StreamElements equivalents are rejected for security reasons (protection against SSRF attacks and remote execution).
  • StreamElements keywords / regex: in uStreamers, commands always start with !name.
  • StreamElements whispers: imported commands are converted to standard public chat responses.
  • Offline-only timers: discarded because uStreamers only runs timers while live.

Preview session and limits: preview sessions expire after 30 minutes and can only be committed once. Streamers can submit up to 10 import requests per hour.

Variable translation matrix

This table lists the exact variable translations implemented by the import engine:

Source Variable (Nightbot / StreamElements / Botrix) uStreamers Equivalent Behavior
$(user) / ${user} / ${user.name} / ${sender} {user} Username who typed the command.
$(touser) / ${touser} {touser} Target user mentioned in arguments.
$(query) / ${1:} / {args} {args} All arguments after the command.
$(1) to $(9) / ${1} to ${9} {1} to {9} Positional command arguments.
$(count) / ${count} {count} Command use counter.
${count name} {count:name} Increments and prints named counter.
${getcount name} {getcount:name} Reads named counter without incrementing.
$(channel) / ${channel} {channel} Current broadcast channel name.
$(uptime) / ${uptime} {uptime} Stream live duration text.
$(followage) / ${user.followage} {followage} Follow duration of the caller.
$(twitch $(channel) "{{game}}") / ${game} {game} Stream game or category.
$(twitch $(channel) "{{title}}") / ${title} {title} Stream broadcast title.
$(randomnum A B) / ${random.A-B} {random:A-B} Random number generator.
${random.pick 'opt1' 'opt2'} {pick:opt1|opt2} Random selection from options.
$(time Zone) / ${time.Zone} {time:Zone} Local time in specified IANA timezone.
$(urlfetch ...), $(customapi ...), $(eval ...), ${urlfetch ...} Blocked Preventively stripped for security (Invariant I9).

11. Twitch vs. Kick

@uStreamersBOT unifies your moderation across platforms while respecting the technical boundaries of each official API:

Feature On Twitch On Kick
!followage command Exact duration in years, months, and days via Helix API (requires moderator:read:followers scope). Shows «since at least MM/DD/YYYY» if recorded by webhook; provides an informative notice if no record exists.
!accountage command Available. Displays account creation age via official API. Unavailable. Kick does not provide account creation dates; the bot responds: «Kick does not allow checking account age.»
!uptime, !game, !title, !commands 100% supported. 100% supported.
Custom commands & variables 100% supported. 100% supported.
Counters & automated timers 100% supported. 100% supported.
Moderator slash command /mod ustreamersbot /mod uStreamersBOT
Required permissions channel:bot and moderator:read:followers Link your Kick account in your profile
Bot rate limits 1 message per second per channel 1 message per second per channel

12. System limits

Real limits enforced across @uStreamersBOT:

Setting Limit
Max custom commands per channel Up to 200 commands
Max aliases per command Up to 5 aliases
Command name length 1 to 32 characters (lowercase letters, numbers, underscores)
Max response length 500 characters (longer text is safely truncated with ellipsis)
Cooldown range (global & user) 0 to 3,600 seconds (1 hour)
Default custom command cooldowns Global: 5 seconds · User: 15 seconds
Default built-in command cooldowns Global: 5 seconds · User: 30 seconds
Max custom counters per channel Up to 100 counters
Max automated timers per channel Up to 20 timers
Rotating messages per timer 1 to 5 messages
Timer message length 1 to 500 characters
Timer interval range 5 to 240 minutes (default: 15 minutes)
Minimum chat lines required for timers 0 to 500 lines (default: 5 lines)
Timer worker evaluation tick Every 30 seconds (max 1 timer per tick per channel)
Max expensive variables per response Up to 10 variables
Max range for {random:MIN-MAX} 1,000,000 difference between MIN and MAX
Max options in {pick:...} Up to 20 options
Max import file size 1 MB (1,048,576 bytes)
Max rows in CSV import 1,000 rows
Preview session expiration 30 minutes
Import rate limit per streamer 10 requests per hour

13. Troubleshooting

Quick answers to common setup and behavior questions:

Why isn't the bot responding in my chat?

Check these four common causes:

  1. Verify in the mobile app that the main switch «Enable @uStreamersBOT on my channel» is turned on.
  2. Ensure your Twitch or Kick accounts are connected in your streamer profile.
  3. Make sure you granted moderator status to the bot (/mod ustreamersbot on Twitch, /mod uStreamersBOT on Kick), especially if your chat has slow mode or follower-only chat enabled.
  4. If testing a custom command, check that it is enabled, configured for the active platform, and not set to "Only when live" while offline.
Why does it respond on Twitch but not on Kick (or vice versa)?

Verify in your profile that both accounts are linked. If dealing with a custom command, open it in the editor and ensure the Platforms setting includes "Both" (or the platform where it isn't responding).

Why does !followage tell me to reconnect Twitch?

Twitch requires the moderator:read:followers scope for the bot to look up follow dates. If you connected Twitch prior to this update, open your profile in the app and tap "Connect Twitch" again to grant the updated permission.

Why isn't my timer posting in chat?

Timers require the stream to be actively live, the interval minutes to have passed, and the chat to reach the minimum chat lines threshold. If chat was quiet, the timer waits until viewers speak to avoid spamming an empty room. To post purely on time regardless of messages, set minimum lines to 0.

Why won't the app let me save a specific command name?

Names must be 1 to 32 lowercase alphanumeric characters and cannot match reserved system commands (like so, raid, ban, commands, addcom, etc.) or existing aliases on your channel.

Why does the app say my import preview expired?

Import previews are held in memory for 30 minutes for security and performance. If you didn't commit within that time, simply restart the import from the app.

Why didn't a certain command import from Nightbot or StreamElements?

For security, commands relying on external URL fetches ($(urlfetch), $(customapi)) or arbitrary code execution ($(eval)) are automatically omitted. StreamElements regex/keywords and offline-only timers are also not supported.

14. Support

Have questions or ran into an unexpected issue with the bot?

We're here to help

Our support team reviews inquiries daily. Reach out directly via email and we'll gladly assist you with your channel setup.

soporte@ustreamers.app