curl --request GET \
--url https://api.erdo.ai/v1/voice/phone-numbers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/voice/phone-numbers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/voice/phone-numbers', 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.erdo.ai/v1/voice/phone-numbers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.erdo.ai/v1/voice/phone-numbers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.erdo.ai/v1/voice/phone-numbers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/voice/phone-numbers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"business_profile_complete": true,
"caller_name": {
"caller_name": "<string>",
"caller_name_out_of_date": true,
"missing_profile_fields": [
"<string>"
],
"next_step": "<string>",
"reason": "<string>",
"registerable": true,
"registered_name": "<string>",
"status": "<string>"
},
"missing_profile_fields": [
"<string>"
],
"numbers": [
{
"address": "<string>",
"agent_ref": "<string>",
"brand_status": "<string>",
"caller_name_attachment": "<string>",
"caller_name_not_registerable_reason": "<string>",
"caller_name_observed": "<string>",
"caller_name_registerable": true,
"campaign_status": "<string>",
"last_polled_at": "2023-11-07T05:31:56Z",
"missing_profile_fields": [
"<string>"
],
"mock": true,
"next_step": "<string>",
"not_registerable_reason": "<string>",
"observed_caller_name": "<string>",
"profile_out_of_date": true,
"profile_out_of_date_fields": [
"<string>"
],
"profile_status": "<string>",
"reason": "<string>",
"registerable": true,
"requested_at": "2023-11-07T05:31:56Z",
"sender_kind": "<string>",
"status": "<string>"
}
],
"person_call_numbers": [
"<string>"
]
}{
"code": "not_found",
"details": {},
"message": "<string>"
}ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list: every number
with its SMS registration and its part in the organization’s caller name.
curl --request GET \
--url https://api.erdo.ai/v1/voice/phone-numbers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.erdo.ai/v1/voice/phone-numbers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.erdo.ai/v1/voice/phone-numbers', 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.erdo.ai/v1/voice/phone-numbers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.erdo.ai/v1/voice/phone-numbers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.erdo.ai/v1/voice/phone-numbers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/voice/phone-numbers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"business_profile_complete": true,
"caller_name": {
"caller_name": "<string>",
"caller_name_out_of_date": true,
"missing_profile_fields": [
"<string>"
],
"next_step": "<string>",
"reason": "<string>",
"registerable": true,
"registered_name": "<string>",
"status": "<string>"
},
"missing_profile_fields": [
"<string>"
],
"numbers": [
{
"address": "<string>",
"agent_ref": "<string>",
"brand_status": "<string>",
"caller_name_attachment": "<string>",
"caller_name_not_registerable_reason": "<string>",
"caller_name_observed": "<string>",
"caller_name_registerable": true,
"campaign_status": "<string>",
"last_polled_at": "2023-11-07T05:31:56Z",
"missing_profile_fields": [
"<string>"
],
"mock": true,
"next_step": "<string>",
"not_registerable_reason": "<string>",
"observed_caller_name": "<string>",
"profile_out_of_date": true,
"profile_out_of_date_fields": [
"<string>"
],
"profile_status": "<string>",
"reason": "<string>",
"registerable": true,
"requested_at": "2023-11-07T05:31:56Z",
"sender_kind": "<string>",
"status": "<string>"
}
],
"person_call_numbers": [
"<string>"
]
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Response
Success response
is still missing fields. It answers the settings page's first question without the caller having to interpret an empty list.
Show child attributes
Show child attributes
business profile is what every registration on the account depends on, so it is reported once rather than repeated on each row.
same keys, plus the number's caller-name state — see VoicePhoneNumber.
Show child attributes
Show child attributes
person's call (POST /v1/voice/person-calls) can be placed from, written exactly as it appears there. It is the voice service's answer, made by the same check the call itself makes, so a surface that offers only these numbers never offers one every call would refuse: an agent number on an account Erdo does not manage has the agent-number kind but is not listed. Always present; empty when no number can place one.

