curl --request POST \
--url https://api.orbit.devotel.io/api/v1/voice/call-escalation/video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"callSid": "<string>",
"callLogId": "<string>",
"remotePartyNumber": "<string>",
"remotePartyName": "<string>",
"roomName": "<string>",
"notifyRemoteParty": false,
"sipCredentialId": "<string>"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/voice/call-escalation/video"
payload = {
"callSid": "<string>",
"callLogId": "<string>",
"remotePartyNumber": "<string>",
"remotePartyName": "<string>",
"roomName": "<string>",
"notifyRemoteParty": False,
"sipCredentialId": "<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({
callSid: '<string>',
callLogId: '<string>',
remotePartyNumber: '<string>',
remotePartyName: '<string>',
roomName: '<string>',
notifyRemoteParty: false,
sipCredentialId: '<string>'
})
};
fetch('https://api.orbit.devotel.io/api/v1/voice/call-escalation/video', 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/voice/call-escalation/video",
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([
'callSid' => '<string>',
'callLogId' => '<string>',
'remotePartyNumber' => '<string>',
'remotePartyName' => '<string>',
'roomName' => '<string>',
'notifyRemoteParty' => false,
'sipCredentialId' => '<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.orbit.devotel.io/api/v1/voice/call-escalation/video"
payload := strings.NewReader("{\n \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<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.orbit.devotel.io/api/v1/voice/call-escalation/video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/voice/call-escalation/video")
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 \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"call_sid": "<string>",
"room_id": "<string>",
"room_sid": "<string>",
"host": {
"token": "<string>",
"ws_url": "<string>",
"identity": "<string>"
},
"guest": {
"invite_token": "<string>",
"join_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
},
"remote_party_notification": "sent"
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Escalate voice call to video
Elevates a live voice call into a video room (“move to video”). Creates a room stamped with the originating call SID, returns the agent’s host join token and media URL, and issues a public guest invite link for the remote party. Optionally delivers that link to the remote party by SMS. Returns 201.
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/voice/call-escalation/video \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"callSid": "<string>",
"callLogId": "<string>",
"remotePartyNumber": "<string>",
"remotePartyName": "<string>",
"roomName": "<string>",
"notifyRemoteParty": false,
"sipCredentialId": "<string>"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/voice/call-escalation/video"
payload = {
"callSid": "<string>",
"callLogId": "<string>",
"remotePartyNumber": "<string>",
"remotePartyName": "<string>",
"roomName": "<string>",
"notifyRemoteParty": False,
"sipCredentialId": "<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({
callSid: '<string>',
callLogId: '<string>',
remotePartyNumber: '<string>',
remotePartyName: '<string>',
roomName: '<string>',
notifyRemoteParty: false,
sipCredentialId: '<string>'
})
};
fetch('https://api.orbit.devotel.io/api/v1/voice/call-escalation/video', 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/voice/call-escalation/video",
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([
'callSid' => '<string>',
'callLogId' => '<string>',
'remotePartyNumber' => '<string>',
'remotePartyName' => '<string>',
'roomName' => '<string>',
'notifyRemoteParty' => false,
'sipCredentialId' => '<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.orbit.devotel.io/api/v1/voice/call-escalation/video"
payload := strings.NewReader("{\n \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<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.orbit.devotel.io/api/v1/voice/call-escalation/video")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/voice/call-escalation/video")
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 \"callSid\": \"<string>\",\n \"callLogId\": \"<string>\",\n \"remotePartyNumber\": \"<string>\",\n \"remotePartyName\": \"<string>\",\n \"roomName\": \"<string>\",\n \"notifyRemoteParty\": false,\n \"sipCredentialId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"call_sid": "<string>",
"room_id": "<string>",
"room_sid": "<string>",
"host": {
"token": "<string>",
"ws_url": "<string>",
"identity": "<string>"
},
"guest": {
"invite_token": "<string>",
"join_url": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
},
"remote_party_notification": "sent"
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Authorizations
Dashboard JWT token from Clerk
Headers
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.
1 - 255Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.
true, false Body
The live call leg being elevated. Stamped onto the created room so it stays traceable back to the originating call.
1 - 128Optional call-log identifier, used to correlate the room back to the originating call.
1 - 64E.164 number of the remote leg — used for room naming and, when notifyRemoteParty is true, the SMS notification destination.
32^\+?[0-9]*$Display name of the remote leg (shown in the generated room name when present).
120Optional override for the created room's name (defaults to Call with <remote party>).
1 - 200When true, sends the guest join link to remotePartyNumber by SMS. Requires remotePartyNumber and sipCredentialId.
SIP credential (extension) the notification SMS is sent FROM. Required only when notifyRemoteParty is true.
1 - 64