curl --request PUT \
--url https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"help_desk_number": "<string>"
}
'import requests
url = "https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode"
payload = { "help_desk_number": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({help_desk_number: '<string>'})
};
fetch('https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode', 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.neoagent.io/public-api/phone/numbers/{number}/call-mode",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'help_desk_number' => '<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.neoagent.io/public-api/phone/numbers/{number}/call-mode"
payload := strings.NewReader("{\n \"help_desk_number\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"help_desk_number\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"help_desk_number\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"agent_settings": {},
"country": [
"US",
"+1",
null,
null
],
"created_at": "2023-11-07T05:31:56Z",
"id": 123,
"minutes_used_this_month": 123,
"number": "<string>",
"psa_settings": {},
"status": "ACTIVE",
"updated_at": "2023-11-07T05:31:56Z"
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timings_ms": {},
"pagination": {
"has_more": true,
"next_cursor": "<string>"
},
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Choose who takes a number's calls
Sets agent_settings.call_mode of one number the tenant still holds, given in E.164 (the + may be left out). AI_AGENT: the phone agent answers. PASSIVE: Neo does not answer; it rings help_desk_number, the caller’s phone keeps ringing until the help desk picks up, Neo records the call from that moment, and after the call it writes the transcript and a summary to the ticket while the number’s ticket notes are on. The MSP forwards its support line to the Neo number; help_desk_number must be a different number on the MSP’s own phone system, never a Neo number. Neo plays no recording notice in PASSIVE, so the help desk greeting must carry it. The change takes effect for the next call. Returns the updated number. 400 for a missing or invalid help desk number, or for AI_AGENT on a number with no default company; 404 phone_number_not_found for a number the tenant does not hold.
curl --request PUT \
--url https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"help_desk_number": "<string>"
}
'import requests
url = "https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode"
payload = { "help_desk_number": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({help_desk_number: '<string>'})
};
fetch('https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode', 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.neoagent.io/public-api/phone/numbers/{number}/call-mode",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'help_desk_number' => '<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.neoagent.io/public-api/phone/numbers/{number}/call-mode"
payload := strings.NewReader("{\n \"help_desk_number\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"help_desk_number\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.neoagent.io/public-api/phone/numbers/{number}/call-mode")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"help_desk_number\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"agent_settings": {},
"country": [
"US",
"+1",
null,
null
],
"created_at": "2023-11-07T05:31:56Z",
"id": 123,
"minutes_used_this_month": 123,
"number": "<string>",
"psa_settings": {},
"status": "ACTIVE",
"updated_at": "2023-11-07T05:31:56Z"
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timings_ms": {},
"pagination": {
"has_more": true,
"next_cursor": "<string>"
},
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"meta": {
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Authorizations
Authorization: Bearer <token> where <token> is either a neo_sk_<env>_<secret> API key (service account) or a Microsoft Entra ID access token (dashboard user).
Path Parameters
Body
Who takes the number's calls.
AI_AGENT: the phone agent answers. PASSIVE: Neo does not answer; it rings help_desk_number, the caller's phone keeps ringing until the help desk picks up, and, while the number's ticket notes are on, Neo writes the transcript and a summary of the call to the ticket afterwards. AI_AGENT needs a default company on the number.
AI_AGENT, PASSIVE Required for PASSIVE: a number on the MSP's own phone system that rings its help desk, with its country code. Never the support line forwarded to Neo, and never a Neo number, or the call loops. Ignored for AI_AGENT, which keeps the stored number.
Response
Success.
Public projection of a phone_numbers row.
psa_settings and agent_settings are returned as opaque JSON — their
inner shapes (which PSA action to take on missing customer, which voice
profile, which custom prompt) are tenant-curated and not part of the public
contract. Anyone wanting to edit them goes through the dashboard.
agent_settings.attached_memory_ids lists the ids of the MSP-wide memories
attached to the number, which the agent reads on every call, except one
that was deleted or no longer fits the 4,000-character total. A call uses
the newest edit of each, so an id can name an older version.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
