Phonebook
This page documents endpoints related to Phonebooks.
For shared REST API environment and authentication requirements, see REST API Overview.
Note
- The Phonebook owner implicitly owns all associated Contacts. Roles with permission to view all Phonebooks can access all Phonebooks without requiring explicit ownership. You can review role permissions here: https://portal.telsmart.eu/users/roles
Endpoints
Phonebooks
Base path: /v3/phonebook/phonebook/
Rate limit scope: "phonebook"
List phonebooks
GET /v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}
curl --include --request GET \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}
import requests
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Send the request
response = requests.get('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}', headers=headers)
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.get();
const Http = new XMLHttpRequest();
Http.open("GET", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search={search}&ordering={ordering}&page={page}&page_size={page_size}");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Send the request
Http.send();
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Concrete example
GET /v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48
curl --include --request GET \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48
import requests
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Send the request
response = requests.get('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48', headers=headers)
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.get();
const Http = new XMLHttpRequest();
Http.open("GET", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/?search=john.doe@company.eu&ordering=-description&page=1&page_size=48");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Send the request
Http.send();
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Query parameters
| Parameter | Type | Description |
|---|---|---|
search |
string |
Searchable fields: description, owners__username. |
ordering |
string |
Orderable fields: priority, is_shared, description. Use ordering=description for ascending order and ordering=-description for descending order. |
page |
integer |
Page number (1-based). |
page_size |
integer |
Number of items per page. Default: 48. |
Response format (example)
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"owners": [
{
"id": 10,
"username": "john.doe@company.eu"
},
{
"id": 11,
"username": "jane.doe@company.eu"
}
],
"created": "2026-01-30T10:49:43.777103+01:00",
"modified": "2026-02-02T13:53:08.219228+01:00",
"description": "Test 2",
"priority": 2,
"is_shared": true
}
]
}
Create a phonebook
POST /v3/phonebook/phonebook/
curl --include --request POST \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
-d '{"description": "My Phonebook", "priority": 1, "is_shared": true, "owners": [10, 11]}' \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/
import requests
import json
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Prepare data
myDict = {
"description": "My Phonebook",
"priority": 1,
"is_shared": true,
"owners": [
10,
11
]
}
# Send the request
response = requests.post('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/', headers=headers, json=json.dumps(myDict))
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
// Prepare data
$data = array(
"description" => "My Phonebook",
"priority" => "1",
"is_shared" => "True",
"owners" => "[10, 11]",
};
$fields = json_encode($data);
// Set the body
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Prepare body
request.content = JsonContent.Create(new {
description = "My Phonebook"
priority = "1"
is_shared = "True"
owners = "[10, 11]"
});
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
// Prepare body
String jsonString = "{\"description\": \"My Phonebook\", \"priority\": 1, \"is_shared\": true, \"owners\": [10, 11]}";
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.post(Entity.json(jsonString));
const Http = new XMLHttpRequest();
Http.open("POST", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Prepare data
const json = {
"description": "My Phonebook",
"priority": 1,
"is_shared": true,
"owners": [
10,
11
]
}
// Send the request
Http.send(JSON.stringify(json));
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Request body
| Field | Type | Required | Description |
|---|---|---|---|
description |
string |
Yes | Phonebook description. Validated for uniqueness. |
priority |
integer |
Yes | Display/processing priority. |
is_shared |
boolean |
Yes | Whether the phonebook is shared. |
owners |
integer[] |
No | List of user IDs that own the phonebook. |
Response format (example)
{
"id": 1,
"priority": 1,
"description": "My Phonebook",
"is_shared": true,
"owners": [10, 11]
}
Error responses
400 Bad Request when a duplicate phonebook description exists in the same group:
{
"type": "validation_error",
"errors": [
{
"code": "invalid",
"detail": "Phonebook with this name already exists.",
"attr": "description.unique_description"
}
]
}
Retrieve a phonebook
GET /v3/phonebook/phonebook/1/
curl --include --request GET \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/
import requests
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Send the request
response = requests.get('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/', headers=headers)
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.get();
const Http = new XMLHttpRequest();
Http.open("GET", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Send the request
Http.send();
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Response format (example)
{
"id": 1,
"owners": [
{
"id": 10,
"username": "john.doe@company.eu"
},
{
"id": 11,
"username": "jane.doe@company.eu"
}
],
"created": "2026-01-30T10:49:43.777103+01:00",
"modified": "2026-02-02T13:53:08.219228+01:00",
"description": "My Phonebook",
"priority": 1,
"is_shared": true
}
Update a phonebook
PUT /v3/phonebook/phonebook/1/
curl --include --request PUT \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
-d '{"description": "Updated Phonebook", "priority": 2, "is_shared": false, "owners": [10]}' \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/
import requests
import json
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Prepare data
myDict = {
"description": "Updated Phonebook",
"priority": 2,
"is_shared": false,
"owners": [
10
]
}
# Send the request
response = requests.put('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/', headers=headers, json=json.dumps(myDict))
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
// Prepare data
$data = array(
"description" => "Updated Phonebook",
"priority" => "2",
"is_shared" => "False",
"owners" => "[10]",
};
$fields = json_encode($data);
// Set the body
curl_setopt($ch, CURLOPT_PUTFIELDS, $fields);
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("PUT"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Prepare body
request.content = JsonContent.Create(new {
description = "Updated Phonebook"
priority = "2"
is_shared = "False"
owners = "[10]"
});
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
// Prepare body
String jsonString = "{\"description\": \"Updated Phonebook\", \"priority\": 2, \"is_shared\": false, \"owners\": [10]}";
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.put(Entity.json(jsonString));
const Http = new XMLHttpRequest();
Http.open("PUT", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Prepare data
const json = {
"description": "Updated Phonebook",
"priority": 2,
"is_shared": false,
"owners": [
10
]
}
// Send the request
Http.send(JSON.stringify(json));
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Response format (example)
{
"id": 1,
"priority": 2,
"description": "Updated Phonebook",
"is_shared": false,
"owners": [10]
}
Error responses
400 Bad Request when a duplicate phonebook description exists in the same group:
{
"type": "validation_error",
"errors": [
{
"code": "invalid",
"detail": "Phonebook with this name already exists.",
"attr": "description.unique_description"
}
]
}
Delete a phonebook
DELETE /v3/phonebook/phonebook/1/
curl --include --request DELETE \
--header "Content-Type: application/json" \
--header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/
import requests
# Prepare headers
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer {token}"
}
# Send the request
response = requests.delete('https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/', headers=headers)
<?php
// Create a new cURL resource
$ch = curl_init();
// Prepare headers
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer {token}';
// Set the header
curl_setopt($ch, CURL_HTTPHEADER, $headers);
// Indicate URL
curl_setopt($ch, CURLOPT_URL, 'https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/');
// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
// Send the request
$result = curl_exec($ch);
curl_close($ch);
using (var httpClient = new HttpClient())
{
// Prepare request
using (var request = new HttpRequestMessage(new HttpMethod("DELETE"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/"))
{
// Prepare headers
request.Headers.Add("Content-Type", "application/json");
request.Headers.Add("Authorization", "Bearer {token}");
// Send response
var response = await httpClient.SendAsync(request);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/")
.request(MediaType.APPLICATION_JSON_TYPE)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer {token}")
.delete();
const Http = new XMLHttpRequest();
Http.open("DELETE", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/phonebook/1/");
// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");
// Send the request
Http.send();
// Handle the response
Http.onreadystatechange = (e) => {
console.log(Http.responseText)
}
Note
A Phonebook cannot be deleted while it is assigned to a Device. It must first be unassigned.
Response
204 No Content
Error responses
400 Bad Request if the phonebook is used by devices:
{
"type": "client_error",
"errors": [
{
"code": "phonebook_in_use",
"detail": "Phonebook is used in following devices: \"T42U - INT FW - 44dbd2f85d24\".",
"attr": null
}
]
}