curl --request GET \
--url https://inboxapp.com/api/v2/threads/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://inboxapp.com/api/v2/threads/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://inboxapp.com/api/v2/threads/search', 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://inboxapp.com/api/v2/threads/search",
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://inboxapp.com/api/v2/threads/search"
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://inboxapp.com/api/v2/threads/search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://inboxapp.com/api/v2/threads/search")
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{
"data": [
{
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"accountLinkId": "<string>",
"profileId": "<string>",
"contactId": "<string>",
"assigneeId": "<string>",
"isRequest": true,
"acceptanceState": "required",
"archived": true,
"unread": true,
"restrictions": [
"message:send"
],
"syncing": true,
"typingIndicators": "enabled",
"readReceipts": "onOpen",
"lastMessage": {
"id": "<string>",
"direction": "inbound",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"activity": {
"preview": "<string>",
"previewKind": "contact",
"direction": "inbound",
"at": "2026-09-14T10:32:00.000Z"
},
"seen": {
"messageId": "<string>",
"at": "2026-09-14T10:32:00.000Z"
},
"delivered": {
"messageId": "<string>",
"at": "2026-09-14T10:32:00.000Z"
},
"createdAt": "2026-09-14T10:32:00.000Z",
"accountLink": {
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"status": "active",
"pauseReasons": [
"billing"
],
"capabilities": [
"message:send"
],
"syncedAt": "2026-09-14T10:32:00.000Z",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"profile": {
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"handle": "@jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"bio": "<string>",
"location": "<string>",
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"verified": true,
"isOrganization": true,
"isProtected": true,
"followerCount": 123,
"followingCount": 123,
"postCount": 123,
"engagementCount": 123,
"listedCount": 123,
"accountStatus": "active",
"platformCreatedAt": "2026-09-14T10:32:00.000Z",
"profileUrl": "<string>",
"updatedAt": "2026-09-14T10:32:00.000Z",
"platformData": {
"_tag": "twitter",
"badge": "blue",
"profileType": "personal",
"professionalCategory": "<string>",
"urlEntities": [
{
"url": "<string>",
"expandedUrl": "<string>",
"displayUrl": "<string>",
"indices": [
123,
123
]
}
],
"bannerUrl": "<string>",
"rawData": {}
},
"relationships": [
{
"accountLinkId": "<string>",
"degree": "self",
"connectionRequest": {
"sentAt": "2026-09-14T10:32:00.000Z"
}
}
]
},
"contact": {
"id": "<string>",
"profiles": [
{
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"handle": "@jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"bio": "<string>",
"location": "<string>",
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"verified": true,
"isOrganization": true,
"isProtected": true,
"followerCount": 123,
"followingCount": 123,
"postCount": 123,
"engagementCount": 123,
"listedCount": 123,
"accountStatus": "active",
"platformCreatedAt": "2026-09-14T10:32:00.000Z",
"profileUrl": "<string>",
"updatedAt": "2026-09-14T10:32:00.000Z",
"platformData": {
"_tag": "twitter",
"badge": "blue",
"profileType": "personal",
"professionalCategory": "<string>",
"urlEntities": [
{
"url": "<string>",
"expandedUrl": "<string>",
"displayUrl": "<string>",
"indices": [
123,
123
]
}
],
"bannerUrl": "<string>",
"rawData": {}
},
"relationships": [
{
"accountLinkId": "<string>",
"degree": "self",
"connectionRequest": {
"sentAt": "2026-09-14T10:32:00.000Z"
}
}
]
}
],
"statusId": "<string>",
"tagIds": [
"<string>"
],
"notes": "<string>",
"valuation": 123,
"assigneeId": "<string>",
"createdAt": "2026-09-14T10:32:00.000Z",
"updatedAt": "2026-09-14T10:32:00.000Z",
"status": {
"id": "<string>",
"name": "<string>",
"color": "#3b82f6",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"tags": [
{
"id": "<string>",
"name": "<string>",
"color": "#3b82f6"
}
],
"assignee": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"imageUrl": "<string>",
"role": "owner",
"createdAt": "2026-09-14T10:32:00.000Z"
}
},
"assignee": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"imageUrl": "<string>",
"role": "owner",
"createdAt": "2026-09-14T10:32:00.000Z"
}
}
],
"nextCursor": "<string>"
}{
"code": "invalidRequest",
"message": "<string>",
"details": {
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
},
"requestId": "<string>"
}{
"code": "unauthorized",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "platformNotAvailable",
"message": "<string>",
"details": {
"platform": "twitter"
},
"requestId": "<string>"
}{
"code": "viewNotFound",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "rateLimited",
"message": "<string>",
"details": {
"window": "minute",
"limit": 0,
"resetAt": "2026-09-14T10:32:00.000Z"
},
"requestId": "<string>"
}{
"code": "internal",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "searchUnavailable",
"message": "<string>",
"details": null,
"requestId": "<string>"
}Search threads
The threads that best match q, most relevant first, in one page. Use it to find a conversation by a person’s name or username; to page through the best 1,000 matches in inbox order, use q on List threads.
curl --request GET \
--url https://inboxapp.com/api/v2/threads/search \
--header 'Authorization: Bearer <token>'import requests
url = "https://inboxapp.com/api/v2/threads/search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://inboxapp.com/api/v2/threads/search', 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://inboxapp.com/api/v2/threads/search",
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://inboxapp.com/api/v2/threads/search"
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://inboxapp.com/api/v2/threads/search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://inboxapp.com/api/v2/threads/search")
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{
"data": [
{
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"accountLinkId": "<string>",
"profileId": "<string>",
"contactId": "<string>",
"assigneeId": "<string>",
"isRequest": true,
"acceptanceState": "required",
"archived": true,
"unread": true,
"restrictions": [
"message:send"
],
"syncing": true,
"typingIndicators": "enabled",
"readReceipts": "onOpen",
"lastMessage": {
"id": "<string>",
"direction": "inbound",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"activity": {
"preview": "<string>",
"previewKind": "contact",
"direction": "inbound",
"at": "2026-09-14T10:32:00.000Z"
},
"seen": {
"messageId": "<string>",
"at": "2026-09-14T10:32:00.000Z"
},
"delivered": {
"messageId": "<string>",
"at": "2026-09-14T10:32:00.000Z"
},
"createdAt": "2026-09-14T10:32:00.000Z",
"accountLink": {
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"status": "active",
"pauseReasons": [
"billing"
],
"capabilities": [
"message:send"
],
"syncedAt": "2026-09-14T10:32:00.000Z",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"profile": {
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"handle": "@jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"bio": "<string>",
"location": "<string>",
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"verified": true,
"isOrganization": true,
"isProtected": true,
"followerCount": 123,
"followingCount": 123,
"postCount": 123,
"engagementCount": 123,
"listedCount": 123,
"accountStatus": "active",
"platformCreatedAt": "2026-09-14T10:32:00.000Z",
"profileUrl": "<string>",
"updatedAt": "2026-09-14T10:32:00.000Z",
"platformData": {
"_tag": "twitter",
"badge": "blue",
"profileType": "personal",
"professionalCategory": "<string>",
"urlEntities": [
{
"url": "<string>",
"expandedUrl": "<string>",
"displayUrl": "<string>",
"indices": [
123,
123
]
}
],
"bannerUrl": "<string>",
"rawData": {}
},
"relationships": [
{
"accountLinkId": "<string>",
"degree": "self",
"connectionRequest": {
"sentAt": "2026-09-14T10:32:00.000Z"
}
}
]
},
"contact": {
"id": "<string>",
"profiles": [
{
"id": "<string>",
"platform": "twitter",
"platformId": "<string>",
"username": "jane",
"handle": "@jane",
"displayName": "<string>",
"avatarUrl": "<string>",
"bio": "<string>",
"location": "<string>",
"websiteUrl": "<string>",
"websiteDomain": "<string>",
"verified": true,
"isOrganization": true,
"isProtected": true,
"followerCount": 123,
"followingCount": 123,
"postCount": 123,
"engagementCount": 123,
"listedCount": 123,
"accountStatus": "active",
"platformCreatedAt": "2026-09-14T10:32:00.000Z",
"profileUrl": "<string>",
"updatedAt": "2026-09-14T10:32:00.000Z",
"platformData": {
"_tag": "twitter",
"badge": "blue",
"profileType": "personal",
"professionalCategory": "<string>",
"urlEntities": [
{
"url": "<string>",
"expandedUrl": "<string>",
"displayUrl": "<string>",
"indices": [
123,
123
]
}
],
"bannerUrl": "<string>",
"rawData": {}
},
"relationships": [
{
"accountLinkId": "<string>",
"degree": "self",
"connectionRequest": {
"sentAt": "2026-09-14T10:32:00.000Z"
}
}
]
}
],
"statusId": "<string>",
"tagIds": [
"<string>"
],
"notes": "<string>",
"valuation": 123,
"assigneeId": "<string>",
"createdAt": "2026-09-14T10:32:00.000Z",
"updatedAt": "2026-09-14T10:32:00.000Z",
"status": {
"id": "<string>",
"name": "<string>",
"color": "#3b82f6",
"createdAt": "2026-09-14T10:32:00.000Z"
},
"tags": [
{
"id": "<string>",
"name": "<string>",
"color": "#3b82f6"
}
],
"assignee": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"imageUrl": "<string>",
"role": "owner",
"createdAt": "2026-09-14T10:32:00.000Z"
}
},
"assignee": {
"id": "<string>",
"name": "<string>",
"email": "<string>",
"imageUrl": "<string>",
"role": "owner",
"createdAt": "2026-09-14T10:32:00.000Z"
}
}
],
"nextCursor": "<string>"
}{
"code": "invalidRequest",
"message": "<string>",
"details": {
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
},
"requestId": "<string>"
}{
"code": "unauthorized",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "platformNotAvailable",
"message": "<string>",
"details": {
"platform": "twitter"
},
"requestId": "<string>"
}{
"code": "viewNotFound",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "rateLimited",
"message": "<string>",
"details": {
"window": "minute",
"limit": 0,
"resetAt": "2026-09-14T10:32:00.000Z"
},
"requestId": "<string>"
}{
"code": "internal",
"message": "<string>",
"details": null,
"requestId": "<string>"
}{
"code": "searchUnavailable",
"message": "<string>",
"details": null,
"requestId": "<string>"
}Query Parameters
Threads of these account links. Repeat the key to match any of several.
^[0-9a-z]+$Repeat the key to match any of several.
The platform. Every team can use twitter, linkedin, whatsapp; a team may have others enabled.
Threads with these contacts. With accountLinkId, finds the thread between an account and a contact. Repeat the key to match any of several.
^[0-9a-z]+$A view's id from List views: lists the threads that view lists, in place of folder. Every other filter narrows it. A cursor issued for a saved view is invalidCursor once the view changes.
1Defaults to inbox, threads that are neither archived nor requests. noReply is the inbox threads whose latest activity is inbound. requests holds unarchived threads where isRequest is true. archived includes requests. all spans every folder. Every other filter narrows the folder. Each folder is also a view: inbox, awaitingReply for noReply, requests, archived and all.
inbox, noReply, requests, archived, all Threads whose contact has one of these tags. Repeat the key to match any of several.
A tag, by ID or by name. Names match ignoring case and accents. When a value is one tag's ID and another's name, the ID wins.
Threads whose contact has one of these statuses. Repeat the key to match any of several.
A status, by ID or by name. Names match ignoring case and accents. When a value is one status's ID and another's name, the ID wins.
Threads whose assigneeId, the thread's own assignee or else its contact's, is one of these members. Repeat the key to match any of several.
^[0-9a-z]+$true keeps threads with no assignee, including through their contact. Not combinable with assigneeId.
Threads these campaigns sent a message in. Campaign sends archive the thread, so pair it with folder=archived or all. Repeat the key to match any of several.
^[0-9a-z]+$Matched with typo tolerance against profile display names and usernames, the contact's name and the activity preview.
1How many best matches to return, from 1 to 50. Defaults to 25.
1 <= x <= 50Related resources to embed next to their ID field, one path per key, at most 4.
4profile, contact, accountLink, assignee Was this page helpful?