List message threads
Returns messaging threads filtered by customer. Supports cursor-based pagination, field filtering, and server-side status/priority/archived/unread filtering. Pinned threads are returned first in the result set.
curl --request GET \
--url https://api.tybritelabs.com/v1/messaging/threads \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/messaging/threads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/messaging/threads', 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.tybritelabs.com/v1/messaging/threads",
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: Bearer <token>"
],
]);
$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.tybritelabs.com/v1/messaging/threads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.tybritelabs.com/v1/messaging/threads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/messaging/threads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"threads": [
{
"id": "de30ebb3-d8d0-4b55-9ca6-e2f2d9ac2383",
"subject": "Question about my order",
"status": "active",
"priority": "normal",
"thread_type": "order_inquiry",
"order_id": "7c2f1b90-58a3-4a7e-9a1d-2b6c0e3f4a11",
"product_id": null,
"last_message_at": "2026-06-20T13:48:15.303+00:00",
"last_message_by": "customer",
"unread_count_customer": 0,
"unread_count_store": 1,
"is_archived": false,
"is_muted": false,
"is_pinned": false
}
],
"pagination": {
"limit": 50,
"next_cursor": null,
"has_more": false
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}Authorizations
API Key Authentication
Use your API key in the Authorization header:
Authorization: Bearer tybrite_sk_live_YOUR_KEY
Key Types:
Secret Keys (Server-Side Only):
- Format:
tybrite_sk_live_*(production) ortybrite_sk_test_*(sandbox) - Full read/write access to all endpoints
- ⚠️ NEVER expose in client-side code or public repositories
- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations
Publishable Keys (Client-Safe):
- Format:
tybrite_pk_live_*(production) ortybrite_pk_test_*(sandbox) - Catalogue reads, plus the actions a shopper takes for themselves
- ✅ Safe for client-side JavaScript, mobile apps, and public code
- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist, reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents
Endpoint-Specific Requirements:
- Authentication endpoints (
/v1/auth/*): Secret key required - Payment verification (
POST /v1/payments/verify): Secret key required - AI Recommendations (
POST /v1/recommendations): Secret key required - Semantic Search (
POST /v1/search): Both key types allowed (read-only operation) - Shopper actions (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed
- All other write operations: Secret key required
- All read operations: Both key types allowed
Using a publishable key for restricted operations returns 403 Forbidden.
Headers
Session token of a customer signed in through Galactic Core, proving they own the threads being read. Provide exactly one of x-auth-token, x-external-auth, or x-idp-token.
Signed identity assertion for a customer authenticated with your own identity provider. Provide exactly one of x-auth-token, x-external-auth, or x-idp-token.
A raw token from your own identity provider, which Galactic Core forwards to the store's configured Auth verifier. Verification is fail-closed: if the verifier rejects the token or is unreachable, the request is unauthenticated (401). Provide exactly one of x-auth-token, x-external-auth, or x-idp-token.
Query Parameters
Customer UUID to filter threads by
Filter threads by status
active, resolved, closed, escalated, pending Filter by priority level
urgent, high, normal, low Filter by thread type
general, order_inquiry, product_inquiry, support, complaint, delivery, return, refund, technical true = archived threads only, false = non-archived only, omit = no filter
Set to true to return only threads with unread_count_store > 0
1 <= x <= 200Cursor for pagination (base64-encoded last_message_at value)
Comma-separated list of fields to include in the response.
Allowed Fields:
id,customer_id,customer_name,customer_email,customer_phonestore_name,store_avatar,order_id,product_idsubject,thread_type,status,prioritylast_message_at,last_message_by,unread_count_customer,unread_count_storeis_archived,is_muted,is_pinnedcreated_at,updated_at
curl --request GET \
--url https://api.tybritelabs.com/v1/messaging/threads \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/messaging/threads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/messaging/threads', 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.tybritelabs.com/v1/messaging/threads",
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: Bearer <token>"
],
]);
$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.tybritelabs.com/v1/messaging/threads"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.tybritelabs.com/v1/messaging/threads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/messaging/threads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"threads": [
{
"id": "de30ebb3-d8d0-4b55-9ca6-e2f2d9ac2383",
"subject": "Question about my order",
"status": "active",
"priority": "normal",
"thread_type": "order_inquiry",
"order_id": "7c2f1b90-58a3-4a7e-9a1d-2b6c0e3f4a11",
"product_id": null,
"last_message_at": "2026-06-20T13:48:15.303+00:00",
"last_message_by": "customer",
"unread_count_customer": 0,
"unread_count_store": 1,
"is_archived": false,
"is_muted": false,
"is_pinned": false
}
],
"pagination": {
"limit": 50,
"next_cursor": null,
"has_more": false
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}
