Payload shape
Every webhook is an HTTPPOST with Content-Type: application/json. The body shape depends on the event family — workflow run events carry data.workflow_run; case events carry data.case.
Workflow run events
workflow_run.completed and workflow_run.failed carry the run that fired them:
Case events
case.closed and case.error carry the case whose status changed:
For workflows with restricted data handling, any case attribute marked sensitive is delivered as
"[redacted]";
the subject is always sent in the clear. See PHI & HIPAA.Authentication
Champ applies the authentication configured on the destination’s REST API connection to every delivery:- Bearer —
Authorization: Bearer <token> - Basic — HTTP Basic credentials
- Custom headers — applied as-is to every request
Retries
Failed deliveries retry automatically:
After 10 failed attempts, the event is marked
failed and no further attempts are made. You can see which events failed and inspect the last response on the Webhooks page; there is no manual retry button today.
Handling events
Respond quickly
Return a 2xx response as soon as possible. Don’t do heavy work inside the request handler — enqueue the payload for background processing and acknowledge immediately. A slow handler risks hitting the 30-second read timeout and being retried as a failure.Be idempotent
Because Champ retries until it gets a 2xx, the same payload can arrive more than once. Deduplicate on the resource id plusevent — data.workflow_run.id for run events, data.case.id for case events (a run could fire both completed and failed in rare recovery cases — treat them as distinct keys).
Switch on event type
Filter by workflow
Subscriptions are tenant-wide. If you only care about specific workflows, filter by the payload’sworkflow_id (data.workflow_run.workflow_id or data.case.workflow_id) inside your handler rather than trying to scope the subscription itself.
