Store a completed voicemail recording
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"call_sid": "5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c",
"duration": 12.4,
"recording_url": "https://recordings.jambonz.example/vm-5f9c3b1a.wav",
"size": 98304
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store"
payload = {
"call_sid": "5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c",
"duration": 12.4,
"recording_url": "https://recordings.jambonz.example/vm-5f9c3b1a.wav",
"size": 98304
}
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({
call_sid: '5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c',
duration: 12.4,
recording_url: 'https://recordings.jambonz.example/vm-5f9c3b1a.wav',
size: 98304
})
};
fetch('https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store', 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.orbit.devotel.io/api/v1/jambonz/voicemail-store",
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([
'call_sid' => '5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c',
'duration' => 12.4,
'recording_url' => 'https://recordings.jambonz.example/vm-5f9c3b1a.wav',
'size' => 98304
]),
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.orbit.devotel.io/api/v1/jambonz/voicemail-store"
payload := strings.NewReader("{\n \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\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.orbit.devotel.io/api/v1/jambonz/voicemail-store")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store")
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 \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\n}"
response = http.request(request)
puts response.read_body[]API Reference
Store a completed voicemail recording
Internal jambonz record action-hook. jambonz calls this once a voicemail recording finishes (the caller pressed #, the silence timeout fired, or the maximum length was reached). The handler downloads the recording from the provider URL, stores it, transcribes it, attaches the audio and transcript to the matching call log, and dispatches the CALL_RECORDING_READY webhook. Signed with the jambonz webhook HMAC and not intended for direct client use. Always acknowledges with an empty verb array so the call hangs up cleanly.
POST
/
api
/
v1
/
jambonz
/
voicemail-store
Store a completed voicemail recording
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"call_sid": "5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c",
"duration": 12.4,
"recording_url": "https://recordings.jambonz.example/vm-5f9c3b1a.wav",
"size": 98304
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store"
payload = {
"call_sid": "5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c",
"duration": 12.4,
"recording_url": "https://recordings.jambonz.example/vm-5f9c3b1a.wav",
"size": 98304
}
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({
call_sid: '5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c',
duration: 12.4,
recording_url: 'https://recordings.jambonz.example/vm-5f9c3b1a.wav',
size: 98304
})
};
fetch('https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store', 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.orbit.devotel.io/api/v1/jambonz/voicemail-store",
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([
'call_sid' => '5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c',
'duration' => 12.4,
'recording_url' => 'https://recordings.jambonz.example/vm-5f9c3b1a.wav',
'size' => 98304
]),
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.orbit.devotel.io/api/v1/jambonz/voicemail-store"
payload := strings.NewReader("{\n \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\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.orbit.devotel.io/api/v1/jambonz/voicemail-store")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/jambonz/voicemail-store")
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 \"call_sid\": \"5f9c3b1a-2d4e-4f6a-8b0c-1e2d3f4a5b6c\",\n \"duration\": 12.4,\n \"recording_url\": \"https://recordings.jambonz.example/vm-5f9c3b1a.wav\",\n \"size\": 98304\n}"
response = http.request(request)
puts response.read_body[]Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Body
application/json
Response
200 - application/json
Acknowledged. Returns an empty jambonz verb array so the call ends cleanly once the recording is queued for processing.
⌘I