@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 (
!iaby default), always marked with 🤖. - AI drawings (uStreamers Plus+ or MAX, optional): if you turn on the command (
!dibujoby 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
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
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:botpermission so @uStreamersBOT can enter your chat and post messages. Without this permission, the bot cannot speak.Permission for !followage: Twitch requires the
moderator:read:followersscope 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
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 ustreamersbotin your chat - On Kick: type
/mod uStreamersBOTin 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.
- On Twitch: type
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
!followagecommand 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 (
!iaby 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 (
!dibujoby 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 |
|---|---|---|---|---|---|
!followageoptional: @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 ChattingNot set: No category set.
|
Yes | Yes | 5s global 30s user |
!title |
Displays the current broadcast title. |
Set: Current title: Community chat and bot testingNot set: No title set.
|
Yes | Yes | 5s global 30s user |
!accountageoptional: @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 moreEmpty: No custom commands available.
|
Yes | Yes | 5s global 30s user |
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.
dcfor!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.
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.»
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... |
- 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> +Nor-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). |
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> +1or 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:
- Channel is live: your broadcast must be actively live on that specific platform.
- 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). - 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 headersname,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:
- Verify in the mobile app that the main switch «Enable @uStreamersBOT on my channel» is turned on.
- Ensure your Twitch or Kick accounts are connected in your streamer profile.
- Make sure you granted moderator status to the bot (
/mod ustreamersboton Twitch,/mod uStreamersBOTon Kick), especially if your chat has slow mode or follower-only chat enabled. - 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