docs/cli/channels.md
openclaw channelsManage chat channel accounts and their runtime status on the Gateway.
Related docs:
openclaw channels list
openclaw channels status
openclaw channels capabilities
openclaw channels capabilities --channel discord --target channel:123
openclaw channels resolve --channel slack "#general" "@jane"
openclaw channels logs --channel all
channels status: --probe, --timeout <ms>, --jsonchannels capabilities: --channel <name>, --account <id> (only with --channel), --target <dest>, --timeout <ms>, --jsonchannels resolve: <entries...>, --channel <name>, --account <id>, --kind <auto|user|group>, --jsonchannels logs: --channel <name|all>, --lines <n>, --jsonchannels status --probe is the live path: on a reachable gateway it runs per-account
probeAccount and optional auditAccount checks, so output can include transport
state plus probe results such as works, probe failed, audit ok, or audit failed.
If the gateway is unreachable, channels status falls back to config-only summaries
instead of live probe output.
Do not use openclaw sessions, Gateway sessions.list, or the agent
sessions_list tool as a channel socket-health signal. Those surfaces report
stored conversation rows, not provider runtime state. After a Discord provider
restart, a connected but quiet account may be healthy while no Discord session
row appears until the next inbound or outbound conversation event.
openclaw channels add --channel telegram --token <bot-token>
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"
openclaw channels remove --channel telegram --delete
channels remove only operates on installed/configured channel plugins. Use channels add first for installable catalog channels.
For runtime-backed channel plugins, channels remove also asks the running Gateway to stop the selected account before it updates config, so disabling or deleting an account does not leave the old listener active until restart.
Common non-interactive add surfaces include:
--token, --bot-token, --app-token, --token-file--signal-number, --cli-path, --http-url, --http-host, --http-port, --db-path, --service, --region--webhook-path, --webhook-url, --audience-type, --audience--homeserver, --user-id, --access-token, --password, --device-name, --initial-sync-limit--private-key, --relay-urls--ship, --url, --code, --group-channels, --dm-allowlist, --auto-discover-channels--use-env for default-account env-backed auth where supportedIf a channel plugin needs to be installed during a flag-driven add command, OpenClaw uses the channel's default install source without opening the interactive plugin install prompt.
When you run openclaw channels add without flags, the interactive wizard can prompt:
Bind configured channel accounts to agents now?If you confirm bind now, the wizard asks which agent should own each configured channel account and writes account-scoped routing bindings.
You can also manage the same routing rules later with openclaw agents bindings, openclaw agents bind, and openclaw agents unbind (see agents).
When you add a non-default account to a channel that is still using single-account top-level settings, OpenClaw promotes account-scoped top-level values into the channel's account map before writing the new account. Most channels land those values in channels.<channel>.accounts.default, but bundled channels can preserve an existing matching promoted account instead. Matrix is the current example: if one named account already exists, or defaultAccount points at an existing named account, promotion preserves that account instead of creating a new accounts.default.
Routing behavior stays consistent:
accountId) continue to match the default account.channels add does not auto-create or rewrite bindings in non-interactive mode.If your config was already in a mixed state (named accounts present and top-level single-account values still set), run openclaw doctor --fix to move account-scoped values into the promoted account chosen for that channel. Most channels promote into accounts.default; Matrix can preserve an existing named/default target instead.
openclaw channels login --channel whatsapp
openclaw channels logout --channel whatsapp
channels login supports --verbose.channels login and logout can infer the channel when only one supported login target is configured.channels logout prefers the live Gateway path when reachable, so logout stops any active listener before clearing channel auth state. If a local Gateway is not reachable, it falls back to local auth cleanup.channels login from a terminal on the gateway host. Agent exec blocks this interactive login flow; channel-native agent login tools, such as whatsapp_login, should be used from chat when available.openclaw status --deep for a broad probe.openclaw doctor for guided fixes.openclaw channels list prints Claude: HTTP 403 ... user:profile → usage snapshot needs the user:profile scope. Use --no-usage, or provide a claude.ai session key (CLAUDE_WEB_SESSION_KEY / CLAUDE_WEB_COOKIE), or re-auth via Claude CLI.openclaw channels status falls back to config-only summaries when the gateway is unreachable. If a supported channel credential is configured via SecretRef but unavailable in the current command path, it reports that account as configured with degraded notes instead of showing it as not configured.Fetch provider capability hints (intents/scopes where available) plus static feature support:
openclaw channels capabilities
openclaw channels capabilities --channel discord --target channel:123
Notes:
--channel is optional; omit it to list every channel (including extensions).--account is only valid with --channel.--target accepts channel:<id> or a raw numeric channel id and only applies to Discord.Probe: unavailable.Resolve channel/user names to IDs using the provider directory:
openclaw channels resolve --channel slack "#general" "@jane"
openclaw channels resolve --channel discord "My Server/#support" "@someone"
openclaw channels resolve --channel matrix "Project Room"
Notes:
--kind user|group|auto to force the target type.channels resolve is read-only. If a selected account is configured via SecretRef but that credential is unavailable in the current command path, the command returns degraded unresolved results with notes instead of aborting the entire run.channels resolve does not install channel plugins. Use channels add --channel <name> before resolving names for an installable catalog channel.