Skip to main content

Channels

Channels are messaging platforms wired into your agent. Connect Telegram, and people can DM your bot. Connect Discord, and it joins your server. Connect WhatsApp, and it shows up on someone’s phone. One instance can have multiple channels running simultaneously. Your agent on Telegram, Discord, and Slack — all at once, all from the same instance.

How channels work

The flow is straightforward:
1

You call the connect endpoint

curl -X POST https://api.chowder.dev/v1/instances/{id}/channels/telegram/connect \
  -H "Authorization: Bearer $CHOWDER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"config": {"token": "123456:ABC-DEF..."}}'
2

Chowder writes the config

Your credentials are written into the OpenClaw configuration file inside the sandbox. The channel is marked as enabled with a default DM policy.
3

Gateway restarts

The gateway process restarts to pick up the new channel config. This takes a few seconds.
4

Channel is live

Your agent is now reachable on that platform. People can message it and get responses.

Two types of channels

Most channels are token-based. You create a bot on the platform, get a token (or set of tokens), and pass them to Chowder. That’s it.Token-based channels: Telegram, Discord, Slack, Google Chat, Signal, Matrix, Microsoft Teams, Mattermost, Nostr, LINE
# Example: Discord
curl -X POST https://api.chowder.dev/v1/instances/{id}/channels/discord/connect \
  -H "Authorization: Bearer $CHOWDER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"config": {"token": "your-discord-bot-token"}}'

Supported channels

Here’s the full list, with what you need for each one:
ChannelTypeRequired fields
TelegramTokentoken — bot token from BotFather
DiscordTokentoken — Discord bot token
SlackTokenbot_token (xoxb-…), app_token (xapp-…)
WhatsAppInteractiveNone — scan the QR code
Google ChatTokenaudience_type, audience
SignalTokenaccount — phone number in E.164 format
MatrixTokenhomeserver, user_id, access_token
MS TeamsTokenapp_id, app_password, tenant_id
MattermostTokenbot_token, base_url
NostrTokenNone — uses auto-generated keys
LINETokenchannel_access_token, channel_secret

DM policy and pairing

By default, channels use a pairing DM policy. This means unknown users who message your bot get a pairing code, and you have to approve them before they can chat. This is a security feature — it prevents random people from using your agent (and burning your API credits).
# Approve a pairing code
curl -X POST https://api.chowder.dev/v1/instances/{id}/channels/telegram/pair \
  -H "Authorization: Bearer $CHOWDER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code": "ABC123"}'
The pairing code is shown to the user when they first message the bot. They send it to you (or your admin panel), you approve it, and they’re in.

Managing channels

# List all channels and their status
curl https://api.chowder.dev/v1/instances/{id}/channels \
  -H "Authorization: Bearer $CHOWDER_KEY"

# Check a specific channel
curl https://api.chowder.dev/v1/instances/{id}/channels/telegram/status \
  -H "Authorization: Bearer $CHOWDER_KEY"

# Disconnect a channel
curl -X POST https://api.chowder.dev/v1/instances/{id}/channels/telegram/disconnect \
  -H "Authorization: Bearer $CHOWDER_KEY"
Disconnecting disables the channel in the config and restarts the gateway. The bot goes offline on that platform but your credentials are preserved (just marked as disabled).
No. Each channel type can only be connected once per instance. If you need two Telegram bots, create two instances.
Channels go offline when the instance stops (the gateway shuts down). When you start it again, channels reconnect automatically — assuming your tokens haven’t been revoked on the platform side.
Yes. You can pass additional config when connecting a channel, or update the instance’s OpenClaw config directly via PATCH /v1/instances/{id} with the appropriate openclaw_config values. Supported policies depend on the OpenClaw version.