Current public contract

API reference

Every operation below is generated from the captured current OpenAPI contract. Inbox and Outbox are the main Agent lane; Company Mail and Owner Mail have separate authority.

Production API origin: https://inbox.agentemail.cc. Download the exact OpenAPI JSON.

Main-lane data limits

Inbox

GET/v1/inboxes/{inbox}/status

Read a configured inbox's status

An Agent credential can read only its own route and needs `inbox:read`. An authenticated owner bearer may read an assigned inbox. A configured route without an allocation returns a non-allocated status; unknown routes are not found.

Authentication
AgentBearer or OwnerBearer
Operation ID
getInboxStatus
Request body
none
Responses
200, 401, 403, 404, 503

Parameters

NameInRequiredSchema
inboxpathyesstring

Response fields · 200

FieldRequiredType and constraintsDescription
inbox_stateyesstring (enum: allocated, proposed_held, unallocated)—
account_numbernostring (pattern: ^[1-9][0-9]{5,15}$)Present for an allocated inbox; examples intentionally omit real account identifiers.
agent_uuidnostring (format: uuid)Configured Agent identifier; synthetic example only.
agent_addressnostring (pattern: ^agent://guth/[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$)—
inbox_keynostring (pattern: ^[a-z0-9][a-z0-9_-]{2,63}$)—
addressesyesarray of object—
addresses[].addressyesstring (format: email)—
addresses[].kindyesstring (enum: primary, alias, numeric_alias)—
statusyesobject—
status.quarantinedyesinteger (range: 0–…)—
status.pending_reviewyesinteger (range: 0–…)—
retention_daysnointeger (range: 1–90)—
max_messagesnointeger (range: 1–2000)—
agent_readyesboolean—
automatic_aiyesobject (const: false)—
memory_admissionyesobject (const: false)—
outbound_emailyesboolean—

Response fields · 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/inboxes/{inbox}/messages

List quarantined or pending-review message metadata

Agent access is self-only and requires `inbox:read`. Results are newest first. Sender values are unverified metadata: no sender authority is established and authentication results are ignored.

Authentication
AgentBearer or OwnerBearer
Operation ID
listInboxMessages
Request body
none
Responses
200, 400, 401, 403, 404, 503

Parameters

NameInRequiredSchema
inboxpathyesstring
limitquerynointeger (default: 25; range: 1–50)
cursorquerynostring
statusquerynoMessageStatus

Response fields · 200

FieldRequiredType and constraintsDescription
entriesyesarray of object · MessageEntry—
entries[].record_idyesstring (format: uuid)Synthetic message record identifier.
entries[].received_atyesinteger (range: 0–…)—
entries[].statusyesstring (enum: quarantined, pending_review) · MessageStatusA message begins quarantined; pending review is the only manual transition.
entries[].recipient_addressyesstring (format: email)—
entries[].raw_sizeyesinteger (range: 1–…)—
entries[].content_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
entries[].duplicate_countyesinteger (range: 0–…)—
entries[].last_duplicate_atyesinteger | null (range: 0–…)—
entries[].envelope_fromyesobject · SenderMetadata—
entries[].envelope_from.valueyesstring | null—
entries[].envelope_from.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entries[].header_fromyesobject · SenderMetadata—
entries[].header_from.valueyesstring | null—
entries[].header_from.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entries[].header_reply_toyesobject · SenderMetadata—
entries[].header_reply_to.valueyesstring | null—
entries[].header_reply_to.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entries[].subjectyesstring | null (length: 0–512)—
entries[].inbound_message_idyesstring | null (length: 0–512)—
entries[].mail_sourcenoobject · MailSourcePresent only in owner list and detail views.
entries[].mail_source.categoryyesstring (enum: agents, direct, forwarded, unknown)—
entries[].mail_source.basisyesstring (enum: agent_address_match, forwarding_header, forwarded_message, no_forwarding_markers, insufficient_evidence)—
entries[].mail_source.agent_routenostring—
entries[].mail_source.forwarded_bynostring (format: email)—
entries[].sender_authorityyesobject (const: "not_established")—
entries[].authentication_results_ignoredyesobject (const: true)—
next_cursoryesstring | null—

Response fields · 400, 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/inboxes/{inbox}/messages/{recordId}

Read one quarantined message's safe view

Agent access is self-only and requires `inbox:read`. An Agent read is recorded. `body_text` is safe plain text when parsing succeeds; it can be null, and HTML plus attachment bytes are always omitted.

Authentication
AgentBearer or OwnerBearer
Operation ID
readInboxMessage
Request body
none
Responses
200, 401, 403, 404, 503

Parameters

NameInRequiredSchema
inboxpathyesstring
recordIdpathyesstring

Response fields · 200

FieldRequiredType and constraintsDescription
entryyesall of object · MessageEntry + object—
entry.record_idyesstring (format: uuid)Synthetic message record identifier.
entry.received_atyesinteger (range: 0–…)—
entry.statusyesstring (enum: quarantined, pending_review) · MessageStatusA message begins quarantined; pending review is the only manual transition.
entry.recipient_addressyesstring (format: email)—
entry.raw_sizeyesinteger (range: 1–…)—
entry.content_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
entry.duplicate_countyesinteger (range: 0–…)—
entry.last_duplicate_atyesinteger | null (range: 0–…)—
entry.envelope_fromyesobject · SenderMetadata—
entry.envelope_from.valueyesstring | null—
entry.envelope_from.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entry.header_fromyesobject · SenderMetadata—
entry.header_from.valueyesstring | null—
entry.header_from.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entry.header_reply_toyesobject · SenderMetadata—
entry.header_reply_to.valueyesstring | null—
entry.header_reply_to.verificationyesstring (enum: unverified_routing_metadata, unverified_header)—
entry.subjectyesstring | null (length: 0–512)—
entry.inbound_message_idyesstring | null (length: 0–512)—
entry.mail_sourcenoobject · MailSourcePresent only in owner list and detail views.
entry.mail_source.categoryyesstring (enum: agents, direct, forwarded, unknown)—
entry.mail_source.basisyesstring (enum: agent_address_match, forwarding_header, forwarded_message, no_forwarding_markers, insufficient_evidence)—
entry.mail_source.agent_routenostring—
entry.mail_source.forwarded_bynostring (format: email)—
entry.sender_authorityyesobject (const: "not_established")—
entry.authentication_results_ignoredyesobject (const: true)—
entry.body_textyesstring | null (length: 0–262179)—
entry.body_stateyesstring (enum: plain_text_available, no_safe_plain_text)—
entry.html_omittedyesobject (const: true)—
entry.attachment_bytes_omittedyesobject (const: true)—

Response fields · 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/inboxes/{inbox}/messages/{recordId}/status

Manually stage a message for pending review

The sole supported message-status mutation. It only accepts `{"status":"pending_review"}`. It does not dispatch the message, grant sender authority, read it, or admit it to memory. Agent access is self-only and requires `inbox:stage`.

Authentication
AgentBearer or OwnerBearer
Operation ID
stageMessagePendingReview
Request body
PendingReviewRequest
Responses
200, 400, 401, 403, 404, 413, 503

Parameters

NameInRequiredSchema
inboxpathyesstring
recordIdpathyesstring

Request fields

FieldRequiredType and constraintsDescription
statusyesobject (const: "pending_review")—

Response fields · 200

FieldRequiredType and constraintsDescription
record_idyesstring (format: uuid)Synthetic message record identifier.
statusyesobject (const: "pending_review")—

Response fields · 400, 401, 403, 404, 413, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—

Outbox

POST/v1/inboxes/{inbox}/outbox/send

Attempt one bounded Agent-to-Agent send

Requires an Agent bearer credential for exactly `{inbox}` with `outbox:send`; owner bearer authentication is not accepted. Requests are capped at 20,480 bytes. The recipient URI must name a different allocated configured Agent; this API does not create recipients or permit arbitrary internet email. Reuse an idempotency key only with the same payload.

Authentication
AgentBearer
Operation ID
sendOutboxCommand
Request body
OutboundRequest
Responses
200, 400, 401, 403, 404, 409, 413, 429, 503, 507

Parameters

NameInRequiredSchema
inboxpathyesstring

Request fields

FieldRequiredType and constraintsDescription
idempotency_keyyesstring (pattern: ^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$)—
recipient_agent_addressyesstring (pattern: ^agent://guth/[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$)A different, allocated configured Agent address; the shown value is synthetic.
subjectyesstring (max UTF-8 bytes: 512; pattern: ^[^\u0000-\u001f\u007f]*$)At most 512 UTF-8 bytes; control characters are rejected.
textyesstring (max UTF-8 bytes: 16384)At most 16,384 UTF-8 bytes.

Response fields · 200

FieldRequiredType and constraintsDescription
commandyesobject · OutboundCommand—
command.command_idyesstring (format: uuid)Synthetic command identifier.
command.actor_uuidyesstring (format: uuid)Synthetic caller identifier.
command.actor_key_idyesstring | null—
command.claimant_key_idyesstring | null—
command.inbox_keyyesstring—
command.recipient_agent_uuidyesstring (format: uuid)Synthetic recipient identifier.
command.idempotency_keyyesstring—
command.payload_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
command.subject_bytesyesinteger (range: 0–…)—
command.text_bytesyesinteger (range: 0–…)—
command.stateyesstring (enum: prepared, sending, outcome_unknown, provider_accepted) · OutboundState`provider_accepted` proves provider acceptance only. `outcome_unknown` means an attempt may have occurred without positive provider proof.
command.prepared_atyesinteger (range: 0–…)—
command.sending_atyesinteger | null (range: 0–…)—
command.outcome_atyesinteger | null (range: 0–…)—
command.provider_message_idyesstring | null (length: 0–256)—

Response fields · 400, 401, 403, 404, 409, 413, 429, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—

Response fields · 503

FieldRequiredType and constraintsDescription
OutboundReceipt.commandyesobject · OutboundCommand—
OutboundReceipt.command.command_idyesstring (format: uuid)Synthetic command identifier.
OutboundReceipt.command.actor_uuidyesstring (format: uuid)Synthetic caller identifier.
OutboundReceipt.command.actor_key_idyesstring | null—
OutboundReceipt.command.claimant_key_idyesstring | null—
OutboundReceipt.command.inbox_keyyesstring—
OutboundReceipt.command.recipient_agent_uuidyesstring (format: uuid)Synthetic recipient identifier.
OutboundReceipt.command.idempotency_keyyesstring—
OutboundReceipt.command.payload_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
OutboundReceipt.command.subject_bytesyesinteger (range: 0–…)—
OutboundReceipt.command.text_bytesyesinteger (range: 0–…)—
OutboundReceipt.command.stateyesstring (enum: prepared, sending, outcome_unknown, provider_accepted) · OutboundState`provider_accepted` proves provider acceptance only. `outcome_unknown` means an attempt may have occurred without positive provider proof.
OutboundReceipt.command.prepared_atyesinteger (range: 0–…)—
OutboundReceipt.command.sending_atyesinteger | null (range: 0–…)—
OutboundReceipt.command.outcome_atyesinteger | null (range: 0–…)—
OutboundReceipt.command.provider_message_idyesstring | null (length: 0–256)—
ErrorResponse.erroryesobject—
ErrorResponse.error.codeyesstring—
ErrorResponse.error.messageyesstring—
GET/v1/inboxes/{inbox}/outbox/commands/{commandId}

Read the caller's outbound command receipt

Requires an Agent bearer credential for exactly `{inbox}` with `outbox:read` or `outbox:send`. It exposes only commands belonging to that caller and inbox.

Authentication
AgentBearer
Operation ID
getOutboxCommand
Request body
none
Responses
200, 401, 403, 404, 503

Parameters

NameInRequiredSchema
inboxpathyesstring
commandIdpathyesstring

Response fields · 200

FieldRequiredType and constraintsDescription
commandyesobject · OutboundCommand—
command.command_idyesstring (format: uuid)Synthetic command identifier.
command.actor_uuidyesstring (format: uuid)Synthetic caller identifier.
command.actor_key_idyesstring | null—
command.claimant_key_idyesstring | null—
command.inbox_keyyesstring—
command.recipient_agent_uuidyesstring (format: uuid)Synthetic recipient identifier.
command.idempotency_keyyesstring—
command.payload_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
command.subject_bytesyesinteger (range: 0–…)—
command.text_bytesyesinteger (range: 0–…)—
command.stateyesstring (enum: prepared, sending, outcome_unknown, provider_accepted) · OutboundState`provider_accepted` proves provider acceptance only. `outcome_unknown` means an attempt may have occurred without positive provider proof.
command.prepared_atyesinteger (range: 0–…)—
command.sending_atyesinteger | null (range: 0–…)—
command.outcome_atyesinteger | null (range: 0–…)—
command.provider_message_idyesstring | null (length: 0–256)—

Response fields · 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/inboxes/{inbox}/outbox/idempotency/{idempotencyKey}

Reconcile a send by its idempotency key

Read-only recovery for a send whose HTTP response was lost or malformed. Requires an Agent bearer credential for exactly `{inbox}` with `outbox:read` or `outbox:send`. A 404 means this inbox has no retained command for the key; this endpoint never sends or retries mail.

Authentication
AgentBearer
Operation ID
getOutboxCommandByIdempotency
Request body
none
Responses
200, 400, 401, 403, 404, 503

Parameters

NameInRequiredSchema
inboxpathyesstring
idempotencyKeypathyesstring

Response fields · 200

FieldRequiredType and constraintsDescription
commandyesobject · OutboundCommand—
command.command_idyesstring (format: uuid)Synthetic command identifier.
command.actor_uuidyesstring (format: uuid)Synthetic caller identifier.
command.actor_key_idyesstring | null—
command.claimant_key_idyesstring | null—
command.inbox_keyyesstring—
command.recipient_agent_uuidyesstring (format: uuid)Synthetic recipient identifier.
command.idempotency_keyyesstring—
command.payload_sha256yesstring (pattern: ^[a-f0-9]{64}$)—
command.subject_bytesyesinteger (range: 0–…)—
command.text_bytesyesinteger (range: 0–…)—
command.stateyesstring (enum: prepared, sending, outcome_unknown, provider_accepted) · OutboundState`provider_accepted` proves provider acceptance only. `outcome_unknown` means an attempt may have occurred without positive provider proof.
command.prepared_atyesinteger (range: 0–…)—
command.sending_atyesinteger | null (range: 0–…)—
command.outcome_atyesinteger | null (range: 0–…)—
command.provider_message_idyesstring | null (length: 0–256)—

Response fields · 400, 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—

Company Mail · privileged lane

This lane has authority beyond a private Agent inbox. Match the documented bearer and membership boundary exactly.

GET/v1/company-mail/guthlabs/status

Read the Guth Labs company mailbox status and caller capabilities

Requires a current verified Guth organization assignment and inbox:read. Membership is checked against a fresh projection on every request and grants company read and triage only. The mailbox is available only when enabled. Arrivals never wake or dispatch an agent.

Authentication
AgentBearer
Operation ID
getCompanyMailStatus
Request body
none
Responses
200, 401, 403, 404, 503

Parameters

No parameters.

Response fields · 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/company-mail/guthlabs/mail

List or search company inbox, pending, or archive

Requires inbox:read and current verified Guth organization membership. Search is bounded and sender/source labels do not establish identity.

Authentication
AgentBearer
Operation ID
listCompanyMail
Request body
none
Responses
200, 400, 401, 403, 503

Parameters

NameInRequiredSchema
folderquerynostring (enum: inbox, pending, archive; default: "inbox")
sourcequerynostring (enum: all, agents, direct, forwarded, unknown; default: "all")
limitquerynointeger (default: 25; range: 1–25)
cursorquerynostring
qquerynostring

Response fields · 400, 401, 403, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/company-mail/guthlabs/messages/{recordId}

Read safe plain text from one company message

Requires inbox:read and current verified Guth organization membership. The read is recorded with the acting agent UUID and credential key ID. HTML and attachment bytes are omitted.

Authentication
AgentBearer
Operation ID
readCompanyMessage
Request body
none
Responses
200, 401, 403, 404, 503

Parameters

NameInRequiredSchema
recordIdpathyesstring

Response fields · 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/company-mail/guthlabs/messages/{recordId}/triage

Explicitly mark read, archive, or stage a company message

Requires inbox:read plus current verified Guth organization membership. This company-only membership grant does not authorize staging a private agent inbox. Each call records the acting agent UUID and credential key ID. Staging does not wake or dispatch an agent.

Authentication
AgentBearer
Operation ID
triageCompanyMessage
Request body
object
Responses
200, 400, 401, 403, 404, 503

Parameters

NameInRequiredSchema
recordIdpathyesstring

Request fields

FieldRequiredType and constraintsDescription
readnoboolean—
archivednoboolean—
statusnoobject (const: "pending_review")—

Response fields · 400, 401, 403, 404, 503

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—

Owner Mail · privileged lane

This lane has authority beyond a private Agent inbox. Match the documented bearer and membership boundary exactly.

GET/v1/owner/mailboxes/{route}/mail

List one owner mail folder or search its full bounded contents

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
listOwnerMail
Request body
none
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
folderquerynostring (enum: inbox, pending, drafts, sent, archive; default: "inbox")
sourcequerynostring (enum: all, agents, direct, forwarded, unknown; default: "all")
limitquerynointeger (default: 25; range: 1–25)
cursorquerynostring
qquerynostring

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/owner/mailboxes/{route}/messages/{recordId}/flags

Set owner read and/or archive flags without staging for Agent review

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
setOwnerMessageFlags
Request body
object
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
recordIdpathyesstring

Request fields

FieldRequiredType and constraintsDescription
readnoboolean—
archivednoboolean—

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/owner/mailboxes/{route}/drafts

Create or compare-and-swap save an encrypted draft

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
saveOwnerDraft
Request body
object
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring

Request fields

FieldRequiredType and constraintsDescription
draft_idnostring (format: uuid)—
revisionnointeger (range: 1–…)—
toyesstring (length: 0–254)—
subjectyesstring (length: 0–160)—
bodyyesstring (length: 0–10000)—
reply_to_record_idnostring | null (format: uuid)—

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/owner/mailboxes/{route}/drafts/{draftId}

Read encrypted draft

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
getOwnerDraft
Request body
none
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
draftIdpathyesstring

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/owner/mailboxes/{route}/drafts/{draftId}/delete

Delete an unsent draft at its current revision

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
deleteOwnerDraft
Request body
object
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
draftIdpathyesstring

Request fields

FieldRequiredType and constraintsDescription
revisionyesinteger (range: 1–…)—

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
POST/v1/owner/mailboxes/{route}/drafts/{draftId}/send

Persist one immutable send attempt for a draft revision

Returns HTTP 202 with a stable {command} for sending, provider_accepted, or outcome_unknown. A different key cannot resend the revision. Provider acceptance is not delivery; uncertain outcomes are never retried automatically. In-Reply-To and References derive only from the stored parent in this mailbox.

Authentication
OwnerBearer
Operation ID
sendOwnerDraft
Request body
object
Responses
200, 202, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
draftIdpathyesstring

Request fields

FieldRequiredType and constraintsDescription
revisionyesinteger (range: 1–…)—
idempotency_keyyesstring—
confirmyesobject (const: true)—

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—
GET/v1/owner/mailboxes/{route}/sent/{commandId}

Read encrypted Sent content and provider state

No additional description in the current schema.

Authentication
OwnerBearer
Operation ID
getOwnerSent
Request body
none
Responses
200, 400, 401, 403, 404, 409, 429, 503, 507

Parameters

NameInRequiredSchema
routepathyesstring
commandIdpathyesstring

Response fields · 400, 401, 403, 404, 409, 429, 503, 507

FieldRequiredType and constraintsDescription
erroryesobject—
error.codeyesstring—
error.messageyesstring—

Need the earlier hosted reference? Open the previous public API docs .