call.startedwhen a call begins: who is calling (or who you called), which of your numbers, and their contact record.call.endedonce 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.
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.
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.