Push alerts as interactive cards to a Feishu group via the group's custom robot (Webhook). Beginners can finish the setup step by step.
Overview
The Feishu Card notification channel pushes alert events from Nightingale to a designated Feishu group via the Feishu Group Custom Robot (Webhook). Messages are rendered as rich interactive cards — with a colored header, title, separator and body. triggered is red and recovered is green, far more intuitive than plain Markdown messages.
- Use case: deliver alerts as polished cards to a Feishu group, with @ mentions of specific members.
- Prerequisites: a Feishu group, plus permission to “Add Robot” in that group.
- The whole setup has three steps: ① Add a robot in the Feishu group → ② Create a Feishu Card notification channel in Nightingale → ③ Fill in the access_token in the notification rule.
If you want to send to a direct chat, @ specific members by Feishu
open_id/user_id, or embed alert screenshots in the card (group-robot screenshot embedding is an advanced topic, see the last section), see Feishu Application. This page only covers the most common and simplest group-robot approach.
Step 1: Add a custom robot in the Feishu group
-
In the target Feishu group: Group Settings → Group Robots → Add Robot → Custom Robot.
-
Set the robot name (for example
Nightingale Alert) and description, then click “Next”. -
Security settings (at least one is required; “Custom Keyword” is recommended — Nightingale currently only supports the two below):
Type Description Use case Custom Keyword Robot only accepts messages containing the specified keyword(s); up to 3 Recommended, simplest. Use a word that always appears in alert titles, such as Alertorn9eIP Allowlist Only accept requests from the specified IP range Suitable when deployed behind a fixed public egress Feishu also offers a “signature verification” security policy. Nightingale’s default request body does not include
timestamp/sign; if you choose signing, you’ll need to fill the complete signed URL in the access_token field yourself — not recommended for beginners. -
Check “I have read and agree to the Custom Robot Service Agreement”, then click “Done”.
-
Copy the popup Webhook URL, which looks like:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxThe string after
/hook/is the Access Token (actually a UUID) you’ll fill into Nightingale later — save it.
Official Feishu limit: a single robot can send at most 100 messages per minute and 5 per second, exceeding which triggers throttling. For very high alert volumes, split alerts across multiple groups/robots, or configure a sensible suppression strategy in your notification rule.
Step 2: Create a Feishu Card notification channel in Nightingale
-
Sign in to Nightingale → left menu Notification → Notification Channels to enter the channel list page.
-
In the channel-type panel on the left, click Feishu Card to enter the create page (URL
/notification-channels/add?ident=feishucard).
-
Fill in the basics and save. Most fields are pre-filled by the system — you only need to change “Name”:

Section Field Edit needed Notes Basic Name Yes e.g. Feishu Group Card Robot. This is what appears when you select the channel in a notification ruleBasic Enabled Keep on If turned off, the channel will not be used Variables Contact Method Optional Used for @ mentions; the selected contact’s “Feishu open_id/phone/email” is injected into the message body Variables Parameters Keep default, do not delete The parameters access_tokenandbot_nameare pre-set; the actual token is filled in step 3 inside the notification ruleHTTP URL Keep default https://open.feishu.cn/open-apis/bot/v2/hook/{{$params.access_token}}—{{$params.access_token}}is replaced with the value filled in the notification ruleHTTP Method POSTFeishu Webhook only accepts POST HTTP Headers Content-Type: application/jsonPre-filled -
Scrolling down you will see “Request Body”. This piece is the core of the card-message logic — keep it as default:

The default request body is the Feishu interactive card structure (
msg_type: interactive). Key points:{ "msg_type": "interactive", "card": { "config": { "wide_screen_mode": true }, "header": { "title": { "content": "{{$tpl.title}}", "tag": "plain_text" }, "template": "{{if $event.IsRecovered}}green{{else}}red{{end}}" }, "elements": [ { "tag": "markdown", "content": "{{$tpl.content}}" } ] } }header.title.contentcomes from thetitlefield of the message template namedFeishuCard, typically🔔 <alert rule name>;header.templateautomatically changes color based on the event’sIsRecovered: green for recovered / red for triggered, so the status is obvious at a glance;elements[0].contentcomes from thecontentfield of theFeishuCardtemplate — the Markdown body of the card.
-
Click Save in the lower-left, and a notification channel of type “Feishu Card” is ready.
Note: Nightingale v8 no longer stores the token on the channel itself like older versions did. The same Feishu Card channel can be reused across multiple groups/robots; each notification rule fills in its own
access_token.
Step 3: Fill in the access_token in the notification rule
The UUID after /hook/ in a Feishu robot Webhook URL is filled inside the notification rule:
-
Left menu Notification → Notification Rules → New (or edit an existing rule).
-
In the “Notification Configuration” area:

- Notification Channel: pick the Feishu Card channel you just created;
- Message Template: pick
FeishuCard(built-in; if missing, import the default templates from “Message Templates”); - Access Token: paste the token from Step 1 (just the UUID after
/hook/, no full URL); - Bot Name: optional; a name to help you identify it, such as
Nightingale Monitoring; - Applicable Severity / Time Range / Tags: filter which events to push as needed.
-
After saving, click “Notification Test” to send a test message — the Feishu group should immediately receive an alert card.
One Feishu Card channel + multiple robots
If different business lines want to push to different groups, no new channel is needed — just create another notification rule with a different access_token.
FAQ
Q1: Getting "msg":"Key Words Not Found" / "code":19024 (keyword mismatch)?
A: The Feishu robot has the “Custom Keyword” security policy enabled, but no keyword appears in the alert title/content. Fix: include the configured keyword in your alert rule name, or add a more permissive keyword (such as Alert) on the Feishu robot side.
Q2: Getting "code":19021 / "msg":"sign match fail" (signature error)?
A: The Feishu robot is using “signature verification” mode, but Nightingale by default does not send sign/timestamp fields. Switch to “Custom Keyword” mode if possible; if you must use signing, fill the complete signed URL in the notification rule’s access_token (in the form https://open.feishu.cn/open-apis/bot/v2/hook/xxx?timestamp=yyy&sign=zzz).
Q3: The card is always red — recovery events don’t turn green?
A: The card color is decided by {{if $event.IsRecovered}}green{{else}}red{{end}} in the template. Verify that your alert rule has a recovery condition; for aggregated alerts that mix triggered and recovered, you can extend it to {{if $event.IsRecovered}}green{{else if ...}}orange{{else}}red{{end}}.
Q4: Hitting rate limits?
A: Feishu officially caps a single robot at 100 messages/minute, 5 per second. Recommendations:
- Enable alert suppression/aggregation;
- Split traffic across multiple groups by business;
- Send only P1/P2 alerts to Feishu, route P3 to email or another async channel.
Q5: What’s the difference between feishucard and lark_card?
A: They share the same card protocol; larkcard targets the international Lark version (open.larksuite.com) and feishucard targets the China Feishu version (open.feishu.cn). Form fields are identical — pick the one that matches the domain you actually use.