Opening a war room from a Cortex XDR incident
This page is about opening incidents automatically the moment Cortex XDR's own outbound webhook fires. It is not about reading telemetry; if you want the investigation agent to query your Cortex XDR alerts/incidents once an incident already exists, see Connecting Cortex XDR instead. The two are independent, and most teams eventually set up both.
How it works
Unlike Datadog, Coralogix, CloudWatch, or Sentry — which all share one endpoint authenticated by a single bearer ingest token — Cortex XDR signs every webhook delivery it sends with an HMAC-SHA256 signature, using a secret configured in Cortex XDR's own notification settings. Landfall verifies that signature per organization, the same dedicated verification mode PagerDuty and GitHub's webhooks already use. This is a deliberate design choice, not an oversight: Cortex XDR's own incident objects carry a tags field, which would collide with Datadog's own detector on the shared endpoint if Cortex XDR were placed there — using its own signed, per-organization route avoids that collision structurally rather than by careful ordering.
What you'll need
- An admin seat on your Landfall organization, to set the Cortex XDR webhook signing secret.
- Admin access to Cortex XDR's own Settings → Configurations → Integrations → External Applications area.
- A Cortex XDR connection already saved in Landfall (see Connecting Cortex XDR) — the same connection panel holds the webhook signing secret field.
1. Set a webhook signing secret
In Landfall, open Settings → Integrations → Cortex XDR and fill in the Webhook signing secret field with any secret value you choose (Cortex XDR does not generate one for you) — this is the same shared secret both sides will use to sign/verify deliveries, matching how PagerDuty's own webhook signing secret works.
2. Point Cortex XDR at Landfall
In Cortex XDR, add a new webhook-forwarding External Application pointed at your organization's own trigger URL:
| Menu path | Cortex XDR → Settings → Configurations → Integrations → External Applications → Add Application → Webhook |
|---|---|
| Webhook URL | https://api.landfalls.ai/triggers/cortex-xdr/<your-org-slug> |
| Signing secret | The same value you pasted into Landfall's connection panel in step 1 |
Cortex XDR signs every delivery with X-XDR-HMAC-SHA256 — an HMAC-SHA256 of the exact request body, using the secret above. Landfall verifies this signature before ever looking at the body's shape; an unsigned or wrongly-signed delivery is refused with the same uniform 401 every other signed-webhook source in Landfall returns, with no hint about which organization it was addressed to.
What Cortex XDR's fields become
| Cortex XDR field | Becomes |
|---|---|
| incident_id | The attach identity — a repeat delivery for the same incident attaches rather than opening a duplicate. |
| name / incident_name | The incident title. Falls back to "Cortex XDR incident <id>" if neither is present. |
| severity | critical → sev1, high → sev2, medium → sev3, everything else (low, informational, unstated) → sev4. |
| creation_time | The incident's occurrence time (epoch milliseconds). |
| status | A resolved/closed-family status maps this delivery to a recovery rather than a fresh trigger. |
| alert_sources | Carried as entity hints for the incident's provenance. |
| xdr_url | A click-through link back to the incident in Cortex XDR, when present. |
Every field besides incident_id is optional in the mapping: a wrong field-presence assumption degrades to "field absent, hint not derived" rather than a rejected delivery.
3. Test it
Cortex XDR's own webhook-forwarding settings don't offer a built-in test-payload button, so the fastest check is signing and posting a realistic body yourself:
BODY='{
"incident_id": "7",
"creation_time": 1700000000000,
"severity": "high",
"status": "new",
"description": "Suspicious PowerShell execution",
"alert_count": 3,
"alert_sources": ["XDR Agent"]
}'
SIGNATURE=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "<your webhook signing secret>" | sed 's/^.* //')
curl -i -X POST https://api.landfalls.ai/triggers/cortex-xdr/<your-org-slug> \
-H "X-XDR-HMAC-SHA256: $SIGNATURE" \
-H "Content-Type: application/json" \
-d "$BODY"Opens an incident titled Cortex XDR incident 7 at sev2 (from high), category suggested security.
Troubleshooting
| What you see | What it means |
|---|---|
| 401 | The signature is missing, malformed, doesn't match the configured secret, or the organization slug in the URL is unrecognized — all return the identical uniform response, by design, so the endpoint cannot be used to enumerate which organizations exist. |
| 422 | The signature verified, but the body carried neither incident_id nor creation_time — not a Cortex XDR incident-notification shape Landfall recognizes. |
| Signature always fails | Confirm the secret pasted into Landfall's connection panel and the one configured in Cortex XDR's webhook settings are byte-for-byte identical, with no trailing whitespace. |
| A repeat notification opens a second incident instead of attaching | Should not happen — the same incident_id always attaches. If it does, check whether Cortex XDR is sending a different incident_id for what looks like the same underlying detection. |
Reference
| Endpoint | POST https://api.landfalls.ai/triggers/cortex-xdr/<org-slug> |
|---|---|
| Auth | X-XDR-HMAC-SHA256: <hex digest> — an HMAC-SHA256 of the raw request body, keyed by your organization's Cortex XDR webhook signing secret; not the shared bearer ingest token |
| Set the secret | Settings → Integrations → Cortex XDR → Webhook signing secret |
| Category | Every Cortex XDR-sourced incident is auto-suggested security |
| Each delivery | Attaches to the existing incident for the same incident_id, or opens a new one |
| Rejected payloads | 422 after a verified signature with no recognizable shape, no incident created; an unsigned or wrongly-signed request is a uniform 401 |