StatusDashboard
WebhooksInbound

Ingest inbound webhook

Create or update an incident via a signed public webhook request.

View Markdown

POST /public/webhooks/inbound

Accepts a signed JSON payload to trigger (create) or update an incident. Processing is asynchronous — a 200 response means the request was queued. Check inbound webhook logs for the final processed or processing_failed outcome.

Requires a valid webhook signing key (see Create webhook key). The organization must have the integrations feature enabled.

Authentication uses HMAC headers — not a Bearer token. See the Inbound Webhooks platform guide for signature format and examples.


Request headers

HeaderRequiredDescription
Content-TypeYesapplication/json
X-SD-Key-IdYesWebhook key ID (e.g. wk_a1b2c3d4e5f6a7b8)
X-SD-SignatureYest=<unix_seconds>,v1=<hmac_sha256_hex>
X-SD-Idempotency-KeyNoOptional dedupe key for action: "trigger" (must match idempotencyKey in the body when both are sent)

Request body

Discriminated union on action.

action: "trigger" — create incident

FieldTypeRequiredDescription
action"trigger"YesCreate operation
titlestringYes1–250 characters
descriptionstringYes1–5000 characters
impactAnalysisstringNoOptional customer and service impact details. Rich text field. See Rich text fields. Max 5,000 characters.
severitystringYesEvent-level severity label
componentIdsstring[] (UUID)Yes1–20 affected component IDs
statusLabelstringNoInitial workflow phase
initialMessagestringNoFirst timeline message
idempotencyKeystringNoOptional dedupe key for this trigger (see platform guide)
notificationsbooleanNoDefault true
segmentNotificationobjectNoSegment targeting (requires segments feature)
attributesarrayNoCustom attributes

action: "update" — advance incident

impactAnalysis is not accepted on update actions. Set it on trigger, or use PATCH /app/events/{id} to change it later.

FieldTypeRequiredDescription
action"update"YesUpdate operation
eventIdstring (UUID)YesEvent to update
statusLabelstringYesWorkflow phase to advance to
messagestringYesTimeline message (1–5000 characters)
notificationsbooleanNoToggle notifications on the event
segmentNotificationobjectNoUpdate segment targeting
attributesarrayNoReplace attributes

Sample request

TS=$(date +%s)
BODY='{"action":"trigger","title":"API errors","description":"Elevated 5xx","severity":"Major Outage","componentIds":["b2c3d4e5-f6a7-8901-bcde-f12345678901"],"notifications":true}'
SIG=$(echo -n "${TS}.${BODY}" | openssl dgst -sha256 -hmac "$SD_SIGNING_SECRET" | awk '{print $2}')

curl -X POST https://api.statusdashboard.com/public/webhooks/inbound \
  -H "Content-Type: application/json" \
  -H "X-SD-Key-Id: $SD_KEY_ID" \
  -H "X-SD-Signature: t=${TS},v1=${SIG}" \
  -d "$BODY"

Sample response

Status: 200 OK (queued)

{ "ok": true }

Status: 400 Bad Request (schema validation)

{ "error": "..." }
Authentication failures return 200 { "ok": true } intentionally. If events are not appearing, verify your Key ID, signing secret, and webhook logs.

Error responses

StatusWhen
200Request accepted and queued ({ "ok": true }). Also returned for some authentication failures by design — check inbound webhook logs for outcomes.
400JSON parse failure, schema validation error, or semantic rejection before queueing.
429Organization inbound rate limit exceeded (logged as rate_limited when authenticated).

On this page

We use cookies

We use essential cookies to keep the site working, and optional analytics cookies to understand how it's used. Read our Privacy Policy.