curl --request GET \
--url http://localhost:8080/api/v1/search/messages \
--header 'Authorization: Basic <encoded-value>'import requests
url = "http://localhost:8080/api/v1/search/messages"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('http://localhost:8080/api/v1/search/messages', 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/api/v1/search/messages",
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 := "http://localhost:8080/api/v1/search/messages"
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("http://localhost:8080/api/v1/search/messages")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/v1/search/messages")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"results": [
{
"uuid": "<string>",
"created_at": "2025-08-28T10:00:00Z",
"type": "incoming",
"private": true,
"text_content": "Hello, I need help with my order.",
"snippet": "<string>",
"sender": {
"first_name": "<string>",
"last_name": "<string>"
},
"conversation_created_at": "2025-08-28T10:00:00Z",
"conversation_uuid": "550e8400-e29b-41d4-a716-446655440000",
"conversation_reference_number": "150",
"conversation_subject": "<string>",
"conversation_status": "Open",
"assigned_user_id": 123,
"assigned_team_id": 123,
"assignee": {
"first_name": "<string>",
"last_name": "<string>",
"avatar_url": "<string>"
},
"team_name": "<string>",
"priority": "<string>",
"inbox_name": "<string>",
"inbox_channel": "email",
"contact": {
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
}
}
],
"per_page": 123,
"has_more": true,
"next_cursor": "<string>"
}
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}Paginated Search Messages
Matches messages whose text contains the query, with filters and cursor pagination. Activity messages are excluded. Returns only messages in conversations the caller can access. Requires the messages:read permission.
curl --request GET \
--url http://localhost:8080/api/v1/search/messages \
--header 'Authorization: Basic <encoded-value>'import requests
url = "http://localhost:8080/api/v1/search/messages"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('http://localhost:8080/api/v1/search/messages', 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/api/v1/search/messages",
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 := "http://localhost:8080/api/v1/search/messages"
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("http://localhost:8080/api/v1/search/messages")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:8080/api/v1/search/messages")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"results": [
{
"uuid": "<string>",
"created_at": "2025-08-28T10:00:00Z",
"type": "incoming",
"private": true,
"text_content": "Hello, I need help with my order.",
"snippet": "<string>",
"sender": {
"first_name": "<string>",
"last_name": "<string>"
},
"conversation_created_at": "2025-08-28T10:00:00Z",
"conversation_uuid": "550e8400-e29b-41d4-a716-446655440000",
"conversation_reference_number": "150",
"conversation_subject": "<string>",
"conversation_status": "Open",
"assigned_user_id": 123,
"assigned_team_id": 123,
"assignee": {
"first_name": "<string>",
"last_name": "<string>",
"avatar_url": "<string>"
},
"team_name": "<string>",
"priority": "<string>",
"inbox_name": "<string>",
"inbox_channel": "email",
"contact": {
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"avatar_url": "<string>"
}
}
],
"per_page": 123,
"has_more": true,
"next_cursor": "<string>"
}
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}{
"status": "error",
"message": "Invalid request",
"data": "<unknown>",
"error_type": "GeneralException"
}Authorizations
Basic authentication using base64 encoded API key and secret. Format: Authorization: Basic <base64(api_key:api_secret)>
Query Parameters
Search query (minimum 3 characters)
3JSON-encoded filter. Either an array of conditions that are AND-ed, e.g. [{"model":"conversations","field":"status_id","operator":"equals","value":"1"}], or a group {"logic":"AND","rules":[...]} with at most one level of nested groups. Operators: equals, not equals, greater than, less than, set, not set, in, between, contains, ilike, not contains. Filterable fields: conversations (status_id, priority_id, assigned_team_id, assigned_user_id, inbox_id, last_message_at, last_interaction_at, last_interaction_sender, created_at, waiting_since, next_sla_deadline_at, snoozed_until, sla_policy_id, tags), conversation_statuses (id, name), users (email, external_user_id), inboxes (channel). Messages can also be filtered on conversation_messages (created_at).
Sort by message creation time. Defaults to newest.
newest, oldest next_cursor from the previous page. A cursor works only with the sort it was created with.
Number of results per page (defaults to 30). Values above 100 use 100.
1 <= x <= 100Was this page helpful?

