curl --request POST \
--url https://api.revring.ai/v1/calls \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toNumber": "<string>",
"fromNumber": "<string>",
"variables": {},
"callerIdName": "<string>",
"skipQueue": false,
"voiceId": "<string>",
"firstMessageDelayMs": 7500,
"beginAfterUserSilenceMs": 30250,
"environment": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.revring.ai/v1/calls"
payload = {
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toNumber": "<string>",
"fromNumber": "<string>",
"variables": {},
"callerIdName": "<string>",
"skipQueue": False,
"voiceId": "<string>",
"firstMessageDelayMs": 7500,
"beginAfterUserSilenceMs": 30250,
"environment": "<string>",
"language": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
toNumber: '<string>',
fromNumber: '<string>',
variables: {},
callerIdName: '<string>',
skipQueue: false,
voiceId: '<string>',
firstMessageDelayMs: 7500,
beginAfterUserSilenceMs: 30250,
environment: '<string>',
language: '<string>'
})
};
fetch('https://api.revring.ai/v1/calls', 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.revring.ai/v1/calls",
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([
'agentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'toNumber' => '<string>',
'fromNumber' => '<string>',
'variables' => [
],
'callerIdName' => '<string>',
'skipQueue' => false,
'voiceId' => '<string>',
'firstMessageDelayMs' => 7500,
'beginAfterUserSilenceMs' => 30250,
'environment' => '<string>',
'language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.revring.ai/v1/calls"
payload := strings.NewReader("{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.revring.ai/v1/calls")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revring.ai/v1/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "INBOUND",
"status": "QUEUED",
"fromNumber": "<string>",
"toNumber": "<string>",
"initiatedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sipTrunkId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "web_widget",
"continuedFromCallId": "<string>",
"agentCallerIdName": "<string>",
"agentName": "<string>",
"variables": {},
"recordingUrl": "<string>",
"recordingOffsetSeconds": 123,
"hangupCause": "<string>",
"errorMessage": "<string>",
"transcript": [
{}
],
"summary": "<string>",
"extraction": {
"callback_requested": true,
"preferred_day": "Tuesday",
"budget": 450000
},
"evaluation": {
"appointment_confirmed": {
"result": "pass",
"rationale": "The caller agreed to Tuesday at 10am and the agent confirmed it."
},
"callback_requested": {
"result": "unknown",
"rationale": "A callback was never discussed."
}
},
"agentRevision": 123,
"environment": "<string>",
"campaignId": "<string>",
"metrics": {
"llm_prompt_tokens": 123,
"llm_prompt_cached_tokens": 123,
"llm_completion_tokens": 123,
"stt_audio_duration": 123,
"tts_audio_duration": 123,
"tts_characters_count": 123,
"latency": {
"turns": 123,
"e2e": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"eou_delay": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"transcription_delay": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"llm_ttft": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"tts_ttfb": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
}
}
},
"piiRedacted": true,
"startedAt": "2023-11-07T05:31:56Z",
"endedAt": "2023-11-07T05:31:56Z",
"durationSeconds": 123,
"llmModel": "revring-standard",
"voiceId": "<string>",
"voiceTier": "standard",
"postCallWebhookStatus": "sent",
"postCallWebhookAttempts": 123,
"preCallWebhookStatus": "sent",
"sentiment": "positive",
"doNotCallRequested": true
}
}{
"error": "invalid_body",
"details": {}
}{
"error": "unauthorized"
}{
"error": "billing_inactive"
}{
"error": "agent_not_found"
}{
"error": "concurrency_limit"
}Send Call
Initiate an outbound call with an agent
curl --request POST \
--url https://api.revring.ai/v1/calls \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toNumber": "<string>",
"fromNumber": "<string>",
"variables": {},
"callerIdName": "<string>",
"skipQueue": false,
"voiceId": "<string>",
"firstMessageDelayMs": 7500,
"beginAfterUserSilenceMs": 30250,
"environment": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.revring.ai/v1/calls"
payload = {
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toNumber": "<string>",
"fromNumber": "<string>",
"variables": {},
"callerIdName": "<string>",
"skipQueue": False,
"voiceId": "<string>",
"firstMessageDelayMs": 7500,
"beginAfterUserSilenceMs": 30250,
"environment": "<string>",
"language": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
toNumber: '<string>',
fromNumber: '<string>',
variables: {},
callerIdName: '<string>',
skipQueue: false,
voiceId: '<string>',
firstMessageDelayMs: 7500,
beginAfterUserSilenceMs: 30250,
environment: '<string>',
language: '<string>'
})
};
fetch('https://api.revring.ai/v1/calls', 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.revring.ai/v1/calls",
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([
'agentId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'toNumber' => '<string>',
'fromNumber' => '<string>',
'variables' => [
],
'callerIdName' => '<string>',
'skipQueue' => false,
'voiceId' => '<string>',
'firstMessageDelayMs' => 7500,
'beginAfterUserSilenceMs' => 30250,
'environment' => '<string>',
'language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.revring.ai/v1/calls"
payload := strings.NewReader("{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.revring.ai/v1/calls")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.revring.ai/v1/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toNumber\": \"<string>\",\n \"fromNumber\": \"<string>\",\n \"variables\": {},\n \"callerIdName\": \"<string>\",\n \"skipQueue\": false,\n \"voiceId\": \"<string>\",\n \"firstMessageDelayMs\": 7500,\n \"beginAfterUserSilenceMs\": 30250,\n \"environment\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"direction": "INBOUND",
"status": "QUEUED",
"fromNumber": "<string>",
"toNumber": "<string>",
"initiatedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sipTrunkId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"source": "web_widget",
"continuedFromCallId": "<string>",
"agentCallerIdName": "<string>",
"agentName": "<string>",
"variables": {},
"recordingUrl": "<string>",
"recordingOffsetSeconds": 123,
"hangupCause": "<string>",
"errorMessage": "<string>",
"transcript": [
{}
],
"summary": "<string>",
"extraction": {
"callback_requested": true,
"preferred_day": "Tuesday",
"budget": 450000
},
"evaluation": {
"appointment_confirmed": {
"result": "pass",
"rationale": "The caller agreed to Tuesday at 10am and the agent confirmed it."
},
"callback_requested": {
"result": "unknown",
"rationale": "A callback was never discussed."
}
},
"agentRevision": 123,
"environment": "<string>",
"campaignId": "<string>",
"metrics": {
"llm_prompt_tokens": 123,
"llm_prompt_cached_tokens": 123,
"llm_completion_tokens": 123,
"stt_audio_duration": 123,
"tts_audio_duration": 123,
"tts_characters_count": 123,
"latency": {
"turns": 123,
"e2e": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"eou_delay": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"transcription_delay": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"llm_ttft": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
},
"tts_ttfb": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"max_ms": 123
}
}
},
"piiRedacted": true,
"startedAt": "2023-11-07T05:31:56Z",
"endedAt": "2023-11-07T05:31:56Z",
"durationSeconds": 123,
"llmModel": "revring-standard",
"voiceId": "<string>",
"voiceTier": "standard",
"postCallWebhookStatus": "sent",
"postCallWebhookAttempts": 123,
"preCallWebhookStatus": "sent",
"sentiment": "positive",
"doNotCallRequested": true
}
}{
"error": "invalid_body",
"details": {}
}{
"error": "unauthorized"
}{
"error": "billing_inactive"
}{
"error": "agent_not_found"
}{
"error": "concurrency_limit"
}Authorizations
API key for authentication. Generate API keys from the RevRing dashboard.
Body
Destination number (E.164)
^\+[1-9]\d{1,14}$Caller ID number (E.164)
^\+[1-9]\d{1,14}$Template variables for this call
Caller ID name displayed to the recipient (max 15 characters)
1 - 15When true, returns a 429 error immediately if the concurrency limit is reached instead of queuing the call
Override the agent's voicemail behavior for this call only. 'leave_message' leaves the agent's configured voicemail when an answering machine is detected; 'hangup' ends the call without leaving a message. Omit to use the agent's saved setting. The agent must have voicemail detection enabled for this to take effect. Useful for multi-attempt outreach where only the final attempt should leave a voicemail.
hangup, leave_message Override the agent's voice for this call only. Takes a voice id from GET /voices (a system voice or one owned by your organization). Lets one agent speak with different voices per call - for example rotating across a set of voices, or matching the voice to what you know about the person being called - without editing the agent between calls. The agent's saved voice is unchanged and its backup-voice behavior still applies. An unknown or unusable voice id is rejected with 400 voice_not_found.
Override who opens the conversation for this call only. Takes precedence over the agent's startSpeakerOutbound and startSpeaker. The agent's saved settings are unchanged.
agent, user Override the pause before the agent speaks for this call only, in milliseconds. 0 means no pause. Takes precedence over the agent's firstMessageDelayMsOutbound and firstMessageDelayMs.
0 <= x <= 15000Override beginAfterUserSilenceMs for this call only: when the caller speaks first and stays silent this many milliseconds, the agent speaks its opening.
500 <= x <= 60000Agent environment to run this call on. Omit for production: the published version in manual publish mode, the agent as saved otherwise. Unknown names are refused with 400 environment_not_found before anything is dialed
^[a-z][a-z0-9-]{0,31}$Language for this call only (e.g. es, pt-BR); the agent's preset for that language supplies the voice and opening line. See Language per call.
Response
Outbound call initiated
Phone call record
Show child attributes
Show child attributes