LandfallDocs
Triggering integrations · Buzz

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.

Buzz
reaction or message trigger
→
call_webhook
x-landfall-buzz-secret
→
Landfall
opens or attaches an incident

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:

Terminal
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

SettingValue
URLhttps://api.landfalls.ai/triggers/buzz/<org-slug>
MethodPOST
Headerx-landfall-buzz-secret: <secret from step 1>
Triggerreaction_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.

workflow.yaml
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"
Terminal
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 fieldIn Landfall
textThe title, Buzz: <first line>, cut at 120 characters. The message is kept on the timeline up to 8 KiB.
textThe 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_idThe attach identity. Required.
channel_idRequired. Kept on the trigger entry and in its link back to the message.
author_pubkeyRecorded on the trigger entry. author is read when it is missing.
timestampThe time on the trigger entry, sent in unix seconds. The delivery time when it is missing.
emoji, triggerKept with the raw delivery.

3. Test it

React with 🚨 to a message in the channel, or send the same body from a terminal:

Terminal · Worked example
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 seeWhat 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.
429More than 60 calls a minute to this route.
413The 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 BuzzChannel updates are not connected, the templates are not approved, or real egress is off. See Connecting Buzz.

Reference

FieldValue
EndpointPOST https://api.landfalls.ai/triggers/buzz/<org-slug>
AuthPer-organization shared secret in x-landfall-buzz-secret. The slug must be the secret's organization.
Issue or rotatePOST https://api.landfalls.ai/o/<your-org>/triggers/buzz-secret, admin only. Shown once; issuing again replaces it.
Recognized byA body, JSON or form, with channel_id and message_id.
Attach identityThe Buzz message id.
Each deliveryOpens 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 payloadsA 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 badgeThe source reads buzz.

See Integrations architecture for how every trigger shares one pipeline.