curl --request GET \
--url https://api.cloudtalk.io/v1/user-statuses \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.cloudtalk.io/v1/user-statuses"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.cloudtalk.io/v1/user-statuses', 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.cloudtalk.io/v1/user-statuses",
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: Basic <encoded-value>"
],
]);
$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.cloudtalk.io/v1/user-statuses"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.cloudtalk.io/v1/user-statuses")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudtalk.io/v1/user-statuses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"data": [
{
"userId": "4207",
"status": "idle",
"statusType": {
"id": "19",
"name": "Lunch",
"actAs": "idle"
},
"customText": null,
"presence": "connected",
"source": "user",
"updatedAt": "2026-11-02T11:30:12.418Z"
},
{
"userId": "4311",
"status": "on_call",
"statusType": {
"id": "7",
"name": "Online",
"actAs": "online"
},
"customText": null,
"presence": "connected",
"source": "user",
"updatedAt": "2026-11-02T11:41:03.092Z"
}
],
"pagination": {
"limit": 20,
"next": "eyJsYXN0QWdlbnRJZCI6NDMxMX0"
},
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"code": "UNAUTHORIZED",
"message": "You are not authorized to access this resource."
}<string>{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}List user statuses
Returns the current status of users in your company, ordered by user id. Filter by live status, or pass updatedSince to get only users whose status changed since your last poll. For live updates, subscribe to the user.status_changed webhook instead.
How status is worked out. Three inputs are checked in this order: whether the user is signed in on any device, whether they are on a call or in after-call work, then the status type they picked. The first that applies wins. status shows the result. statusType and customText show what was picked, which is kept during calls and while signed out.
Which users appear. Users with any status activity: signed in, picked a status, or had a call. A user with no status activity is not listed. A deleted user can stay in the list as offline.
updatedSince can also return users with no visible change, because a device connecting or disconnecting moves updatedAt even when presence stays the same. Renaming a status type does not move updatedAt.
curl --request GET \
--url https://api.cloudtalk.io/v1/user-statuses \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.cloudtalk.io/v1/user-statuses"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.cloudtalk.io/v1/user-statuses', 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.cloudtalk.io/v1/user-statuses",
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: Basic <encoded-value>"
],
]);
$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.cloudtalk.io/v1/user-statuses"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
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.cloudtalk.io/v1/user-statuses")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloudtalk.io/v1/user-statuses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"data": [
{
"userId": "4207",
"status": "idle",
"statusType": {
"id": "19",
"name": "Lunch",
"actAs": "idle"
},
"customText": null,
"presence": "connected",
"source": "user",
"updatedAt": "2026-11-02T11:30:12.418Z"
},
{
"userId": "4311",
"status": "on_call",
"statusType": {
"id": "7",
"name": "Online",
"actAs": "online"
},
"customText": null,
"presence": "connected",
"source": "user",
"updatedAt": "2026-11-02T11:41:03.092Z"
}
],
"pagination": {
"limit": 20,
"next": "eyJsYXN0QWdlbnRJZCI6NDMxMX0"
},
"requestId": "c9856b94-db55-402b-a6ba-adb130351158"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}{
"code": "UNAUTHORIZED",
"message": "You are not authorized to access this resource."
}<string>{
"error": {
"code": "<string>",
"message": "<string>",
"details": [
{
"code": "<string>",
"message": "<string>",
"target": "<string>"
}
],
"target": "<string>"
},
"requestId": "<string>"
}Authorizations
HTTP Basic Authentication. Use your API Access Key ID as the username and your API Access Key Secret as the password. Generate keys in the CloudTalk Dashboard under Account -> Settings -> API Keys (https://dashboard.cloudtalk.io/menu/account/settings/API-keys).
Query Parameters
Page size, 1 to 100. Out-of-range values are clamped and the value used is echoed in pagination.limit. A value that is not a whole number, such as abc or 1.5, is rejected with 400 VALIDATION.INVALID_PARAMETER. An empty value gives the default.
20
Opaque cursor from a previous page's pagination.next. Pass it back unchanged. An empty value starts at the first page. Keep the same filters across pages. A cursor this API did not issue is rejected with 400 PAGINATION.INVALID_CURSOR.
Only users with this live status.
online, idle, offline, on_call, after_call_work RFC 3339 time. Only users whose updatedAt is strictly after it.
"2026-11-02T11:00:00Z"