curl --request POST \
--url https://api.lumisreach.com/api/v1/voice/calls/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"events": [],
"phone_number_id": 0,
"description": "<string>"
}
'import requests
url = "https://api.lumisreach.com/api/v1/voice/calls/webhooks"
payload = {
"url": "<string>",
"events": [],
"phone_number_id": 0,
"description": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>', events: [], phone_number_id: 0, description: '<string>'})
};
fetch('https://api.lumisreach.com/api/v1/voice/calls/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lumisreach.com/api/v1/voice/calls/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'events' => [
],
'phone_number_id' => 0,
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lumisreach.com/api/v1/voice/calls/webhooks"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lumisreach.com/api/v1/voice/calls/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lumisreach.com/api/v1/voice/calls/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"url": "<string>",
"description": "<string>",
"active": true,
"phone_number_id": 123,
"phone_number": "<string>",
"events": [
"call.started"
],
"created_at": "<string>",
"secret": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}Create a call webhook
Registers an HTTPS URL that LumisReach POSTs to when a call on one of your numbers (or only phone_number_id, if given) starts (call.started) and when it ends (call.ended). call.ended is sent once the call’s transcript is saved and carries the full transcript, as plain text and turn by turn. Covers inbound and outbound AI calls on both voice stacks. Each delivery is signed with X-LumisReach-Signature-256 (hex HMAC-SHA256 of the raw body, keyed with the secret returned here once). A delivery that fails or gets a non-2xx response is retried 3 times over about 36 minutes.
curl --request POST \
--url https://api.lumisreach.com/api/v1/voice/calls/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"events": [],
"phone_number_id": 0,
"description": "<string>"
}
'import requests
url = "https://api.lumisreach.com/api/v1/voice/calls/webhooks"
payload = {
"url": "<string>",
"events": [],
"phone_number_id": 0,
"description": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>', events: [], phone_number_id: 0, description: '<string>'})
};
fetch('https://api.lumisreach.com/api/v1/voice/calls/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lumisreach.com/api/v1/voice/calls/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'events' => [
],
'phone_number_id' => 0,
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.lumisreach.com/api/v1/voice/calls/webhooks"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.lumisreach.com/api/v1/voice/calls/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lumisreach.com/api/v1/voice/calls/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"events\": [],\n \"phone_number_id\": 0,\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"url": "<string>",
"description": "<string>",
"active": true,
"phone_number_id": 123,
"phone_number": "<string>",
"events": [
"call.started"
],
"created_at": "<string>",
"secret": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {},
"doc_url": "<string>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
UUID — when present, deduplicates repeat submissions. See /api-reference/idempotency.
Body
HTTPS endpoint that receives a POST for every call event
2048Which events to send. Defaults to both call.started and call.ended.
1call.started, call.ended Only calls on this number (id from GET /v1/phone-numbers). Omit for all your numbers.
-9007199254740991 <= x <= 9007199254740991A label for the webhook
100Response
Success
Show child attributes
Show child attributes