> ## Documentation Index
> Fetch the complete documentation index at: https://developer.keverd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Optional signed delivery after verify

# Webhooks

Sync `verify()` is enough for most apps. Use webhooks to **push** the same decision to another service.

## Setup

1. Dashboard → **Integrate → Webhooks**
2. Add an HTTPS URL (test or live)
3. Copy the signing secret (`whsec_…`) once
4. Subscribe to `verification.completed`

Fires after a successful server **`POST /v2/verify`** for matching environment keys.

## Envelope

```json theme={null}
{
  "id": "evt_…",
  "type": "verification.completed",
  "created": 1710000000,
  "data": {
    "object": {
      "event_id": "…",
      "action": "allow",
      "risk_score": 12,
      "reasons": []
    }
  }
}
```

`data.object` matches the `verify()` response.

## Signature

```text theme={null}
X-Keverd-Signature: t=<unix_seconds>,v1=<hmac_sha256_hex>
```

Also sent: `X-Keverd-Event`, `X-Keverd-Delivery`.

Signed string: `{t}.{raw_request_body}`<br />HMAC-SHA256 with `whsec_…`, hex digest. Reject if timestamp older than **300 seconds**.

<Warning>
  Verify the signature against the **raw body**. Do not parse JSON before verifying.
</Warning>

Use `constructEvent` / `construct_event` in the [Node](/server/node), [Python](/server/python), or [PHP](/server/php) SDKs.
