Skip to main content

Messaging platforms

Feishu

Feishu (Lark) is a team chat platform used by companies for messaging and collaboration. This plugin connects OpenClaw to a Feishu/Lark bot using the platform’s WebSocket event subscription so messages can be received without exposing a public webhook URL.


Plugin required​

Install the Feishu plugin:

openclaw plugins install @openclaw/feishu

Local checkout (when running from a git repo):

openclaw plugins install ./extensions/feishu

Quickstart​

There are two ways to add the Feishu channel:

If you just installed OpenClaw, run the wizard:

openclaw onboard

The wizard guides you through:

  1. Creating a Feishu app and collecting credentials
  2. Configuring app credentials in OpenClaw
  3. Starting the gateway

✅ After configuration, check gateway status:

  • openclaw gateway status
  • openclaw logs --follow

Method 2: CLI setup​

If you already completed initial install, add the channel via CLI:

openclaw channels add

Choose Feishu, then enter the App ID and App Secret. ✅ After configuration, manage the gateway:

  • openclaw gateway status
  • openclaw gateway restart
  • openclaw logs --follow

Step 1: Create a Feishu app​

1. Open Feishu Open Platform​

Visit Feishu Open Platform and sign in. Lark (global) tenants should use https://open.larksuite.com/app and set domain: "lark" in the Feishu config.

2. Create an app​

  1. Click Create enterprise app
  2. Fill in the app name + description
  3. Choose an app icon

Create enterprise app

3. Copy credentials​

From Credentials & Basic Info, copy:

  • App ID (format: cli_xxx)
  • App Secret

❗ Important: keep the App Secret private. Get credentials

4. Configure permissions​

On Permissions, click Batch import and paste:

{
"scopes": {
"tenant": [
"aily:file:read",
"aily:file:write",
"application:application.app_message_stats.overview:readonly",
"application:application:self_manage",
"application:bot.menu:write",
"cardkit:card:read",
"cardkit:card:write",
"contact:user.employee_id:readonly",
"corehr:file:download",
"event:ip_list",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.members:bot_access",
"im:message",
"im:message.group_at_msg:readonly",
"im:message.p2p_msg:readonly",
"im:message:readonly",
"im:message:send_as_bot",
"im:resource"
],
"user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"]
}
}

Configure permissions

5. Enable bot capability​

In App Capability > Bot:

  1. Enable bot capability
  2. Set the bot name

Enable bot capability

6. Configure event subscription​

⚠️ Important: before setting event subscription, make sure:

  1. You already ran openclaw channels add for Feishu
  2. The gateway is running (openclaw gateway status)

In Event Subscription:

  1. Choose Use long connection to receive events (WebSocket)
  2. Add the event: im.message.receive_v1

⚠️ If the gateway is not running, the long-connection setup may fail to save. Configure event subscription

7. Publish the app​

  1. Create a version in Version Management & Release
  2. Submit for review and publish
  3. Wait for admin approval (enterprise apps usually auto-approve)

Step 2: Configure OpenClaw​

openclaw channels add

Choose Feishu and paste your App ID + App Secret.

Configure via config file​

Edit ~/.openclaw/openclaw.json:

{
channels: {
feishu: {
enabled: true,
dmPolicy: "pairing",
accounts: {
main: {
appId: "cli_xxx",
appSecret: "xxx",
botName: "My AI assistant",
},
},
},
},
}

If you use connectionMode: "webhook", set verificationToken. The Feishu webhook server binds to 127.0.0.1 by default; set webhookHost only if you intentionally need a different bind address.

Verification Token (webhook mode)​

When using webhook mode, set channels.feishu.verificationToken in your config. To get the value:

  1. In Feishu Open Platform, open your app
  2. Go to Development → Events & Callbacks (开发配置 → 事件与回调)
  3. Open the Encryption tab (加密策略)
  4. Copy Verification Token

Verification Token location

Configure via environment variables​

export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"

Lark (global) domain​

If your tenant is on Lark (international), set the domain to lark (or a full domain string). You can set it at channels.feishu.domain or per account (channels.feishu.accounts..domain).

{
channels: {
feishu: {
domain: "lark",
accounts: {
main: {
appId: "cli_xxx",
appSecret: "xxx",
},
},
},
},
}

Quota optimization flags​

You can reduce Feishu API usage with two optional flags:

  • typingIndicator (default true): when false, skip typing reaction calls.
  • resolveSenderNames (default true): when false, skip sender profile lookup calls.

Set them at top level or per account:

{
channels: {
feishu: {
typingIndicator: false,
resolveSenderNames: false,
accounts: {
main: {
appId: "cli_xxx",
appSecret: "xxx",
typingIndicator: true,
resolveSenderNames: false,
},
},
},
},
}

Step 3: Start + test​

1. Start the gateway​

openclaw gateway

2. Send a test message​

In Feishu, find your bot and send a message.

3. Approve pairing​

By default, the bot replies with a pairing code. Approve it:

openclaw pairing approve feishu <CODE>

After approval, you can chat normally.


Overview​

  • Feishu bot channel: Feishu bot managed by the gateway
  • Deterministic routing: replies always return to Feishu
  • Session isolation: DMs share a main session; groups are isolated
  • WebSocket connection: long connection via Feishu SDK, no public URL needed

Access control​

Direct messages​

  • Default: dmPolicy: "pairing" (unknown users get a pairing code)

  • Approve pairing:

    Copy

    openclaw pairing list feishu
    openclaw pairing approve feishu <CODE>
  • Allowlist mode: set channels.feishu.allowFrom with allowed Open IDs

Group chats​

1. Group policy (channels.feishu.groupPolicy):

  • "open" = allow everyone in groups (default)
  • "allowlist" = only allow groupAllowFrom
  • "disabled" = disable group messages

2. Mention requirement (channels.feishu.groups.<chat_id>.requireMention):

  • true = require @mention (default)
  • false = respond without mentions

Group configuration examples​

Allow all groups, require @mention (default)​

{
channels: {
feishu: {
groupPolicy: "open",
// Default requireMention: true
},
},
}

Allow all groups, no @mention required​

{
channels: {
feishu: {
groups: {
oc_xxx: { requireMention: false },
},
},
},
}

Allow specific groups only​

{
channels: {
feishu: {
groupPolicy: "allowlist",
// Feishu group IDs (chat_id) look like: oc_xxx
groupAllowFrom: ["oc_xxx", "oc_yyy"],
},
},
}

Restrict which senders can message in a group (sender allowlist)​

In addition to allowing the group itself, all messages in that group are gated by the sender open_id: only users listed in groups.<chat_id>.allowFrom have their messages processed; messages from other members are ignored (this is full sender-level gating, not only for control commands like /reset or /new).

{
channels: {
feishu: {
groupPolicy: "allowlist",
groupAllowFrom: ["oc_xxx"],
groups: {
oc_xxx: {
// Feishu user IDs (open_id) look like: ou_xxx
allowFrom: ["ou_user1", "ou_user2"],
},
},
},
},
}

Get group/user IDs​

Group IDs (chat_id)​

Group IDs look like oc_xxx. Method 1 (recommended)

  1. Start the gateway and @mention the bot in the group
  2. Run openclaw logs --follow and look for chat_id

Method 2 Use the Feishu API debugger to list group chats.

User IDs (open_id)​

User IDs look like ou_xxx. Method 1 (recommended)

  1. Start the gateway and DM the bot
  2. Run openclaw logs --follow and look for open_id

Method 2 Check pairing requests for user Open IDs:

openclaw pairing list feishu

Common commands​

CommandDescription
/statusShow bot status
/resetReset the session
/modelShow/switch model

Note: Feishu does not support native command menus yet, so commands must be sent as text.

Gateway management commands​

CommandDescription
openclaw gateway statusShow gateway status
openclaw gateway installInstall/start gateway service
openclaw gateway stopStop gateway service
openclaw gateway restartRestart gateway service
openclaw logs --followTail gateway logs

Troubleshooting​

Bot does not respond in group chats​

  1. Ensure the bot is added to the group
  2. Ensure you @mention the bot (default behavior)
  3. Check groupPolicy is not set to "disabled"
  4. Check logs: openclaw logs --follow

Bot does not receive messages​

  1. Ensure the app is published and approved
  2. Ensure event subscription includes im.message.receive_v1
  3. Ensure long connection is enabled
  4. Ensure app permissions are complete
  5. Ensure the gateway is running: openclaw gateway status
  6. Check logs: openclaw logs --follow

App Secret leak​

  1. Reset the App Secret in Feishu Open Platform
  2. Update the App Secret in your config
  3. Restart the gateway

Message send failures​

  1. Ensure the app has im:message:send_as_bot permission
  2. Ensure the app is published
  3. Check logs for detailed errors

Advanced configuration​

Multiple accounts​

{
channels: {
feishu: {
defaultAccount: "main",
accounts: {
main: {
appId: "cli_xxx",
appSecret: "xxx",
botName: "Primary bot",
},
backup: {
appId: "cli_yyy",
appSecret: "yyy",
botName: "Backup bot",
enabled: false,
},
},
},
},
}

defaultAccount controls which Feishu account is used when outbound APIs do not specify an accountId explicitly.

Message limits​

  • textChunkLimit: outbound text chunk size (default: 2000 chars)
  • mediaMaxMb: media upload/download limit (default: 30MB)

Streaming​

Feishu supports streaming replies via interactive cards. When enabled, the bot updates a card as it generates text.

{
channels: {
feishu: {
streaming: true, // enable streaming card output (default true)
blockStreaming: true, // enable block-level streaming (default true)
},
},
}

Set streaming: false to wait for the full reply before sending.

Multi-agent routing​

Use bindings to route Feishu DMs or groups to different agents.

{
agents: {
list: [
{ id: "main" },
{
id: "clawd-fan",
workspace: "/home/user/clawd-fan",
agentDir: "/home/user/.openclaw/agents/clawd-fan/agent",
},
{
id: "clawd-xi",
workspace: "/home/user/clawd-xi",
agentDir: "/home/user/.openclaw/agents/clawd-xi/agent",
},
],
},
bindings: [
{
agentId: "main",
match: {
channel: "feishu",
peer: { kind: "direct", id: "ou_xxx" },
},
},
{
agentId: "clawd-fan",
match: {
channel: "feishu",
peer: { kind: "direct", id: "ou_yyy" },
},
},
{
agentId: "clawd-xi",
match: {
channel: "feishu",
peer: { kind: "group", id: "oc_zzz" },
},
},
],
}

Routing fields:

  • match.channel: "feishu"
  • match.peer.kind: "direct" or "group"
  • match.peer.id: user Open ID (ou_xxx) or group ID (oc_xxx)

See Get group/user IDs for lookup tips.


Configuration reference​

Full configuration: Gateway configuration Key options:

SettingDescriptionDefault
channels.feishu.enabledEnable/disable channeltrue
channels.feishu.domainAPI domain (feishu or lark)feishu
channels.feishu.connectionModeEvent transport modewebsocket
channels.feishu.defaultAccountDefault account ID for outbound routingdefault
channels.feishu.verificationTokenRequired for webhook mode-
channels.feishu.webhookPathWebhook route path/feishu/events
channels.feishu.webhookHostWebhook bind host127.0.0.1
channels.feishu.webhookPortWebhook bind port3000
channels.feishu.accounts..appIdApp ID-
channels.feishu.accounts..appSecretApp Secret-
channels.feishu.accounts..domainPer-account API domain overridefeishu
channels.feishu.dmPolicyDM policypairing
channels.feishu.allowFromDM allowlist (open_id list)-
channels.feishu.groupPolicyGroup policyopen
channels.feishu.groupAllowFromGroup allowlist-
channels.feishu.groups.<chat_id>.requireMentionRequire @mentiontrue
channels.feishu.groups.<chat_id>.enabledEnable grouptrue
channels.feishu.textChunkLimitMessage chunk size2000
channels.feishu.mediaMaxMbMedia size limit30
channels.feishu.streamingEnable streaming card outputtrue
channels.feishu.blockStreamingEnable block streamingtrue

dmPolicy reference​

ValueBehavior
"pairing"Default. Unknown users get a pairing code; must be approved
"allowlist"Only users in allowFrom can chat
"open"Allow all users (requires "*" in allowFrom)
"disabled"Disable DMs

Supported message types​

Receive​

  • ✅ Text
  • ✅ Rich text (post)
  • ✅ Images
  • ✅ Files
  • ✅ Audio
  • ✅ Video
  • ✅ Stickers

Send​

  • ✅ Text
  • ✅ Images
  • ✅ Files
  • ✅ Audio
  • ⚠️ Rich text (partial support)

DiscordGoogle Chat