Skip to main content
POST
Have the agent write a reply it wrote no draft for

Authorizations

X-API-Key
string
header
required

Path Parameters

thread_id
string<uuid>
required

Query Parameters

dry_run
boolean
default:false

Answer the draft as it would stand before its words are written, and write nothing.

Response

Successful Response

body_text
string
required
confidence
enum<string> | null
required

How sure the model is. Shown on the card; no band sends without a person.

Available options:
high,
medium,
low
confidence_reason
string | null
required
generated_body_text
string
required
id
string<uuid>
required
source
enum<string>
required
Available options:
auto_drafted,
on_demand
status
enum<string>
required

Where this reply stands. pending_approval: waiting for a person to approve, edit or discard it. scheduled: a reply an older release scheduled, which nothing sends now; it waits for a person exactly as pending_approval does, and is approved, edited or discarded the same way. sending: it is leaving now and can no longer be changed. send_unknown: it was sent, but the mailbox has not confirmed it yet; it settles on its own as sent or send_failed. send_failed: it did not go; write a fresh reply. sent: it went out. discarded: a person rejected it or asked for a new version. stale: the contact wrote again before anyone answered it.

Available options:
pending_approval,
sent,
discarded,
stale,
scheduled,
sending,
send_unknown,
send_failed
steer_text
string | null
required
subject
string | null
required
thread_id
string<uuid>
required
ask_reason
enum<string> | null

Why an older release held this reply for a person when it would otherwise have sent it, for example low_confidence, always_ask, unverified_sender, different_sender or daily_cap. Every reply waits for a person now, so it is null on every reply written since, and on a reply a person asked for.

Available options:
low_confidence,
findings,
insufficient_data,
policy,
always_ask,
sequence_manual,
step_requires_approval,
daily_cap,
unverified_sender,
suppressed,
different_sender,
label,
question,
consecutive_cap,
thread_cap,
hourly_cap,
org_daily_cap,
stale_inbound,
sequence_gone,
bot_question,
automated_counterparty,
kill_switch,
authentication,
language,
linkedin_only,
send_interrupted,
sender_switched_to_manual
channel
enum<string> | null

The channel the reply goes out on: the one the message it answers came in on, so a contact who answered a LinkedIn conversation by email is answered by email. Null on a reply written before this was recorded, which goes out on the conversation's own channel.

Available options:
email,
linkedin
confidence_score
integer | null

The model's 0-100 calibration, clamped into the categorical band. Null for drafts that predate the field. Presentation only: every decision reads the categorical confidence.

learning_subject_key
string | null

What a Needs work on this reply is filed under: list its events with GET /agent-learnings/thumbs-downs/?subject_key=. One key for every version of the reply (Write again, a Needs work's rewrite, its Undo), so the note a Needs work left on one version is found on the next. Null on a reply no sequence's agent wrote, which has no agent to save a learning for.

mailbox_id
string<uuid> | null

The mailbox an email reply is sent from: the one the email it answers came in to. Null on a LinkedIn reply, on one written before this was recorded, and once that mailbox is removed; each goes out from the conversation's own mailbox.

outbound_message_id
string<uuid> | null

The agent's message this reply came from, when a sequence's agent wrote it. Ratings and the send are recorded against that message too, as a record that saves no learning: only Needs work on the draft does. Null on a reply written in the default voice for a conversation outside any sequence.

rating
enum<string> | null

The human verdict on this draft, when one was given.

Available options:
good,
bad
send_after
string<date-time> | null

When an older release would have sent a scheduled reply; nothing sends it now. Kept on a reply that release sent. Null on a reply that was never scheduled, and on one handed back to a person, edited or approved.

send_outcome
enum<string> | null

How the words a person sent stand to what the AI wrote, decided as they sent it. as_written: the AI's words, unchanged. edited: the person changed them and kept what they say. replaced: the person sent a reply of their own in its place. Null until a person sends it, on a reply an older release sent without one, and on one sent before this was recorded.

Available options:
as_written,
edited,
replaced
sent_by_kind
enum<string> | null

Who sent the reply: person when someone approved it, system on a reply an older release sent without one. Null until it is sent.

Available options:
person,
system