LandfallDocs
Triggering integrations · Remote source

Opening a war room from a remote source

This page is about opening incidents automatically from a service you host that speaks the Landfall Source Protocol. It is not about reading telemetry; if you want the investigator to query your service once an incident already exists, see Remote source instead. The two are independent, and most teams eventually set up both.

Your service
detects a condition
POST /triggers
the source trigger payload
Landfall
opens or attaches an incident

How it works

The protocol defines its own trigger payload. Your service posts it to the same endpoint every other automated source uses, POST /triggers, authenticated by the same per-organization bearer ingest token as Datadog, Coralogix, CloudWatch and Sentry. Landfall recognizes the body by its landfallSource: "remote" discriminator, checked last in the chain of known shapes so it can never change how the existing sources are recognized.

What is different from those sources is attribution. The payload names the connection it comes from, so each remote connection has its own trigger identity: the incident is attributed to that connection, its severity is taken from the payload directly (never from another source's default), and the dedup key you supply gives it the same open / attach / record / ignore handling described on Integrations architecture. The Alertmanager webhook format is not accepted as an alias; a remote source speaks its own payload.

What you'll need

  • A remote source connection that is configured and currently connected, per Remote source. A payload naming a connection the organization does not have, has uninstalled, or whose last health check failed is rejected.
  • An admin seat on your Landfall organization, to mint the ingest token below.
  • The connection id. It is default for the first connection of a source, and shown on the connection's card for any other.

1. Mint a trigger ingest token

If you've already minted one for another source on this endpoint, reuse it: the same token works for every source. Otherwise it is two API calls, made once with your own Landfall account:

Terminal
SESSION=$(curl -s -X POST https://api.landfalls.ai/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"<you>","password":"<your password>","orgSlug":"<your-org>"}' \
  | jq -r .accessToken)

curl -X POST https://api.landfalls.ai/o/<your-org>/triggers/ingest-token \
  -H "Authorization: Bearer $SESSION"

2. Post the source trigger payload

From your service, when a condition worth a war room fires, post this body. Only landfallSource, connectionId, title and severity are required:

Terminal · Worked example
curl -i -X POST https://api.landfalls.ai/triggers \
  -H "Authorization: Bearer <your ingest token>" \
  -H "Content-Type: application/json" \
  -d '{
    "landfallSource": "remote",
    "connectionId": "acme-metrics",
    "title": "checkout p99 > 2s",
    "severity": "sev2",
    "occurredAt": "2026-09-06T18:00:00Z",
    "entityHints": ["service:checkout"],
    "dedupKey": "checkout-p99-2026-09-06",
    "summary": "p99 latency on /checkout has been above 2s for 5 minutes",
    "url": "https://alerts.example.internal/checkout-p99",
    "kind": "trigger"
  }'

Opens an incident titled checkout p99 > 2s at sev2, attributed to the remote connection acme-metrics, with checkout as the affected service.

Payload fields

FieldMeaning
landfallSourceAlways "remote". This is how Landfall recognizes the shape; required.
connectionIdThe remote source connection this alert belongs to; required. Becomes the incident's provenance (remote:<connectionId>).
titleThe incident title; required.
severityOne of sev1, sev2, sev3, sev4; required and used verbatim. No mapping, no default borrowed from another source.
occurredAtRFC 3339 timestamp of the condition; defaults to receipt time.
entityHintsStrings such as service:checkout or host:web-3, used to attach the affected entity. Optional.
dedupKeyYour own stable identifier for this alert. With it, a repeat notification attaches to the open room instead of opening a second one; without it, Landfall derives a key from the body's content.
summaryAppended to the incident's summary line as context. Optional.
urlA link back to the alert in your own system, kept on the incident's external reference. Optional.
kind"trigger" (default) or "recovery"; see below.

Dedup and recovery

The dedupKey is the alert's identity. Landfall decides one alert at a time against the rooms that are still open: a first trigger opens a room, a repeat trigger with the same key attaches to it as a repeat, and a body with kind: "recovery" and the same key is recorded on the open room as a fact. The room stays open: a service saying its alert stopped is not the same as the incident being over, and resolving is a person's decision. A recovery for an alert with no open room is accepted and does nothing. Once a person resolves the room, the next trigger with the same key is a new situation and opens a new room.

Attribution to the connection

Before an incident is opened, Landfall looks up the named connection in your organization: it must exist, be installed in the marketplace for this organization, and have passed its last health check. When it does, the incident's provenance badge names the remote connection, its severity basis records remote connection=<id> severity=<sev>, and the investigation that starts already has that connection in its signal catalog. A payload is never attributed to a different source by fallback.

When a payload is refused

What you seeWhat it means
401The ingest token is missing, malformed, or no longer current. Minting a new token invalidates the previous one. The refusal is uniform: it does not say which.
422Either the body matched none of the known shapes (check landfallSource is exactly "remote" and the four required fields are present), or the named connection does not exist in this organization, is uninstalled, or is not currently connected. No incident is created; the rejection is recorded in the audit trail with its reason.
Two incidents for one alertYour service sent two different dedupKey values, or none (a derived key changes with the body). Send a stable key per alert.

Reference

EndpointPOST https://api.landfalls.ai/triggers
AuthAuthorization: Bearer <ingest token> identifies the organization directly; there is no org path parameter
Mint a tokenPOST https://api.landfalls.ai/o/<your-org>/triggers/ingest-token
Recognized bylandfallSource: "remote", checked after every other shape on this endpoint
Incident provenanceremote:<connectionId>
DedupBy dedupKey (or a content-derived key): open, attach, record recovery, ignore
Rejected payloads422, no incident created, audited with the reason; a missing or invalid token is a uniform 401