Opening a war room from a Buzz message
A Buzz workflow opens a Landfall war room from a message: a reaction on it, a keyword in it, or a workflow someone runs by hand. It is not about the Landfall agent inside Buzz or posting updates into a channel; see Connecting Buzz. The two are independent.
How it works
A Buzz workflow is a small YAML definition attached to a channel. Its call_webhook step posts to https://api.landfalls.ai/triggers/buzz/<org-slug> with the fields Buzz exposes for the triggering message. Buzz cannot sign a request, so the credential is a per-organization secret sent in the x-landfall-buzz-secret header. It is separate from your ingest token and from every other provider's secret, and the slug in the URL must be the secret's own organization. Landfall reads the body as JSON or as a form and needs two fields from it, channel_id and message_id. The Buzz message id is the attach identity: one message opens one incident.
This route never posts back to Buzz. When channel updates are connected, the war-room link arrives as a reply in the originating thread through that path.
What you'll need
- An admin on your Landfall organization, with a personal API key from Your settings → API keys, to issue the trigger secret.
- Owner or admin rights on the Buzz channel: saving a workflow that calls an external URL needs that authority.
- Buzz Desktop or the buzz CLI to create the workflow.
- Optional: channel updates connected, for the reply with the room link.
1. Issue the trigger secret
The secret has no button in the app yet. An admin issues it through the API:
curl -X POST https://api.landfalls.ai/o/<your-org>/triggers/buzz-secret \ -H "Authorization: Bearer lf_key_…"
The response is { "secret": "<64 hex characters>" }, shown exactly once. Landfall keeps only its SHA-256 hash. Issuing again replaces it at once, and the previous secret stops working. Each issue is audited. When channel updates are connected, the Buzz panel under Integrations → Chat → Buzz then reads (issued) in its Trigger from Buzz section, next to the webhook path.
2. Point Buzz at Landfall
| Setting | Value |
|---|---|
| URL | https://api.landfalls.ai/triggers/buzz/<org-slug> |
| Method | POST |
| Header | x-landfall-buzz-secret: <secret from step 1> |
| Trigger | reaction_added with an emoji filter, or message_posted with a text filter |
The example below opens a war room when someone reacts with 🚨 to a message. Replace the slug and the secret, then save it on the channel.
name: "Open a Landfall war room"
trigger:
on: reaction_added
filter: "trigger.emoji == '🚨'"
steps:
- id: open
action: call_webhook
url: "https://api.landfalls.ai/triggers/buzz/<org-slug>"
method: POST
headers:
x-landfall-buzz-secret: "<secret from Landfall>"
content-type: "application/json"
body:
channel_id: "{{trigger.channel_id}}"
message_id: "{{trigger.message_id}}"
author_pubkey: "{{trigger.author}}"
text: "{{trigger.text}}"
timestamp: "{{trigger.timestamp}}"
emoji: "{{trigger.emoji}}"
trigger: "reaction_added"buzz workflows create --channel <channel-id> --yaml "$(cat workflow.yaml)"For a keyword trigger use on: message_posted with a filter such as str_contains(trigger.text, 'P1') and set trigger: "message_posted" in the body. Only the fields above exist on Buzz's trigger; an unknown template variable is sent as literal text.
What Buzz's fields become
| Buzz field | In Landfall |
|---|---|
| text | The title, Buzz: <first line>, cut at 120 characters. The message is kept on the timeline up to 8 KiB. |
| text | The proposed severity: sev2 when the text contains P1, sev1, outage or down as a word, sev3 otherwise. It is recorded as a proposal, so a person decides. |
| message_id | The attach identity. Required. |
| channel_id | Required. Kept on the trigger entry and in its link back to the message. |
| author_pubkey | Recorded on the trigger entry. author is read when it is missing. |
| timestamp | The time on the trigger entry, sent in unix seconds. The delivery time when it is missing. |
| emoji, trigger | Kept with the raw delivery. |
3. Test it
React with 🚨 to a message in the channel, or send the same body from a terminal:
curl -sS -X POST "https://api.landfalls.ai/triggers/buzz/<org-slug>" \
-H "x-landfall-buzz-secret: <secret>" \
-H "content-type: application/json" \
--data '{"channel_id":"<channel-id>","message_id":"<64-hex>","author_pubkey":"<64-hex>","text":"P1: checkout is down","timestamp":1757000000,"emoji":"🚨","trigger":"reaction_added"}'The response names the outcome, opened the first time and attached when you repeat it, with the incident id and the war-room URL. In Landfall, a new incident titled Buzz: P1: checkout is down appears in the Incidents list at a proposed sev2, and its first timeline entry is the Buzz message.
Repeats and recovery
The attach identity is the Buzz message id. If the workflow fires again for the same message while its incident is open, the delivery attaches to that incident and records a repeat on its timeline instead of opening another. Once that incident is resolved or archived, the same message opens a new one. Buzz sends no recovery, so Landfall never resolves an incident from Buzz; a person does.
Troubleshooting
| What you see | What it means |
|---|---|
| 401 {"error":"unauthorized"} | The secret is missing or wrong, or the slug in the URL is not the secret's organization. The reason goes to the audit log only. Issue a new secret if in doubt. |
| 200 {"outcome":"ignored"} | The body had no channel_id or no message_id. Check the workflow's body map. |
| 503 {"error":"unavailable"} | Landfall failed while opening or attaching. Buzz retries a failed call; a retry is safe because the message id attaches it. |
| 200 {"outcome":"suppressed", …} | An active maintenance window covers this delivery, so no room opens. See Maintenance windows. |
| 429 | More than 60 calls a minute to this route. |
| 413 | The body is over 256 KiB. |
| The title reads Buzz: {{trigger.text}} | The workflow used a variable Buzz does not have, and Buzz sent it as literal text. Use only the fields in the example. |
| No reply with the room link in Buzz | Channel updates are not connected, the templates are not approved, or real egress is off. See Connecting Buzz. |
Reference
| Field | Value |
|---|---|
| Endpoint | POST https://api.landfalls.ai/triggers/buzz/<org-slug> |
| Auth | Per-organization shared secret in x-landfall-buzz-secret. The slug must be the secret's organization. |
| Issue or rotate | POST https://api.landfalls.ai/o/<your-org>/triggers/buzz-secret, admin only. Shown once; issuing again replaces it. |
| Recognized by | A body, JSON or form, with channel_id and message_id. |
| Attach identity | The Buzz message id. |
| Each delivery | Opens an incident, or attaches a repeat to the open one for the same message, unless a maintenance window suppresses it. At most 60 a minute and 256 KiB each. |
| Rejected payloads | A missing or wrong secret, or a slug that is not the secret's organization, gets a uniform 401. The reason is recorded in the audit log only. A body without the two ids is accepted and ignored. |
| Incident badge | The source reads buzz. |
See Integrations architecture for how every trigger shares one pipeline.