Filter chat sessions
curl --request POST \
--url http://localhost:8080/chat/sessions/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {},
"page": 1,
"limit": 25
}
'import requests
url = "http://localhost:8080/chat/sessions/filter"
payload = {
"filters": {},
"page": 1,
"limit": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({filters: {}, page: 1, limit: 25})
};
fetch('http://localhost:8080/chat/sessions/filter', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/chat/sessions/filter",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
],
'page' => 1,
'limit' => 25
]),
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 := "http://localhost:8080/chat/sessions/filter"
payload := strings.NewReader("{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}")
req, _ := http.NewRequest("POST", 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.post("http://localhost:8080/chat/sessions/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/chat/sessions/filter")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tags": [
{
"tag_name": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
],
"status": "open",
"sub_status_id": "<string>",
"ai_closure_type": "assumed_resolved",
"sentiment": "angry",
"summary": "<string>",
"title": "<string>",
"channel": {
"type": "web"
},
"assignee": {
"type": "human",
"id": 0,
"name": "<string>"
},
"support_team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"ticket_number": 123,
"assist_mode": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"first_human_message_at": "2023-11-07T05:31:56Z",
"contact": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "[email protected]",
"phone_number": "<string>",
"name": "<string>",
"custom_data": {},
"non_verified_custom_data": {},
"created_at": "<string>",
"updated_at": "<string>",
"non_verified_name": "<string>",
"non_verified_email": "<string>"
},
"language": "<string>",
"assignee_id": "<string>",
"custom_data": {},
"team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>"
},
"handoff": {
"summary": "<string>",
"sentiment": "angry"
},
"ticketing_system": {
"name": "dynamics365",
"external_id": "<string>",
"id_type": "conversation_id"
}
}
],
"page": 123,
"limit": 123,
"has_next": true,
"has_previous": true
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}Sessions
Filter chat sessions
Search and filter chat sessions with advanced criteria. Use when orchestrating conversations from code — creating sessions, sending messages, or listing history for an external…
POST
/
chat
/
sessions
/
filter
Filter chat sessions
curl --request POST \
--url http://localhost:8080/chat/sessions/filter \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filters": {},
"page": 1,
"limit": 25
}
'import requests
url = "http://localhost:8080/chat/sessions/filter"
payload = {
"filters": {},
"page": 1,
"limit": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({filters: {}, page: 1, limit: 25})
};
fetch('http://localhost:8080/chat/sessions/filter', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://localhost:8080/chat/sessions/filter",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
],
'page' => 1,
'limit' => 25
]),
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 := "http://localhost:8080/chat/sessions/filter"
payload := strings.NewReader("{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}")
req, _ := http.NewRequest("POST", 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.post("http://localhost:8080/chat/sessions/filter")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/chat/sessions/filter")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {},\n \"page\": 1,\n \"limit\": 25\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tags": [
{
"tag_name": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
],
"status": "open",
"sub_status_id": "<string>",
"ai_closure_type": "assumed_resolved",
"sentiment": "angry",
"summary": "<string>",
"title": "<string>",
"channel": {
"type": "web"
},
"assignee": {
"type": "human",
"id": 0,
"name": "<string>"
},
"support_team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"ticket_number": 123,
"assist_mode": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"first_human_message_at": "2023-11-07T05:31:56Z",
"contact": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "[email protected]",
"phone_number": "<string>",
"name": "<string>",
"custom_data": {},
"non_verified_custom_data": {},
"created_at": "<string>",
"updated_at": "<string>",
"non_verified_name": "<string>",
"non_verified_email": "<string>"
},
"language": "<string>",
"assignee_id": "<string>",
"custom_data": {},
"team": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>"
},
"handoff": {
"summary": "<string>",
"sentiment": "angry"
},
"ticketing_system": {
"name": "dynamics365",
"external_id": "<string>",
"id_type": "conversation_id"
}
}
],
"page": 123,
"limit": 123,
"has_next": true,
"has_previous": true
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}Each returned session includes all of its assigned
A human assignee’s
tags, even when filtering by
a subset of tag names. Each tag contains tag_name and created_at. Tags are
ordered by name; sessions without tags return an empty array.
The support_team field contains the assigned support team’s id and name.
The ID remains stable when the team is renamed. This field is null when no
support team can be resolved for the session.
The first_human_message_at field contains the first recorded human reply time as an
ISO 8601 timestamp, or null when no human reply has been recorded. Internal notes
and automated messages do not set this timestamp. Later human replies do not change it.
The title field is the session title: the email subject, a subject set by an agent,
or an AI-generated title. It is null until one is set.
Use assignee to identify who is currently assigned to a session:
| Type | Example | Meaning |
|---|---|---|
| Human | {"type":"human","id":77,"name":"Alex Smith"} | The numeric ID matches GET /users. |
| AI | {"type":"ai"} | AI is assigned; no ID or name is returned. |
| None | {"type":"none"} | The session is unassigned. |
name matches the organization display name in GET /users.
An organization name override takes precedence; a blank or missing override falls
back to the account name. The name is null if the user is no
longer a member of the organization or cannot be found; the recorded ID remains
available for historical attribution. Reading a session does not require the
users:read scope. Reading the user directory, including emails, does.
The response field assignee_id is deprecated. Human IDs remain strings there;
AI and unassigned sessions return null. Clients that previously used the AI
placeholder must switch to assignee.type. Assignment requests continue to use
assignee_id with a numeric human user ID or null to unassign.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Show child attributes
Show child attributes
Sort field (default: last_message_at)
Available options:
last_message_at, created_at Sort direction (default: desc)
Available options:
asc, desc Page number (1-based, default: 1)
Required range:
-9007199254740991 <= x <= 2147483647Results per page (1-100, default: 25)
Required range:
-9007199254740991 <= x <= 2147483647Was this page helpful?