Feishu Channel Configuration Reference: All Keys and Defaults

Reference for every channels.feishu configuration key, its default value, and the rules that govern webhook paths. Use it when setting up or adjusting a Feishu or Lark channel.

Read this when

  • Looking up a `channels.feishu` configuration key
  • Checking the default value of a Feishu setting

The complete set of channels.feishu keys, their defaults, and the rules that govern webhook paths.

Configuration reference

All available options: Gateway configuration

SettingDescriptionDefault
channels.feishu.enabledTurns the channel on or offtrue
channels.feishu.domainAPI domain (feishu, lark, or a base URL from https://)feishu
channels.feishu.connectionModeHow events are transported (websocket or webhook)websocket
channels.feishu.defaultAccountAccount used by default for outbound routingdefault
channels.feishu.verificationTokenMandatory when running in webhook mode-
channels.feishu.encryptKeyMandatory when running in webhook mode-
channels.feishu.webhookPathNormalized HTTP request path (its first character must be /)/feishu/events
channels.feishu.legacyWebhookExplicit forwarding listener: { port, host? }; if omitted or set to false, no listener opens, though account inheritance still appliesnone
channels.feishu.accounts.<id>.appIdApp ID-
channels.feishu.accounts.<id>.appSecretApp Secret-
channels.feishu.accounts.<id>.domainDomain override for one accountfeishu
channels.feishu.accounts.<id>.replyToModeReply-reference mode for one accountinherited
channels.feishu.accounts.<id>.requireMentionInBotThreadsWhether one account requires a mention in threads this bot startedinherited
channels.feishu.accounts.<id>.ttsTTS override for one accounttts
channels.feishu.accounts.<id>.actions.stickerSticker action override for one accountinherited
channels.feishu.dmPolicyDM policy (pairing, allowlist, open)pairing
channels.feishu.allowFromDM allowlist (open_id list)-
channels.feishu.groupPolicyGroup policy (open, allowlist, disabled)allowlist
channels.feishu.groupAllowFromGroup allowlist-
channels.feishu.groupSenderAllowFromSender allowlist that applies across every group-
channels.feishu.requireMentionWhether an @mention is required in groupstrue (false when policy is open)
channels.feishu.requireMentionInBotThreadsChanges mention handling in threads this bot started; refer to access controlexisting mention behavior
channels.feishu.allowBotsLets other bots that mention this bot through, while guarding against bot loopsfalse
channels.feishu.groups.<chat_id>.requireMention@mention override for a single group; listing explicit IDs also admits that group under allowlist modeinherited
channels.feishu.groups.<chat_id>.requireMentionInBotThreadsWhether a mention is required in threads this bot started, per groupinherited
channels.feishu.groups.<chat_id>.enabledTurns a specific group on or offtrue
channels.feishu.groups.<chat_id>.allowFromSender allowlist for one group (takes precedence over groupSenderAllowFrom)-
channels.feishu.groupSessionScopeMapping of group sessions (group, group_sender, group_topic, group_topic_sender)group
channels.feishu.replyToModeMode for reply references (off, first, all, batched)all
channels.feishu.replyInThreadBot replies start or extend topic threads (disabled, enabled)disabled
channels.feishu.reactionNotificationsReaction events arriving inbound (off, own, all)own
channels.feishu.actions.stickerTurns on sending of received stickers plus sticker search as configuredfalse
channels.feishu.stickerSetsSearchable keys and keywords for received stickers, grouped by bot app IDnone
channels.feishu.vcAutoJoinJoins VC meetings you are invited to, once normal DM authorization is donefalse
channels.feishu.dynamicAgentCreation.enabledTurns on automatic creation of one agent per userfalse
channels.feishu.dynamicAgentCreation.workspaceTemplateTemplate for dynamic agent workspace paths~/.openclaw/workspace-{agentId}
channels.feishu.dynamicAgentCreation.agentDirTemplateTemplate for the agent directory name~/.openclaw/agents/{agentId}/agent
channels.feishu.dynamicAgentCreation.maxAgentsCap on how many dynamic agents get createdunlimited
channels.feishu.textChunkLimitSize of each message chunk4000
channels.feishu.streaming.chunkModeHow chunks are split (length or newline)length
channels.feishu.mediaMaxMbLimit on media size30
channels.feishu.renderModeHow replies are rendered (auto, raw, card)auto
channels.feishu.streaming.modeOutput as streaming cards (partial or off)partial
channels.feishu.streaming.block.enabledStreaming of replies once a block completesfalse
channels.feishu.typingIndicatorSending of typing reactionstrue
channels.feishu.resolveSenderNamesLookup of sender display namestrue
channels.feishu.configWritesPermit config writes started by the channel (dynamic agents depend on this)true
channels.feishu.tools.docTurns on document toolstrue
channels.feishu.tools.chatTurn on chat info toolstrue
channels.feishu.tools.wikiTurn on knowledge base tools (needs doc)true
channels.feishu.tools.driveTurn on cloud storage toolstrue
channels.feishu.tools.permTurn on permission management toolsfalse
channels.feishu.tools.scopesTurn on the app scopes diagnostic tooltrue
channels.feishu.tools.bitableTurn on Bitable/Base toolstrue
channels.feishu.accounts.<id>.tools.bitableBitable/Base tool gate applied per accountinherited

For webhook mode, channels.feishu.webhookPath and channels.feishu.accounts.<id>.webhookPath both have to be normalized HTTP request paths that start with /, for example /feishu/events. A query string is allowed but optional, and when present it must match exactly. The following are rejected: full URLs, relative paths, URL fragments, dot segments, and spaces or Unicode that are not encoded. Should an existing configuration hold a path that is not normalized, run openclaw doctor --fix to repair it prior to starting the gateway.

Gateway webhook route

Webhook mode relies on the Gateway HTTP listener (gateway.port, usually 18789) on webhookPath, usually /feishu/events. Point the public Feishu callback URL or your reverse proxy at that Gateway port and path. Feishu signatures are verified by the route, and Gateway bearer authentication is not needed. When their encrypt keys differ, accounts may share one path; if signatures are ambiguous on the Gateway port, the request is rejected rather than an arbitrary account being chosen. Accounts carried over from before that share both a path and an encrypt key stay distinguishable through their own separate explicit legacy listeners. Before you move those callbacks onto the shared Gateway port, give the accounts distinct encrypt keys or webhook paths.

Because signature verification needs the whole body, accounts that share a Gateway path also share that path's unauthenticated request-rate and in-flight body-read budgets. Separate budgets require distinct webhookPath pathnames. Trusted legacy endpoints keep independent in-flight capacity even where their paths are identical.

A new installation opens no separate webhook port. On a installation that already exists, Doctor pins legacyWebhook: { port: 3000, host: "127.0.0.1" } once for enabled webhook accounts that depended on the implicit endpoint. That explicit listener belongs to the Gateway, which forwards requests to the same plugin route and signature verifier. To pick a different endpoint, set legacyWebhook: { port: 3100, host: "127.0.0.1" }. When the object host is omitted, it binds to 127.0.0.1; explicit hosts, wildcard addresses included, are kept as written. Account entries take the root setting, and accounts.<id>.legacyWebhook: false turns forwarding off for that account. OpenClaw 2026.9.8 or newer is required by Feishu. Every webhook listener is owned by the Gateway, and a shared legacy socket remains open as long as another account still uses that endpoint. When an account shuts down, authenticated responses get up to five seconds to finish, which matches the close grace period of the previous listener. At that deadline unfinished responses are closed; routes and listeners of other accounts are unaffected. During the grace period, correctly signed callbacks for the stopping account get a retryable 503, unless a live successor already accepts their signature.

The plugin's Doctor migration relocates webhookPort and webhookHost into legacyWebhook: { port, host }, and when only one key was set it keeps the effective old defaults. The original settings are protected by the normal config backup. Existing legacyWebhook settings, false included, take precedence. The one-shot pin preserves an existing install that omitted both old settings; it needs evidence of prior operation and is not applied to a fresh install.

If you are updating from a 2026.9.6 host that has these old keys, bring OpenClaw core to 2026.9.8 or newer first, since that release contains the plugin-update migration repair. After that, explicitly update any pinned Feishu package to the release you want. Explicit plugin version pins are preserved by the core updater. Feishu's migration runs in the updated installer before the replacement package is activated; the published 2026.9.6 installer rejects the new schema before that repair can run. If a plugin-only update is refused, the previous installation and settings stay intact.

The deprecated TypeScript webhookPort and webhookHost input fields stay source-compatible through the next Plugin SDK major. Runtime config uses legacyWebhook; to migrate the old keys, run openclaw doctor --fix.

To rely on the Gateway port alone, change the Feishu callback URL or the reverse-proxy upstream to the Gateway port and webhookPath, confirm delivery works, and then drop the legacyWebhook pin. Keep meta.migrations.webhookListeners, which Doctor saves alongside the pin, so later runs do not recreate it. Included and read-only config sources are covered in webhook migrations. Use accounts.<id>.legacyWebhook: false to override an inherited root listener. Startup and Doctor print the destination and the removal instruction. Healthy endpoint guidance is shown by Doctor as information, and path conflicts as warnings; disabled accounts and WebSocket accounts get no webhook notes. Callback URLs stored in the Feishu console cannot be updated by OpenClaw.

The exact Gateway check paths (/health, /healthz, /ready, /readyz, /startup, and /startupz, query strings included) cannot receive Feishu callbacks on the Gateway port. With no explicit legacy listener, webhook startup refuses these paths and names the replacement. When the legacy listener is enabled, it keeps serving the old path. Change webhookPath to /feishu/events (or to another unreserved path), update the Feishu callback URL or reverse-proxy path, and confirm delivery on the Gateway before you remove the legacyWebhook pin. This rule does not reserve paths nested below a check path.

Paths under /api/channels need Gateway authentication, so ordinary Feishu callbacks cannot reach them on the Gateway port. Encoded forms of that prefix are covered too. Startup and Doctor issue the same path-change instructions; legacy listeners keep those callbacks working until the path and the external callback or proxy have been migrated.

1,653 words · updated Oct 26, 2026