Skip to main content
Register a hook with POST /hooks to receive events at your service’s HTTPS endpoint. Each hook subscribes to one event type. Your handler checks the change and decides what to do next.

Event types

A request that changes both fields emits one event of each type. Setting a field to its existing value does not emit an event.

Payload

Use GET /vulnerabilities/{id} when your handler needs the current vulnerability, and GET /evidence?vulnerabilityId={id} for its supporting files.

Verify a delivery

Creating a webhook returns a signing secret once. Store it in your receiving service. Each delivery includes these headers:
The signature is an HMAC-SHA256 of the timestamp, a period, and the raw request body. Use the signing secret exactly as returned, encoded as UTF-8:
Verify the signature before parsing or acting on the event. Compare it using a constant-time comparison, and reject timestamps more than five minutes from your service’s current time. Each retry gets a fresh delivery timestamp and signature while retaining the original event ID and payload. Do not reserialize the JSON before verification. Whitespace or field-order changes alter the signed bytes.

Acknowledge and process

Return a 2xx response within 10 seconds after durably accepting the event. Queue work that takes longer, such as launching an agent, and process it separately. Timeouts and non-2xx responses are retried for up to 24 hours. Delivery can occur more than once, so record the event ID and avoid repeating work for an event you have already accepted. Events may arrive out of order; retrieve the vulnerability’s current state before acting when your workflow depends on it. For example, a remediation handler can check that the current assignee still matches its agent before launching a run.

Default hooks

GET /hooks includes the built-in triage, remediation, and verification hooks. They have builtIn: true and no public webhook destination. Use PATCH /hooks/remediation with {"enabled": false} to disable the default remediation hook when replacing that workflow. Custom webhooks work alongside defaults unless you disable them. See Assigning to your own agents for choosing which workflow to replace.