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

# Webhooks

> User webhook delivery in 0.12.x — delivery is proven in production; the delivery-history surface is not.

<Warning>
  **Delivery works; the delivery *history* does not.** A production walk on 2026-07-19 (v0.12.15)
  delivered `meeting.status_change`, `meeting.completed` and `bot.failed` to an external
  `webhook.site` endpoint — the receiver's inbox and meeting-api's own delivery-outcome log matched
  one-for-one at `code=200`. What is still broken is the user-facing **Delivery History**, which
  reads a store those deliveries were never written to and so shows none of them
  ([#841](https://github.com/Vexa-ai/vexa/issues/841), open). Deliveries now succeed *silently* —
  the exact inversion of [#815](https://github.com/Vexa-ai/vexa/issues/815), where they failed silently.
</Warning>

## What exists in code

* Self-serve configuration (`PUT /user/webhook`): URL, secret, and event selection, with the
  secret masked on read-back.
* The `webhook.v1` delivery module: HMAC-signed payloads with a retry queue.

**Don't have a key yet?** Hosted: sign in at [vexa.ai/signin](https://vexa.ai/signin) with a Google
account and copy your key from [your account page](https://vexa.ai/account) — free credit, no card
required. Self-hosted: `make all` prints a key when the stack comes up.

## What is proven, and what is not

* **Live delivery — proven.** Owner-witnessed production walk, 2026-07-19: POSTs arrived at an
  external `webhook.site` inbox from production IPs, one per walk event, matched one-for-one by
  meeting-api's delivery-outcome log at `code=200`.
* **Delivery History — broken.** The user-facing history reads a store real deliveries were never
  written to, so it lists none of them ([#841](https://github.com/Vexa-ai/vexa/issues/841), open).
  Do not read an empty history as "nothing was delivered."
* **CI does not exercise the network leg.** The module and eval tests drive the real `WebhookSink`
  against a fake in-memory receiver, so a regression in the transport itself would not be caught
  by tests — only by another live walk.
* **No settings UI** — configuration is API-only (`PUT /user/webhook`).
* Exactly-once emission ([#519](https://github.com/Vexa-ai/vexa/issues/519)) and outage-durable
  retry ([#520](https://github.com/Vexa-ai/vexa/issues/520)) both closed as completed in July.

The live status row for this feature is maintained on [Roadmap → Status](/roadmap/status).
