Webhooks are signed, retried, observable and revalidated against DNS before every delivery.
The target must use HTTPS on port 443 and resolve only to public addresses. Redirects, private ranges, Ceyu-owned hosts and unsafe CNAME chains are rejected. The URL must return 2xx to the verification probe.
Read the exact raw body, verify Ceyu-Signature with the one-time secret, enforce the default five-minute tolerance, then parse JSON. Keep both secrets during the 24-hour rotation overlap.
await verifyWebhookSignature({
rawBody,
signature: request.headers.get("Ceyu-Signature") ?? "",
secret: process.env.CEYU_WEBHOOK_SECRET,
});
Return 2xx quickly and move slow work to a queue. The Events view and GET /v1/events/{id} show bounded response excerpts, timing and error codes for every attempt. Resend a retained event with POST /v1/events/{id}/resend.
Enable exclude_own_events when an integration writes changes back to Ceyu. Also retain event IDs idempotently so a retried delivery never applies the same external change twice.