Skip to content

Phonebook Contacts

This page documents endpoints related to Phonebook contacts.

For shared REST API environment and authentication requirements, see REST API Overview.

Endpoints

Phonebook contacts

Base path: /v3/phonebook/contact/

Rate limit scope: "phonebook"

List contacts

GET /v3/phonebook/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook={phonebook_id}&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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/contact/?phonebook=1&search=Test contact&ordering=-display_name&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
phonebook integer Filterable field: phonebook (phonebook ID).
search string Searchable fields: display_name, number, speed_dial, company.
ordering string Orderable fields: phonebook, display_name, number, company, speed_dial. Use ordering=display_name for ascending order and ordering=-display_name 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": 100,
      "phonebook": 1,
      "display_name": "John Doe",
      "number": "+3212345678",
      "secondary_number": "+32470123456",
      "speed_dial": 123,
      "company": "Test Company"
    }
  ]
}

Create a contact

POST /v3/phonebook/contact/
curl --include --request POST \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer {token}" \
  -d '{"phonebook": 1, "display_name": "John Doe", "number": "+3212345678", "secondary_number": "+32470123456", "speed_dial": "123", "company": "Test Company"}' \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/
import requests
import json

# Prepare headers
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {token}"
}

# Prepare data
myDict = {
    "phonebook": 1,
    "display_name": "John Doe",
    "number": "+3212345678",
    "secondary_number": "+32470123456",
    "speed_dial": "123",
    "company": "Test Company"
}

# Send the request
response = requests.post('https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/', 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/contact/');

// 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(
    "phonebook" => "1",
    "display_name" => "John Doe",
    "number" => "+3212345678",
    "secondary_number" => "+32470123456",
    "speed_dial" => "123",
    "company" => "Test Company",
};
$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/contact/"))
    {
        // Prepare headers
        request.Headers.Add("Content-Type", "application/json");
        request.Headers.Add("Authorization", "Bearer {token}");

        // Prepare body
        request.content = JsonContent.Create(new { 
            phonebook = "1"
            display_name = "John Doe"
            number = "+3212345678"
            secondary_number = "+32470123456"
            speed_dial = "123"
            company = "Test Company"
        });

        // 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 = "{\"phonebook\": 1, \"display_name\": \"John Doe\", \"number\": \"+3212345678\", \"secondary_number\": \"+32470123456\", \"speed_dial\": \"123\", \"company\": \"Test Company\"}";

Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/")
  .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/contact/");

// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");

// Prepare data
const json = {
    "phonebook": 1,
    "display_name": "John Doe",
    "number": "+3212345678",
    "secondary_number": "+32470123456",
    "speed_dial": "123",
    "company": "Test Company"
}

// Send the request
Http.send(JSON.stringify(json));

// Handle the response
Http.onreadystatechange = (e) => {
    console.log(Http.responseText)
}
Request body
Field Type Required Description
phonebook integer Yes Phonebook ID.
display_name string Yes Display name.
number string Yes Phone number (E.164 is recommended). Some local formats may be normalized. Validated for uniqueness per phonebook.
secondary_number string | null Yes Secondary number (E.164 is recommended). Some local formats may be normalized.
speed_dial integer Yes Internal extension used for speed dialing. Allowed values are 3–4 digits within 200–999 range and 2000–9999 range excluding 9191. Validated for uniqueness among phonebook contact speed dial extensions, call flow extensions, call queue extensions, voicemail box extensions and user extensions.
company string No Company name.
Response format (example)
{
  "id": 100,
  "phonebook": 1,
  "display_name": "John Doe",
  "number": "+3212345678",
  "secondary_number": "+32470123456",
  "speed_dial": 123,
  "company": "Test Company"
}

Retrieve a contact

GET /v3/phonebook/contact/100/
curl --include --request GET \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/100/
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/contact/100/', 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/contact/100/');

// 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/contact/100/"))
    {
        // 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/contact/100/")
  .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/contact/100/");

// 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": 100,
  "phonebook": 1,
  "display_name": "John Doe",
  "number": "+3212345678",
  "secondary_number": "+32470123456",
  "speed_dial": 123,
  "company": "Test Company"
}

Update a contact

PUT /v3/phonebook/contact/100/
curl --include --request PUT \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer {token}" \
  -d '{"phonebook": 1, "display_name": "John Doe Updated", "number": "+3212345678", "secondary_number": "+32470123456", "speed_dial": "123", "company": "Test Company"}' \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/100/
import requests
import json

# Prepare headers
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {token}"
}

# Prepare data
myDict = {
    "phonebook": 1,
    "display_name": "John Doe Updated",
    "number": "+3212345678",
    "secondary_number": "+32470123456",
    "speed_dial": "123",
    "company": "Test Company"
}

# Send the request
response = requests.put('https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/100/', 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/contact/100/');

// 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(
    "phonebook" => "1",
    "display_name" => "John Doe Updated",
    "number" => "+3212345678",
    "secondary_number" => "+32470123456",
    "speed_dial" => "123",
    "company" => "Test Company",
};
$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/contact/100/"))
    {
        // Prepare headers
        request.Headers.Add("Content-Type", "application/json");
        request.Headers.Add("Authorization", "Bearer {token}");

        // Prepare body
        request.content = JsonContent.Create(new { 
            phonebook = "1"
            display_name = "John Doe Updated"
            number = "+3212345678"
            secondary_number = "+32470123456"
            speed_dial = "123"
            company = "Test Company"
        });

        // 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 = "{\"phonebook\": 1, \"display_name\": \"John Doe Updated\", \"number\": \"+3212345678\", \"secondary_number\": \"+32470123456\", \"speed_dial\": \"123\", \"company\": \"Test Company\"}";

Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/100/")
  .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/contact/100/");

// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");

// Prepare data
const json = {
    "phonebook": 1,
    "display_name": "John Doe Updated",
    "number": "+3212345678",
    "secondary_number": "+32470123456",
    "speed_dial": "123",
    "company": "Test Company"
}

// Send the request
Http.send(JSON.stringify(json));

// Handle the response
Http.onreadystatechange = (e) => {
    console.log(Http.responseText)
}
Response format (example)
{
  "id": 100,
  "phonebook": 1,
  "display_name": "John Doe Updated",
  "number": "+3212345678",
  "secondary_number": "+32470123456",
  "speed_dial": 123,
  "company": "Test Company"
}

Delete a contact

DELETE /v3/phonebook/contact/100/
curl --include --request DELETE \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer {token}" \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/100/
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/contact/100/', 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/contact/100/');

// 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/contact/100/"))
    {
        // 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/contact/100/")
  .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/contact/100/");

// 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 Contact cannot be deleted if it is used in a Call Queue or Call Flow. It must first be removed from all places it is used.

Response

204 No Content

Error responses

400 Bad Request when the contact is in use.

If used in a queue:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in queue \"Jonh Queue\".",
      "attr": null
    }
  ]
}

If used in a call flow:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in call flow \"John Call Flow\".",
      "attr": null
    }
  ]
}

If used in both a queue and a call flow:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in queue \"Josip Queue\", John Doe in call flow \"John Call Flow\".",
      "attr": null
    }
  ]
}

Bulk delete contacts

DELETE /v3/phonebook/contact/bulk_delete/
curl --include --request DELETE \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer {token}" \
  -d '{"contact_ids": [100, 101]}' \
https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/bulk_delete/
import requests
import json

# Prepare headers
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {token}"
}

# Prepare data
myDict = {
    "contact_ids": [
        100,
        101
    ]
}

# Send the request
response = requests.delete('https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/bulk_delete/', 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/contact/bulk_delete/');

// Return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Indicate the method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');

// Prepare data
$data = array(
    "contact_ids" => "[100, 101]",
};
$fields = json_encode($data);

// Set the body
curl_setopt($ch, CURLOPT_DELETEFIELDS, $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("DELETE"), "https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/bulk_delete/"))
    {
        // Prepare headers
        request.Headers.Add("Content-Type", "application/json");
        request.Headers.Add("Authorization", "Bearer {token}");

        // Prepare body
        request.content = JsonContent.Create(new { 
            contact_ids = "[100, 101]"
        });

        // 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 = "{\"contact_ids\": [100, 101]}";

Client client = ClientBuilder.newClient();
Response response = client.target("https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/bulk_delete/")
  .request(MediaType.APPLICATION_JSON_TYPE)
  .header("Content-Type", "application/json")
  .header("Authorization", "Bearer {token}")
  .delete(Entity.json(jsonString));
const Http = new XMLHttpRequest();
Http.open("DELETE", "https://api-eu-central-1.phoneserver.dev/v3/phonebook/contact/bulk_delete/");

// Prepare headers
Http.setRequestHeader("Content-Type", "application/json");
Http.setRequestHeader("Authorization", "Bearer {token}");

// Prepare data
const json = {
    "contact_ids": [
        100,
        101
    ]
}

// Send the request
Http.send(JSON.stringify(json));

// Handle the response
Http.onreadystatechange = (e) => {
    console.log(Http.responseText)
}
Request body
Field Type Required Description
contact_ids integer[] Yes A non-empty list of phonebook contact IDs.
Response

204 No Content

Bulk delete is all-or-nothing: if any requested contact returns an error, no contacts are deleted.

Error responses
Status Condition
400 Bad Request contact_ids is missing.
400 Bad Request contact_ids is an empty list.
400 Bad Request contact_ids contains one or more non-integer values.
403 Forbidden One or more requested IDs are not allowed for the authenticated user.
400 Bad Request Unexpected exception.

Validation error example (contact_ids missing):

{
  "type": "validation_error",
  "errors": [
    {
      "code": "required",
      "detail": "This field is required.",
      "attr": "contact_ids"
    }
  ]
}

Validation error behavior (contact_ids empty):

The API returns a field-level validation error in the same structured format (type: "validation_error", attr: "contact_ids").

Validation error behavior (non-integer values in contact_ids):

The API returns a field-level validation error in the same structured format (type: "validation_error", with attr pointing to contact_ids / invalid list item path).

403 Forbidden behavior:

The response body is empty. Only the HTTP status code is returned.

Contacts in use (matches Delete a contact):

If used in a queue:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in queue \"John Queue\".",
      "attr": null
    }
  ]
}

If used in a call flow:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in call flow \"John Call Flow\".",
      "attr": null
    }
  ]
}

If used in both a queue and a call flow:

{
  "type": "client_error",
  "errors": [
    {
      "code": "contacts_in_use",
      "detail": "Contacts are in use: John Doe in queue \"John Queue\", John Doe in call flow \"John Call Flow\".",
      "attr": null
    }
  ]
}