Pairing is GoClaw's primary mechanism for granting users access to chat with your agents. It provides a secure way to authorize individuals on third-party platforms like Discord or Microsoft Teams.
When the pairing DM policy is active (the default), GoClaw acts as a gatekeeper:
ABCD1234) and sends it to the user.Despite its name, channels.dm_policy applies to every message the bot receives on Discord, Teams, Telegram and Facebook Messenger, not only to direct messages. An unapproved member who @mentions the bot in a Discord server channel or a Telegram group gets the pairing reply in that channel or group. Comments on a Facebook Page's posts and Lead Ads submissions are not messages to the bot and do not go through pairing; see Facebook: comments, leads and dm_policy.
channels.dm_policy |
Who gets an answer |
|---|---|
pairing (default) |
IDs in channels.allow_from and approved (paired) users. Anyone else gets a pairing code. |
allowlist |
IDs in channels.allow_from and users already approved. Anyone else is told "You are not authorized to use this bot." and no code is issued. |
open |
Everyone. |
Once a user has their pairing code, you can approve it using any of the following methods:
Navigate to the Pairing tab in your GoClaw dashboard (typically http://localhost:8080). Pending requests are listed with their channel, the user's platform ID and their code. Pick a role for the user (user, admin or system) and click Approve. The tab can be filtered by channel.
Use the goclaw binary directly:
# List pending pairing requests (the channel defaults to discord)
./goclaw pairing pending telegram
# Approve a specific code (--role user | admin | system, default user)
./goclaw pairing approve <CODE>
./goclaw pairing approve <CODE> --role admin
approve prints the new user's GoClaw user ID (u_…), which revoke and link take.
A running gateway sees an approval, revocation or link made with the CLI at once: it reads the pairing files again whenever they change.
The dashboard uses this API under the hood. It needs the gateway token (gateway.auth.token):
curl -X POST http://localhost:8080/api/pairing \
-H "X-Goclaw-Token: <gateway token>" \
-H "Content-Type: application/json" \
-d '{"action": "approve", "channel": "discord", "code": "ABCD1234", "role": "user"}'
channel may be left out of an approve; the answer names the account and channel approved. GET /api/pairing?channel=<name> (or all) lists pending requests and approved users. The other POST actions are {"action": "revoke", "user_id": "u_…"} and {"action": "update_role", "user_id": "u_…", "role": "admin"}. A role other than user, admin or system is refused (400).
If you already know the platform-specific IDs for yourself or your team, you can bypass the pairing flow by adding them to the allow_from list in config.yaml:
channels:
allow_from:
- "100000000000000103" # Discord user ID
- "29:1abc-def-ghi" # Teams user ID
allow_from: ["*"] lets everyone in, under either policy.
To remove a user from the approved list, use the Web UI (Pairing tab → approved users → Revoke) or the CLI. Revoking removes the user and every channel account linked to them.
# Revoke access via CLI: takes the GoClaw user ID (u_…), not the platform ID
./goclaw pairing revoke <USER_ID>
# Approved users on a channel (shows platform IDs; the channel defaults to discord)
./goclaw pairing list telegram
pairing list shows each user's platform ID, not the u_… ID. Find the u_… ID in the output of approve, on the Web UI (shown as "User ID"), or in goclaw-users.json. As with approvals, a CLI revoke is not seen by a running gateway until it restarts, so the user keeps access until then: revoke on the Web UI while the gateway runs.
Approved users are stored in <state dir>/credentials/goclaw-users.json and pending requests in <state dir>/credentials/goclaw-pending.json (the state directory is ~/.goclaw unless GOCLAW_STATE_DIR says otherwise).
0, O, 1, I)../goclaw pairing link u_123456 telegram 123456789 (user ID, channel, platform account ID). The same restart rule applies as for a CLI approval.