Skip to main content

Payload shape

Every webhook is an HTTP POST 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:
  • BearerAuthorization: Bearer <token>
  • Basic — HTTP Basic credentials
  • Custom headers — applied as-is to every request
Configure this when you create the REST API connection used as the subscription’s Connection. See Add a REST API integration.
Champ does not currently sign webhook payloads — there is no HMAC or X-Signature header. Use bearer-token or basic auth on the destination connection to verify that a request actually came from Champ, and restrict your handler to that credential.

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 plus eventdata.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’s workflow_id (data.workflow_run.workflow_id or data.case.workflow_id) inside your handler rather than trying to scope the subscription itself.