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.

Vertical thread view showing alternating sent and received email messages connected by a conversation thread

How threads are built

1

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.

2

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.

3

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.

4

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.

5

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.