Communication
Full conversation context, not just the last message
Outbound and inbound emails are grouped into threads per mailbox. Your agent sees the entire conversation history. When it can't handle something, a human steps in through override queues.

How threads are built
Include a mailbox ID when sending
Pass mailboxId in your send request. A thread is created for the mailbox + recipient pair, or matched to an existing one if the conversation already exists.
Replies link themselves
Inbound replies match to the right thread via In-Reply-To headers, with a fallback to sender-recipient matching. The thread status flips from waiting to open.
Full history in one GET
GET /v1/agent/threads/:id returns every outbound and inbound message in chronological order. No pagination games for normal-length threads.
Status transitions are automatic
Open means unread inbound. Waiting means you sent something and haven't heard back. Resolved and escalated do what you'd expect. You don't manage these transitions manually.
Humans can step in
Override queues for threads that need human judgment. Operators approve, reject, edit, or escalate. Every action produces an immutable audit event.
Send into a thread
POST /v1/agent/outbound/send
POST /v1/agent/outbound/send
{
"recipientEmail": "alice@example.com",
"templateId": "intro-outreach",
"dedupeKey": "intro-alice-001",
"payload": { "firstName": "Alice" },
"sendReason": "initial outreach",
"mailboxId": "mbx_abc123"
}What you get
Automatic Threading
Threads are created and matched without any code on your side. Send an email, get a thread.
Reply Linking
In-Reply-To headers first, sender-recipient fallback second. Replies land in the right thread.
Per-Mailbox Organization
Each agent mailbox gets its own threads, sent view, inbox, and approval queue in the portal. No cross-contamination.
Override Queues
Three queues: needs approval, blocked by policy, high risk. Operators can approve, reject, edit, or escalate from each one.
Status Lifecycle
Open, waiting, resolved, escalated. Transitions happen automatically. SLA tracking is included.
Audit Trail
Every override action is an immutable event. When compliance asks what happened, you have the answer.
The whole thread in one response
Every outbound send and inbound reply, in order. Your agent doesn't need to reconstruct context from scattered data. It's all here.
GET /v1/agent/threads/:id
{
"id": "thread-uuid",
"contactEmail": "alice@example.com",
"status": "open",
"messageCount": 4,
"messages": [
{
"direction": "outbound",
"subject": "Intro",
"bodyText": "Hi Alice...",
"createdAt": "2026-02-24T10:00:00Z"
},
{
"direction": "inbound",
"subject": "Re: Intro",
"bodyText": "Thanks, interested...",
"createdAt": "2026-02-25T14:00:00Z"
}
]
}Conversations, not isolated messages
Threading, reply linking, status tracking, and override queues. Your agent gets context. Your operators get control. Everything is auditable.
Related features