curl --request POST \
--url https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to_phone": "+61400000000",
"from_phone": "+61868656583",
"record": true,
"parameters": {
"callee_name": "Sarah",
"callee_occupation": "Property Manager",
"meeting_time": "Tuesday 10am"
}
}
'import requests
url = "https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call"
payload = {
"to_phone": "+61400000000",
"from_phone": "+61868656583",
"record": True,
"parameters": {
"callee_name": "Sarah",
"callee_occupation": "Property Manager",
"meeting_time": "Tuesday 10am"
}
}
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({
to_phone: '+61400000000',
from_phone: '+61868656583',
record: true,
parameters: {
callee_name: 'Sarah',
callee_occupation: 'Property Manager',
meeting_time: 'Tuesday 10am'
}
})
};
fetch('https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call', 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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call",
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([
'to_phone' => '+61400000000',
'from_phone' => '+61868656583',
'record' => true,
'parameters' => [
'callee_name' => 'Sarah',
'callee_occupation' => 'Property Manager',
'meeting_time' => 'Tuesday 10am'
]
]),
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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call"
payload := strings.NewReader("{\n \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call")
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 \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\n}"
response = http.request(request)
puts response.read_bodyStart Call
Start an outbound call using a workspace agent. Requires ‘to_phone’ (required), optional ‘from_phone’, ‘record’ (defaults to true), and ‘parameters’ (key-value pairs for call personalization). Supports both Clerk JWT (dashboard) and API key authentication. For API key auth, the key must have the ‘start_call’ scope.
curl --request POST \
--url https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to_phone": "+61400000000",
"from_phone": "+61868656583",
"record": true,
"parameters": {
"callee_name": "Sarah",
"callee_occupation": "Property Manager",
"meeting_time": "Tuesday 10am"
}
}
'import requests
url = "https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call"
payload = {
"to_phone": "+61400000000",
"from_phone": "+61868656583",
"record": True,
"parameters": {
"callee_name": "Sarah",
"callee_occupation": "Property Manager",
"meeting_time": "Tuesday 10am"
}
}
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({
to_phone: '+61400000000',
from_phone: '+61868656583',
record: true,
parameters: {
callee_name: 'Sarah',
callee_occupation: 'Property Manager',
meeting_time: 'Tuesday 10am'
}
})
};
fetch('https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call', 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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call",
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([
'to_phone' => '+61400000000',
'from_phone' => '+61868656583',
'record' => true,
'parameters' => [
'callee_name' => 'Sarah',
'callee_occupation' => 'Property Manager',
'meeting_time' => 'Tuesday 10am'
]
]),
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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call"
payload := strings.NewReader("{\n \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\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.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voqo.ai/api/v1/workspaces/{workspace_id}/agents/{agent_id}/start-call")
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 \"to_phone\": \"+61400000000\",\n \"from_phone\": \"+61868656583\",\n \"record\": true,\n \"parameters\": {\n \"callee_name\": \"Sarah\",\n \"callee_occupation\": \"Property Manager\",\n \"meeting_time\": \"Tuesday 10am\"\n }\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Start an outbound call from a workspace agent. Only to_phone is required.
Phone number to call, in E.164 format (for example +61400000000). This is the person the AI agent rings.
Voqo number the call is made from, in E.164 format. Optional: when omitted, the number connected to this agent is used. The request fails with 404 if the agent has no connected number.
Record the call. Defaults to true. Recordings appear in Call Logs and in the post-call webhook.
Optional key-value pairs the agent can use during the call, such as the callee's name or the meeting time. Reference them in the agent prompt.
Show child attributes
Show child attributes
{ "callee_name": "Sarah", "callee_occupation": "Property Manager", "meeting_time": "Tuesday 10am" }
Response
Call started successfully
Response schema for starting a call
To phone number
Created by
From phone number
Whether to record the call
Call status
created, initiated, connected, inprogress, completed, failed Call created at

