Webhooks push delivery and engagement events from intouch to your endpoint as they happen — signed with HMAC-SHA256, retried up to six times with backoff — so your systems stay current without polling traceTransactionId. This page covers registering endpoints, verifying signatures, and the handler behaviour that survives real-world failure.
Last reviewed: 22 August 2026.
Webhook endpoints are managed through the API itself:
| Endpoint | Action |
|---|---|
| POST /partners/{partner_id}/webhooks | Register a new endpoint |
| GET /partners/{partner_id}/webhooks | List registered endpoints |
| PATCH /partners/{partner_id}/webhooks/{webhook_id} | Update URL/config |
| DELETE /partners/{partner_id}/webhooks/{webhook_id} | Remove an endpoint |
Your endpoint must be HTTPS and should return a 2xx quickly — do the real processing async (queue the payload, ack immediately). Anything else is treated as a delivery failure and retried.
Every delivery is signed with HMAC-SHA256 using your webhook secret. Verify before trusting the payload:
const crypto = require("crypto");
function verify(rawBody, signatureHeader, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}Two rules that prevent the classic verification bugs: compute the HMAC over the raw request body bytes (not the re-serialised JSON — key ordering will burn you), and use a constant-time comparison.
Failed deliveries (non-2xx, timeout, connection refused) are retried up to 6 attempts with 30-second backoff. Design consequences:
The commercial overview of the webhook/API product sits at /products/api-webhook-integration; the API overview covers auth and the endpoints these events originate from.