curl --request GET \
--url https://app.pixie.ai/api/threads \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.pixie.ai/api/threads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.pixie.ai/api/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://app.pixie.ai/api/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://app.pixie.ai/api/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://app.pixie.ai/api/threads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.pixie.ai/api/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_bodyGet Threads
List Unibox threads with filters for inbox state, sender, campaign, channel, and correspondence lookup.
curl --request GET \
--url https://app.pixie.ai/api/threads \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.pixie.ai/api/threads"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.pixie.ai/api/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://app.pixie.ai/api/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://app.pixie.ai/api/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://app.pixie.ai/api/threads")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.pixie.ai/api/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_bodypixie thread
pixie thread --view <view> --channel <channel> --include <include> --search <search> --sender-id <sender-id> --account-id <account-id> --campaign-id <campaign-id> --exclude-thread-id <exclude-thread-id> --exclude-id <exclude-id> --participant-email <participant-email> --correspondence <correspondence> --status <status> --inbox-state <inbox-state> --ai-label <ai-label> --unread <unread> --bounced <bounced> --replied <replied> --page <page> --limit <limit>
Overview
Lists Unibox threads for the authenticated workspace. Threads include email and LinkedIn conversations from campaign replies, one-off outbound email, drafts, archived conversations, and warmup rows. By default, this endpoint returns active threads with inbound activity. Useview, inbox_state, status, sender_id, campaign_id, or participant_email to override that default.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
view | string | Friendly view filter. Supported values: inbox, needs_reply, active_thread, sent, drafts, archived, unread, bounced. Comma-separated values are allowed. |
inbox_state | string | Lower-level state filter. Supported values: draft, needs_reply, active_thread, sent_one_off, sent_campaign, archived, warmup, empty. Comma-separated values are allowed. |
status | string | Lifecycle status filter: active, archived, draft, or warmup. Comma-separated values are allowed. |
unread | boolean | Use true to return only threads with unread_count > 0. |
bounced | boolean | Use true to return bounce-like threads, or false to exclude bounce-like threads. |
channel | string | Filter to email or linkedin. |
sender_id | string | Sender account ID. Public alias for the underlying account_id filter. |
campaign_id | string | Campaign ID. Returns threads linked to that campaign. |
participant_email | string | Recipient email. Also used by correspondence lookup. |
correspondence | boolean | Use true with participant_email to check for existing email correspondence instead of returning the normal thread list. |
exclude_thread_id | string | Thread ID to omit from correspondence lookup results. |
search | string | Searches participant name, email, LinkedIn URL, and last-message snippet. |
include | string | Use filter_options to include available sender and campaign filter options. |
page | integer | Page number. Defaults to 1. |
limit | integer | Page size. Defaults to 50, max 100. |
Example
curl -H "Authorization: Bearer $PIXIE_API_KEY" \
"https://app.pixie.ai/api/threads?view=sent&channel=email&limit=25&include=filter_options"
threads, total, page, and limit. When include=filter_options is present, the response also includes filter_options.campaigns and filter_options.senders.
{
"threads": [
{
"id": "3d986dd1-9d70-45b7-8e36-5d5b8b1c9337",
"channel": "email",
"status": "active",
"inbox_state": "sent_one_off",
"participant_email": "[email protected]",
"last_message_direction": "outbound",
"has_one_off_message": true
}
],
"total": 1,
"page": 1,
"limit": 25,
"filter_options": {
"campaigns": [],
"senders": []
}
}
Correspondence Lookup
Usecorrespondence=true&participant_email=... before creating a one-off email draft if you need to avoid duplicate conversations. The response includes existing_threads and threads for the recipient.
AI agent notes
Useview=needs_reply for work that needs human or agent follow-up. Use view=sent to find outbound-only one-off and campaign conversations. Use correspondence=true before creating a one-off thread for a recipient that may already have history.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Comma-separated Unibox label view. Supported values: inbox, unread, needs_reply, active_thread, sent, drafts, archived, bounced, replied, interested, not_interested, out_of_office.
Channel filter. Use email for email threads and linkedin for LinkedIn threads.
email, linkedin Optional comma-separated includes. Use include=filter_options to also return sender and outbound filter option lists.
Search participant and message text.
Sender/account filter alias used by the Unibox UI.
Sender/account filter.
Outbound/campaign filter.
Thread id to exclude from correspondence lookups.
Conversation id to exclude.
Participant email for correspondence lookups.
Set true to find existing correspondence with participant_email.
true, false Lower-level lifecycle filter: active, archived, draft, warmup.
Lower-level inbox state filter: draft, needs_reply, active_thread, sent_one_off, sent_campaign, archived, warmup, empty.
AI label filter: interested, not_interested, out_of_office.
true, false true, false true, false 0 < x <= 90071992547409910 < x <= 100Response
Successful response.
Was this page helpful?