Skip to main content
POST
Have the AI read again a reply it could not read

Authorizations

X-API-Key
string
header
required

Path Parameters

thread_id
string<uuid>
required

Query Parameters

dry_run
boolean
default:false

Answer the conversation as Try again would leave it, and change nothing.

Response

Successful Response

came_back
boolean
required

Back in the Inbox because our answer went three business days unanswered: returns_at has passed.

channel
enum<string>
required

Which surface a conversation happens on.

Threads are contact-scoped, not channel-scoped, so this says how a thread is REACHED rather than partitioning the inbox: a reply arrives, is classified and stops the cadence identically either way, and only the send path differs.

Available options:
email,
linkedin
contact_email
string | null
required
contact_key
string
required
contact_name
string
required
created_at
string<date-time>
required
follow_up_expected
boolean
required

Whether an answer of ours they leave unanswered would come back to the Inbox: the contact has written, and the verdict on their latest reply, by the classifier or a label a person set, does not say the conversation is over.

id
string<uuid>
required
is_bounce
boolean
required
is_done
boolean
required

Marked done, and no new message has reached us since: out of the Inbox. Their reply, or an answer of ours, arriving after the mark ends it, whatever time the message gives itself; an auto-reply, a bounce, a forward or a reply still waiting on Tasks does not.

is_out_of_office
boolean
required
is_unread
boolean
required
label_ids
string<uuid>[]
required
last_message_at
string<date-time>
required
last_snippet
string
required
listed_at
string<date-time>
required

The moment the list sorts this conversation by: its last message, or later when a reminder went off or, on the Inbox's own views, when it came back from silence. The time to show beside the row.

mailbox_id
string<uuid> | null
required
message_count
integer
required
sequence_id
string<uuid> | null
required

The sequence the conversation is filed under: the one its newest reply answers, else the first that wrote to the contact.

step_id
string<uuid> | null
required
subject
string
required
updated_at
string<date-time>
required
blocked_reply
ThreadBlockedReplySchema · object | null

The conversation's newest reply, which its sequence's agent would answer and wrote no draft for, and why, while nothing of ours answered it and no question_card asks instead: the conversation says "No draft for this reply", and POST /inbox/threads/{thread_id}/blocked-reply/retry/ has the agent write it now. Only the single-thread read sets it; the list leaves it null.

can_reply_on_linkedin
boolean
default:false

Whether an explicit channel='linkedin' reply can go out on this thread, because it carries a LinkedIn member identity and a paired account. The composer's channel toggle keys off this.

contact_linkedin_url
string | null

The contact's LinkedIn profile URL, when our own evidence (invitation ledger, dispatched actions, or the sequence's mapped column) names one. Only the SINGLE-thread read resolves it; the list leaves it null.

contact_replied
boolean | null

Whether the contact has written back in this thread: a person's reply, never an auto-reply, a bounce or a robot's acknowledgement. False on a send nobody answered, which the working views never list. Only the thread LIST populates it; single-thread reads leave it null.

contact_status_live
boolean
default:false

Whether the contact is still moving through the sequence (their word is one of the Audience tab's In progress words), so its follow-ups may still go out. False when it is waiting on an approval, paused, done or blocked, and on the list, which never resolves it.

contact_status_word
string | null

The contact's status in this thread's sequence, in the word the sequence's Audience tab shows for them (Finished, Failed, Paused, Replied, In progress, Needs approval...). Set with enrolment_id; only the SINGLE-thread read resolves it, the list leaves it null.

done_at
string<date-time> | null

When a person marked the conversation done. is_done says whether the mark still holds.

enrolment_id
string<uuid> | null

The contact's enrolment in this thread's sequence, when it has one: the id the 'Resume cadence' action targets.

has_open_questions
boolean
default:false

The agent asks questions before it answers a reply here, so the conversation waits in Needs approval. Only the thread LIST populates it; single-thread reads leave it False and carry question_card instead.

has_pending_draft
boolean
default:false

An AI reply is waiting for approval on this thread: the list row's 'Action required' mark. Only the thread LIST populates it; single-thread reads leave it False and the open conversation fetches the draft itself.

linkedin_account_status
enum<string> | null

The pairing state of the LinkedIn account this thread replies from. Anything but 'active' blocks queueing a LinkedIn reply: 'revoked' was disconnected and 'pending' never bound a member. Only the SINGLE-thread read resolves it; the list leaves it null, as does a thread with no LinkedIn account or one whose account row is gone.

Available options:
pending,
active,
revoked
linkedin_checkpoint_status
enum<string> | null

Whether LinkedIn is currently challenging that account. Single-thread read only; the list leaves it null.

Available options:
ok,
checkpoint
linkedin_last_seen_at
string<date-time> | null

When a browser on that account last checked in; null when none ever has. Single-thread read only; the list leaves it null.

linkedin_presence
enum<string> | null

How recently a browser on that account checked in: active, idle or not seen. Carried beside the status rather than blanked for a non-active account (the senders list does that), because the composer shows the two as separate facts. Single-thread read only; the list leaves it null.

Available options:
active,
idle,
not_seen
linkedin_queue_expiry_days
integer | null

Always null. The wait window was retired: a queued LinkedIn reply now waits for a person, or for a browser, without expiring. The field stays so older clients still find it; a null hides the composer's sentence about it.

linkedin_sender_profile_id
string<uuid> | null

The sender the LinkedIn account belongs to, so the composer can send a person to that sender's LinkedIn tab to reconnect. Single-thread read only; the list leaves it null.

match_excerpt
string | null

The matched message, headlined around the match. Only set when searching.

pending_draft_id
string<uuid> | null

Which AI reply waits for approval here, by its draft id: what a bulk Approve and send names, so the reply it sends is the one that was read. Only the thread LIST populates it, like has_pending_draft.

question_card
ThreadQuestionCardSchema · object | null

What the agent needs before it answers the conversation's newest reply it could not answer alone, while nobody answered it, the contact did not write again and the agent still writes replies to it: "Before I answer, I need to know" with a box per question, or the reason a person must answer. Only the single-thread read sets it; the list leaves it null.

returns_at
string<date-time> | null

When this conversation comes back to the Inbox if the contact stays quiet: three business days after our latest answer, at the same time of day, counted in the sender's timezone. In the past once it has come back (came_back). Null when it will not: they have the last word, the verdict on their latest reply, by the classifier or a label a person set, says the conversation is over (Negative, Meeting booked, Meeting completed, Closed or Wrong contact), or it is done.

rewriting_draft
ThreadRewritingDraftSchema · object | null

The reply a sequence's agent wrote, retired to be written again (a Needs work, or Write again), while it is the conversation's newest draft: nothing was written in its place yet, or the rewrite wrote nothing usable. Its thumbs-down event says which. Only the single-thread read sets it; the list leaves it null.

snoozed_until
string<date-time> | null

Hidden from the working views until this instant.

stop_reason
enum<string> | null

Set when the cadence is stopped (reply, unsubscribe, bounce, ...). None for a live or normally-completed enrolment. Only 'reply' is resumable through the sequence; 'unread_reply' is resumed from this conversation's unread-reply card.

Available options:
reply,
unsubscribe,
bounce,
manual,
company_reply,
row_left_audience,
row_left_paused,
step_removed,
removed,
cooldown,
rejected,
mailbox_removed,
unread_reply,
declined,
trashed,
trashed_paused
stop_request
ThreadStopRequestSchema · object | null

The newest reply the AI read as asking never to be contacted again, while nobody undid it and it still keeps the contact on do-not-contact or stopped somewhere for good: the conversation says "Asked not to be contacted again" with Undo. Only the single-thread read sets it; the list leaves it null.

unread_reply_id
string<uuid> | null

The reply the AI could not read, a second try included, while it is the conversation's newest reply and nothing answered it: the conversation shows "Couldn't read this reply" with Try again. Only the single-thread read sets it; the list leaves it null.

waiting_since
string<date-time> | null

When the reply waiting on a person here was sent: the message a waiting AI reply answers, or the oldest reply the agent's questions wait on, the older when both do. Needs approval shows it as how long the contact has waited. Only the thread LIST populates it; null when nothing waits on a person, and on single-thread reads.