Get the conversation an email belongs to
Changed onReturns the full conversation the given inbound email belongs to, as ordered, ready-to-prompt turns WITH bodies. It resolves the thread from the email and returns every message oldest-first, so an agent that received an email can pass messages straight to a chat model in one call instead of walking /threads/{id} plus /emails/{id} and /sent-emails/{id} per message.
Each message carries a direction (inbound | outbound) and a derived role: inbound -> user, outbound -> assistant (your own prior replies). The role mapping assumes the caller owns the outbound side, which is the agent-reply case this exists for. If the email has no thread yet (a brand-new message), the conversation is just that one message as a single user turn.
The message list is capped; check truncated to detect when older messages were omitted. Consecutive same-role turns are not merged here; that normalization is model-specific and left to the caller.
Pass since for an incremental read. since=start returns the full conversation plus a cursor. Sending that cursor back as since returns only the messages created or changed after it, oldest first, with the same per-message shape, and a new cursor. Without since the response carries no cursor and no per-message status.
To read an older part of a long conversation, such as the message a search result names, pass around with that message's id: the response is a window of messages around it with before_cursor and after_cursor to page older and newer. On these window reads {id} may be a sent email id as well as an inbound email id.
Request
- Base URLhttps://api.primitive.dev/v1
- URLhttps://api.primitive.dev/v1/emails/{id}/conversation
- AuthHTTP bearer
Query parameters
Incremental read position. Either the literal start or a cursor returned by a previous read of this endpoint. Any other value returns 400 validation_error.
With start, the response holds every message the read without since would return, plus cursor. With a cursor, messages holds only the messages created or changed after it, oldest first. A change includes an inbound message becoming visible or its body being filled, withheld or discarded, and a delivery status change on an outbound message. thread_id, subject, message_count and truncated always describe the whole conversation, not the returned messages.
The cursor is an opaque string. Send it back verbatim and do not parse it or build one; its format can change. A message can be returned again by a later read (for example while older writes are still committing), so upsert messages by id. Deleted messages are not reported; a periodic since=start read (or a read without since) reconciles.
Window read centred on one message: returns up to limit messages before it, the message itself, and up to limit after it, oldest first, so a client can open an older message (for example a search result) inside its conversation. The value is the id of an inbound email or a sent email in the same conversation as {id}. On a window read {id} may itself be a sent email id. Every message is scoped and withheld exactly as on the full read. A message that is not in this conversation, or that the credential cannot read, returns 404 not_found whether or not it exists elsewhere. A malformed around, before, after or limit, or more than one of since, around, before and after, returns 400 validation_error.
Window read of up to limit messages strictly older than the position named by a before_cursor from an earlier window read. Pass it back unchanged; its format may change, so do not parse or construct it. Cannot be combined with since, around or after.
Window read of up to limit messages strictly newer than the position named by an after_cursor from an earlier window read. Pass it back unchanged; its format may change, so do not parse or construct it. Cannot be combined with since, around or before.
Window reads only: messages on each side of around, or per before / after page. Ignored on any other read.
Set to readable to get each message's text sized for reading: every link target is replaced by the word [link], and the quoted history a reply repeats is removed, so each earlier message appears once. The response then carries quoted_chars_removed. Works with every read of this endpoint. For link targets, read an inbound message with GET /emails/{id}/readable?links=all, and an outbound one with GET /sent-emails/{id}, whose body has them (the readable read takes received email only). Any other value returns 400 validation_error.
Response
Conversation
Changes
- breaking
the response property
////became nullable for the status - warning
added the new
access_mode_unavailableenum value to the/response property for the response status - warning
added the new
access_mode_unavailableenum value to the/response property for the response status - warning
added the new
access_mode_unavailableenum value to the/response property for the response status - warning
added the new
builtin_roleenum value to the/response property for the response status - warning
added the new
builtin_roleenum value to the/response property for the response status - warning
added the new
builtin_roleenum value to the/response property for the response status - warning
added the new
cleanup_incompleteenum value to the/response property for the response status - warning
added the new
cleanup_incompleteenum value to the/response property for the response status - warning
added the new
cleanup_incompleteenum value to the/response property for the response status - warning
added the new
cli_access_refusedenum value to the/response property for the response status - warning
added the new
cli_access_refusedenum value to the/response property for the response status - warning
added the new
cli_access_refusedenum value to the/response property for the response status - warning
added the new
confirmation_requiredenum value to the/response property for the response status - warning
added the new
confirmation_requiredenum value to the/response property for the response status - warning
added the new
confirmation_requiredenum value to the/response property for the response status - warning
added the new
connection_owner_address_requiredenum value to the/response property for the response status - warning
added the new
connection_owner_address_requiredenum value to the/response property for the response status - warning
added the new
connection_owner_address_requiredenum value to the/response property for the response status - warning
added the new
email_rule_author_onlyenum value to the/response property for the response status - warning
added the new
email_rule_author_onlyenum value to the/response property for the response status - warning
added the new
email_rule_author_onlyenum value to the/response property for the response status - warning
added the new
email_rule_compiler_unavailableenum value to the/response property for the response status - warning
added the new
email_rule_compiler_unavailableenum value to the/response property for the response status - warning
added the new
email_rule_compiler_unavailableenum value to the/response property for the response status - warning
added the new
email_rule_conflictenum value to the/response property for the response status - warning
added the new
email_rule_conflictenum value to the/response property for the response status - warning
added the new
email_rule_conflictenum value to the/response property for the response status - warning
added the new
email_rule_not_compiledenum value to the/response property for the response status - warning
added the new
email_rule_not_compiledenum value to the/response property for the response status - warning
added the new
email_rule_not_compiledenum value to the/response property for the response status - warning
added the new
grant_forbiddenenum value to the/response property for the response status - warning
added the new
grant_forbiddenenum value to the/response property for the response status - warning
added the new
grant_forbiddenenum value to the/response property for the response status - warning
added the new
keep_refusedenum value to the/response property for the response status - warning
added the new
keep_refusedenum value to the/response property for the response status - warning
added the new
keep_refusedenum value to the/response property for the response status - warning
added the new
last_ownerenum value to the/response property for the response status - warning
added the new
last_ownerenum value to the/response property for the response status - warning
added the new
last_ownerenum value to the/response property for the response status - warning
added the new
mailbox_not_claimableenum value to the/response property for the response status - warning
added the new
mailbox_not_claimableenum value to the/response property for the response status - warning
added the new
mailbox_not_claimableenum value to the/response property for the response status - warning
added the new
mailbox_shared_with_othersenum value to the/response property for the response status - warning
added the new
mailbox_shared_with_othersenum value to the/response property for the response status - warning
added the new
mailbox_shared_with_othersenum value to the/response property for the response status - warning
added the new
member_address_reservedenum value to the/response property for the response status - warning
added the new
member_address_reservedenum value to the/response property for the response status - warning
added the new
member_address_reservedenum value to the/response property for the response status - warning
added the new
plan_requiredenum value to the/response property for the response status - warning
added the new
plan_requiredenum value to the/response property for the response status - warning
added the new
plan_requiredenum value to the/response property for the response status - warning
added the new
redeploy_failedenum value to the/response property for the response status - warning
added the new
redeploy_failedenum value to the/response property for the response status - warning
added the new
redeploy_failedenum value to the/response property for the response status - warning
added the new
removal_failedenum value to the/response property for the response status - warning
added the new
removal_failedenum value to the/response property for the response status - warning
added the new
removal_failedenum value to the/response property for the response status - warning
added the new
removal_timeoutenum value to the/response property for the response status - warning
added the new
removal_timeoutenum value to the/response property for the response status - warning
added the new
removal_timeoutenum value to the/response property for the response status - warning
added the new
role_assignedenum value to the/response property for the response status - warning
added the new
role_assignedenum value to the/response property for the response status - warning
added the new
role_assignedenum value to the/response property for the response status - warning
added the new
role_assignment_unavailableenum value to the/response property for the response status - warning
added the new
role_assignment_unavailableenum value to the/response property for the response status - warning
added the new
role_assignment_unavailableenum value to the/response property for the response status - warning
added the new
role_key_takenenum value to the/response property for the response status - warning
added the new
role_key_takenenum value to the/response property for the response status - warning
added the new
role_key_takenenum value to the/response property for the response status - warning
added the new
rotation_in_progressenum value to the/response property for the response status - warning
added the new
rotation_in_progressenum value to the/response property for the response status - warning
added the new
rotation_in_progressenum value to the/response property for the response status - warning
added the new
rotation_incompleteenum value to the/response property for the response status - warning
added the new
rotation_incompleteenum value to the/response property for the response status - warning
added the new
rotation_incompleteenum value to the/response property for the response status - warning
added the new
step_up_invalidenum value to the/response property for the response status - warning
added the new
step_up_invalidenum value to the/response property for the response status - warning
added the new
step_up_invalidenum value to the/response property for the response status - warning
added the new
step_up_not_acceptedenum value to the/response property for the response status - warning
added the new
step_up_not_acceptedenum value to the/response property for the response status - warning
added the new
step_up_not_acceptedenum value to the/response property for the response status - warning
added the new
step_up_refusedenum value to the/response property for the response status - warning
added the new
step_up_refusedenum value to the/response property for the response status - warning
added the new
step_up_refusedenum value to the/response property for the response status - warning
added the new
step_up_requiredenum value to the/response property for the response status - warning
added the new
step_up_requiredenum value to the/response property for the response status - warning
added the new
step_up_requiredenum value to the/response property for the response status - warning
added the new
template_roleenum value to the/response property for the response status - warning
added the new
template_roleenum value to the/response property for the response status - warning
added the new
template_roleenum value to the/response property for the response status - warning
added the new
upstream_unavailableenum value to the/response property for the response status - warning
added the new
upstream_unavailableenum value to the/response property for the response status - warning
added the new
upstream_unavailableenum value to the/response property for the response status
This list may be incomplete.
- breaking
- warning
added the new
agent_changedenum value to the/response property for the response status - warning
added the new
agent_changedenum value to the/response property for the response status - warning
added the new
agent_changedenum value to the/response property for the response status - warning
added the new
agent_limitenum value to the/response property for the response status - warning
added the new
agent_limitenum value to the/response property for the response status - warning
added the new
agent_limitenum value to the/response property for the response status - warning
added the new
already_memberenum value to the/response property for the response status - warning
added the new
already_memberenum value to the/response property for the response status - warning
added the new
already_memberenum value to the/response property for the response status - warning
added the new
directory_limitenum value to the/response property for the response status - warning
added the new
directory_limitenum value to the/response property for the response status - warning
added the new
directory_limitenum value to the/response property for the response status - warning
added the new
invitation_acceptedenum value to the/response property for the response status - warning
added the new
invitation_acceptedenum value to the/response property for the response status - warning
added the new
invitation_acceptedenum value to the/response property for the response status - warning
added the new
invitation_changedenum value to the/response property for the response status - warning
added the new
invitation_changedenum value to the/response property for the response status - warning
added the new
invitation_changedenum value to the/response property for the response status - warning
added the new
invitation_pendingenum value to the/response property for the response status - warning
added the new
invitation_pendingenum value to the/response property for the response status - warning
added the new
invitation_pendingenum value to the/response property for the response status - warning
added the new
invitation_sendingenum value to the/response property for the response status - warning
added the new
invitation_sendingenum value to the/response property for the response status - warning
added the new
invitation_sendingenum value to the/response property for the response status - warning
added the new
invitation_unconfirmedenum value to the/response property for the response status - warning
added the new
invitation_unconfirmedenum value to the/response property for the response status - warning
added the new
invitation_unconfirmedenum value to the/response property for the response status - warning
added the new
invitations_pendingenum value to the/response property for the response status - warning
added the new
invitations_pendingenum value to the/response property for the response status - warning
added the new
invitations_pendingenum value to the/response property for the response status - warning
added the new
member_changedenum value to the/response property for the response status - warning
added the new
member_changedenum value to the/response property for the response status - warning
added the new
member_changedenum value to the/response property for the response status - warning
added the new
project_changedenum value to the/response property for the response status - warning
added the new
project_changedenum value to the/response property for the response status - warning
added the new
project_changedenum value to the/response property for the response status - warning
added the new
recipient_changedenum value to the/response property for the response status - warning
added the new
recipient_changedenum value to the/response property for the response status - warning
added the new
recipient_changedenum value to the/response property for the response status
- warning