Skip to main content
Register a URL once and LumisReach POSTs to it as calls happen on your numbers:
  • call.started when a call begins: who is calling (or who you called), which of your numbers, and their contact record.
  • call.ended once the call is over and its transcript is saved: the same details plus how long it lasted, why it ended, and the full transcript, as plain text and turn by turn.
Covers inbound and outbound AI calls on every number on your account, whichever carrier it runs on.

1. Register your endpoint

The response includes a secret (whsec_…). It is shown only once: store it now, you need it to verify deliveries. Lost it? Delete the webhook and create a new one. A workspace can have up to 25 call webhooks. GET /v1/voice/calls/webhooks lists them and DELETE /v1/voice/calls/webhooks/{id} removes one.

2. Receive call.started

contact is the other party’s contact record (the caller on an inbound call, the person you called on an outbound one), or null if you don’t have one for that number yet.

3. Receive call.ended, with the transcript

Call fields have the same names as in GET /v1/history/calls, so you can store a call.ended payload and a history item the same way. call.ended does not include the recording: it is usually still being saved when the call ends. Fetch it later from GET /v1/history/calls/{id}/recording. The AI summary and tags are also filled in shortly after the call; read them from GET /v1/history/calls/{id}. Respond with any 2xx within 10 seconds.

4. Verify the signature

X-LumisReach-Signature-256 is the hex HMAC-SHA256 of the raw request body, keyed with your webhook secret. It is the same scheme every LumisReach webhook uses, including inbound SMS webhooks.
Compute it over the body exactly as received, before any JSON parsing.

Retries

The first delivery is made right away. If your server errors, times out, or returns a non-2xx (redirects are not followed), it is retried 3 more times: after 1, 5 and 30 minutes. Every attempt is recorded in the webhook delivery log in your dashboard, where webhooks you register here also appear.

Test it

POST /v1/voice/calls/webhooks/{id}/test sends a sample, correctly signed call.ended event (or call.started, if that is the only event the webhook listens for) with "test": true, and tells you how your server responded.