A real inbox, and a person when it needs one.

Your agent reads and answers threaded conversations. When one needs a person, it hands you the thread with a note and stays out until you hand it back.

Conversations, not loose messages.

Mail in and out is grouped into threads per mailbox. read_inbox lists what's open, get_thread returns the whole conversation with each message's intent, and reply answers in place.

read_inbox
read_inbox({ status: "open" }){  "items": [{    "contactEmail": "priya@acme.com",    "subject": "Re: renewal",    "status": "open",    "messageCount": 4  }],  "total": 1}

Hard conversations come to you.

handoff_thread passes a thread to your team with a note. While a person has it, your agent can still read it, but it can't send into it, or email that contact from that mailbox some other way, until the thread is handed back.

handoff_thread
handoff_thread({ thread_id: "3f9a…",  note: "Refund over my limit" }){  "handoff": {    "status": "requested",    "note": "Refund over my limit"  },  "created": true} # once a person takes itreply({ thread_id: "3f9a…", … })409 thread_taken_over

What needs you, in one list.

Everything waiting on a person collects in one place for your team: threads handed over, inbound mail held for review, and sends waiting for approval.

handoffs · held inbound mail · sends waiting for approval

Replies have a deadline.

Inbound mail gets a reply-by time from what it's about: 5 minutes for an interested lead, 30 for a support question. A thread still waiting on a reply past it is escalated, and thread.sla_breached fires.

interested 5 min · security 15 · support 30 · billing 60

Hand it to your agent.

It sets up its own inbox. You decide how much it does on its own.