Connect OpenClaw to Twitch: Setup Guide
Ever tried to get an AI bot into your Twitch chat only to realize that managing OAuth tokens and preventing random users from spamming your API is a total headache? You just want the bot to show up, listen to commands, and talk back without a complex setup.
OpenClaw handles this through a dedicated plugin that connects via IRC. It’s straightforward to set up, but you’ll want to pay attention to the access control settings so you don’t end up with unexpected bills or a chaotic chat.
Plugin required
Section titled “Plugin required”Twitch ships as a plugin and is not bundled with the core install.
Install via CLI (npm registry):
openclaw plugins install @openclaw/twitchLocal checkout (when running from a git repo):
openclaw plugins install ./path/to/local/twitch-pluginDetails: Plugins
Quick setup (beginner)
Section titled “Quick setup (beginner)”- Create a dedicated Twitch account for the bot (or use an existing account).
- Generate credentials: Twitch Token Generator
- Select Bot Token
- Verify scopes
chat:readandchat:writeare selected - Copy the Client ID and Access Token
- Find your Twitch user ID: https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/
- Configure the token:
- Env:
OPENCLAW_TWITCH_ACCESS_TOKEN=...(default account only) - Or config:
channels.twitch.accessToken - If both are set, config takes precedence (env fallback is default-account only).
- Env:
- Start the gateway.
⚠️ Important: Add access control (allowFrom or allowedRoles) to prevent unauthorized users from triggering the bot. requireMention defaults to true.
Minimal config:
{ channels: { twitch: { enabled: true, username: "openclaw", // Bot's Twitch account accessToken: "oauth:abc123...", // OAuth Access Token (or use OPENCLAW_TWITCH_ACCESS_TOKEN env var) clientId: "xyz789...", // Client ID from Token Generator channel: "vevisk", // Which Twitch channel's chat to join (required) allowFrom: ["123456789"], // (recommended) Your Twitch user ID only - get it from https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ }, },}What it is
Section titled “What it is”- A Twitch channel owned by the Gateway.
- Deterministic routing: replies always go back to Twitch.
- Each account maps to an isolated session key
agent:<agentId>:twitch:<accountName>. usernameis the bot’s account (who authenticates),channelis which chat room to join.
Setup (detailed)
Section titled “Setup (detailed)”Generate credentials
Section titled “Generate credentials”- Select Bot Token
- Verify scopes
chat:readandchat:writeare selected - Copy the Client ID and Access Token
No manual app registration needed. Tokens expire after several hours.
Configure the bot
Section titled “Configure the bot”Env var (default account only):
OPENCLAW_TWITCH_ACCESS_TOKEN=oauth:abc123...Or config:
{ channels: { twitch: { enabled: true, username: "openclaw", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "vevisk", }, },}If both env and config are set, config takes precedence.
Access control (recommended)
Section titled “Access control (recommended)”{ channels: { twitch: { allowFrom: ["123456789"], // (recommended) Your Twitch user ID only }, },}Prefer allowFrom for a hard allowlist. Use allowedRoles instead if you want role-based access.
Available roles: "moderator", "owner", "vip", "subscriber", "all".
Why user IDs? Usernames can change, allowing impersonation. User IDs are permanent.
Find your Twitch user ID: https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ (Convert your Twitch username to ID)
Token refresh (optional)
Section titled “Token refresh (optional)”Tokens from Twitch Token Generator cannot be automatically refreshed - regenerate when expired.
For automatic token refresh, create your own Twitch application at Twitch Developer Console and add to config:
{ channels: { twitch: { clientSecret: "your_client_secret", refreshToken: "your_refresh_token", }, },}The bot automatically refreshes tokens before expiration and logs refresh events.
Multi-account support
Section titled “Multi-account support”Use channels.twitch.accounts with per-account tokens. See gateway/configuration for the shared pattern.
Example (one bot account in two channels):
{ channels: { twitch: { accounts: { channel1: { username: "openclaw", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "vevisk", }, channel2: { username: "openclaw", accessToken: "oauth:def456...", clientId: "uvw012...", channel: "secondchannel", }, }, }, },}Note: Each account needs its own token (one token per channel).
Access control
Section titled “Access control”Role-based restrictions
Section titled “Role-based restrictions”{ channels: { twitch: { accounts: { default: { allowedRoles: ["moderator", "vip"], }, }, }, },}Allowlist by User ID (most secure)
Section titled “Allowlist by User ID (most secure)”{ channels: { twitch: { accounts: { default: { allowFrom: ["123456789", "987654321"], }, }, }, },}Role-based access (alternative)
Section titled “Role-based access (alternative)”allowFrom is a hard allowlist. When set, only those user IDs are allowed.
If you want role-based access, leave allowFrom unset and configure allowedRoles instead:
{ channels: { twitch: { accounts: { default: { allowedRoles: ["moderator"], }, }, }, },}Disable @mention requirement
Section titled “Disable @mention requirement”By default, requireMention is true. To disable and respond to all messages:
{ channels: { twitch: { accounts: { default: { requireMention: false, }, }, }, },}Troubleshooting
Section titled “Troubleshooting”First, run diagnostic commands:
openclaw doctoropenclaw channels status --probeBot does not respond to messages
Section titled “Bot does not respond to messages”Check access control: Ensure your user ID is in allowFrom, or temporarily remove
allowFrom and set allowedRoles: ["all"] to test.
Check the bot is in the channel: The bot must join the channel specified in channel.
Token issues
Section titled “Token issues”“Failed to connect” or authentication errors:
- Verify
accessTokenis the OAuth access token value (typically starts withoauth:prefix) - Check token has
chat:readandchat:writescopes - If using token refresh, verify
clientSecretandrefreshTokenare set
Token refresh not working
Section titled “Token refresh not working”Check logs for refresh events:
Using env token source for mybotAccess token refreshed for user 123456 (expires in 14400s)If you see “token refresh disabled (no refresh token)”:
- Ensure
clientSecretis provided - Ensure
refreshTokenis provided
Config
Section titled “Config”Account config:
username- Bot usernameaccessToken- OAuth access token withchat:readandchat:writeclientId- Twitch Client ID (from Token Generator or your app)channel- Channel to join (required)enabled- Enable this account (default:true)clientSecret- Optional: For automatic token refreshrefreshToken- Optional: For automatic token refreshexpiresIn- Token expiry in secondsobtainmentTimestamp- Token obtained timestampallowFrom- User ID allowlistallowedRoles- Role-based access control ("moderator" | "owner" | "vip" | "subscriber" | "all")requireMention- Require @mention (default:true)
Provider options:
channels.twitch.enabled- Enable/disable channel startupchannels.twitch.username- Bot username (simplified single-account config)channels.twitch.accessToken- OAuth access token (simplified single-account config)channels.twitch.clientId- Twitch Client ID (simplified single-account config)channels.twitch.channel- Channel to join (simplified single-account config)channels.twitch.accounts.<accountName>- Multi-account config (all account fields above)
Full example:
{ channels: { twitch: { enabled: true, username: "openclaw", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "vevisk", clientSecret: "secret123...", refreshToken: "refresh456...", allowFrom: ["123456789"], allowedRoles: ["moderator", "vip"], accounts: { default: { username: "mybot", accessToken: "oauth:abc123...", clientId: "xyz789...", channel: "your_channel", enabled: true, clientSecret: "secret123...", refreshToken: "refresh456...", expiresIn: 14400, obtainmentTimestamp: 1706092800000, allowFrom: ["123456789", "987654321"], allowedRoles: ["moderator"], }, }, }, },}Tool actions
Section titled “Tool actions”The agent can call twitch with action:
send- Send a message to a channel
Example:
{ action: "twitch", params: { message: "Hello Twitch!", to: "#mychannel", },}Safety & ops
Section titled “Safety & ops”- Treat tokens like passwords - Never commit tokens to git
- Use automatic token refresh for long-running bots
- Use user ID allowlists instead of usernames for access control
- Monitor logs for token refresh events and connection status
- Scope tokens minimally - Only request
chat:readandchat:write - If stuck: Restart the gateway after confirming no other process owns the session
Limits
Section titled “Limits”- 500 characters per message (auto-chunked at word boundaries)
- Markdown is stripped before chunking
- No rate limiting (uses Twitch’s built-in rate limits)
Related
Section titled “Related”- Channels Overview — all supported channels
- Pairing — DM authentication and pairing flow
- Groups — group chat behavior and mention gating
- Channel Routing — session routing for messages
- Security — access model and hardening
Next steps
Section titled “Next steps”Ready to get your bot live? If you run into any snags with the OAuth flow or permissions, check out the assistant below.
OpenClaw Expert
Still stuck?
If this page didn't answer your case, ask OpenClaw Expert for step-by-step guidance.