---
title: "Draft approval events (held, approved, rejected, hold_expired) — opt-in per endpoint"
method: POST
path: "holdEvent"
---

# Draft approval events (held, approved, rejected, hold_expired) — opt-in per endpoint

`POST holdEvent` (webhook)

## Headers

- `x-oveyon-event` string, required
- `x-oveyon-timestamp` integer, required
- `x-oveyon-signature` string, required

## Payload

- object
  - `event` 'held' | 'approved' | 'rejected' | 'hold_expired'
  - `messageId` string, uuid
  - `recipient` string
  - `status` string: frozen while held; queued after approval; failed after reject/expiry.
  - `detail` object
    - `hold` object
      - `note` string, nullable
      - `requestedBy` string, nullable
      - `expiresAt` string, date-time
      - `decidedAt` string, nullable
      - `decidedBy` string, nullable
      - `reason` string, nullable
      - `url` string: GET /v1/messages/{id} — the body is not in the webhook; the agent already has what it sent.
  - `timestamp` string, date-time

## Acknowledgement `200`

Answer 2xx fast.

---

[API](https://skmtc.dev/oveyon/apis/oveyon-api.md) · [All operations](https://skmtc.dev/oveyon/apis/oveyon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oveyon/apis/oveyon-api/revisions/abf64c09d297?raw)
