Overview and configuration
Webhooks are configured per organisation by the Adclear team during onboarding.
Delivery:
- Sent as
application/jsonviaPOST. - Treat delivery as at-least-once and best-effort. Acknowledge quickly with
2xx, then process asynchronously. - Deduplicate lifecycle events on
deliveryId. Deduplicateevaluation-completedonevaluationId.
Common lifecycle envelope
The five review lifecycle events share this envelope.evaluation-completed keeps its existing flat payload (documented below).
Lifecycle data fields
Signature verification
Every request includes anX-Webhook-Signature header: an HMAC-SHA256 hex digest of the raw request body, prefixed with sha256=. Verify it before processing the payload. Use the raw bytes, not a re-serialised object.
Headers on every webhook:
Evaluation payload reference
evaluation-completed uses the legacy payload shape below (not the lifecycle envelope). It may include routing metadata such as organizationId and workspaceId.
Example:
Issue fields
Reply to an issue
Comment-backed issues normally include acommentId: the ID of the root comment that anchors the issue’s thread. Send it as parentCommentId when importing a reply with POST /v1/promotions/{promotionId}/versions/{versionId}/comments. Your reply threads onto the issue instead of creating a new thread.
Two caveats:
- Treat
commentIdas optional. A replayed delivery may omit it. When it is absent, resolve the thread with Get comments instead. - Comment indexing is asynchronous. If a reply sent immediately after the webhook is rejected with
PARENT_NOT_FOUND, wait briefly and retry.
Recovery endpoints
If a lifecycle webhook is missed, read current authoritative state from the Public API. These endpoints return the latest state, not a replay of missed events.Endpoint requirements
For cross-cutting errors (401, 403, 429, 502), see Errors & rate limits.