Inbound webhooks (third-party systems → Causeloop, HMAC-verified) and outbound webhooks (Causeloop → your systems, signed). Includes signature verification code examples.
Causeloop has two directions of webhook traffic:
Inbound — a third-party system posts events to Causeloop. Causeloop verifies the HMAC signature and ingests the payload.
Outbound — Causeloop posts events to your endpoint when something happens (sync completed, issue ingested, pattern detected). Your endpoint verifies the signature.
Inbound webhooks let any system push events directly into Causeloop without polling. The endpoint authenticates callers via HMAC-SHA256 — there is no Bearer token. The endpoint fails closed: a missing or invalid signature always returns 401.
When you configure an inbound webhook for a connector, Causeloop generates a signing_secret (e.g. whsec_a1b2c3...). Store it securely in your source system.
2
Sign the raw body
Before sending, compute HMAC-SHA256(signing_secret, raw_body) and include the hex digest in the x-causeloop-signature header.
3
Causeloop verifies
Causeloop buffers the raw request bytes (before any JSON parsing), recomputes the HMAC using the stored secret, and compares with a constant-time comparison. A mismatch, missing signature, or missing secret all return 401.
The HMAC is computed over the raw bytes of the request body. Do not parse, pretty-print, or re-serialize the JSON before signing — the byte sequence must be identical to what Causeloop receives.
To enable inbound delivery for a connector, create an outbound webhook record that references the connector. Causeloop auto-generates the signing secret:
Outbound webhooks let Causeloop notify your systems when events occur. Causeloop signs every delivery with x-causeloop-signature. You verify the signature on your end before processing.
Always use a constant-time comparison (hmac.compare_digest in Python, crypto.timingSafeEqual in Node). Standard string equality is vulnerable to timing attacks.
# List all webhooksGET /v1/webhooks# Update a webhookPATCH /v1/webhooks/{id} # fields: url, event_types, enabled, description# Delete a webhookDELETE /v1/webhooks/{id}
Required scopes: webhooks:read for GET endpoints, webhooks:admin for POST/PATCH/DELETE.