Documentation menu

API reference

12 operations in email. Raw spec: openapi.json.

PUT/api/v1/boards/{id}/email-identity

PUT /api/boards/{id}/email-identity — set/clear per-board outbound identity fields (from address, display name, reply-to, signature).

Parameters

NameInTypeRequiredDescription
idpathstringYesBoard id

Request body

PutBoardIdentityRequest

Responses

StatusDescription
200
404board not found
409from address already in use

Security: bearer

PUT/api/v1/boards/{id}/inbound-address

PUT /api/boards/{id}/inbound-address — set/clear a board-level address.

Parameters

NameInTypeRequiredDescription
idpathstringYesBoard id

Request body

PutBoardAddressRequest

Responses

StatusDescription
200
404board not found
409address already routed

Security: bearer

GET/api/v1/email/delivery-ledger

GET /api/email/delivery-ledger — the outbound message ledger (queued/sending/sent/dead) with attempts, last error, and counts.

Parameters

NameInTypeRequiredDescription
statusquerystringNoqueued | sending | sent | dead
limitqueryintegerNopage size (default 25, max 100)
cursorquerystringNoopaque next-page cursor

Responses

StatusDescription
200

Security: bearer

GET/api/v1/email/inbound-holds

GET /api/email/inbound-holds — messages waiting for a decision, newest first, with the reason each is held and the engine's proposal when the org runs shadow or autonomous.

Parameters

NameInTypeRequiredDescription
limitquery—NoDefaults to 50, capped at 200.

Responses

StatusDescription
200
403

Security: bearer

POST/api/v1/email/inbound-holds/{id}/decide

POST /api/email/inbound-holds/{id}/decide — the person's decision on one held message. `accept` threads it onto the ticket and leaves a client-visible comment; `refuse` records the refusal. Both write the decision columns, an audit row naming the person, and `email.sender_binding_decided`. A message that is no longer held answers a typed 409, so a decision cannot thread twice.

Parameters

NameInTypeRequiredDescription
idpathstringYesLedger message id

Request body

DecideHeldRequest

Responses

StatusDescription
200
403
404no such message in this org
409already decided
422unknown decision, no ticket to attach to, or a reason over the cap

Security: bearer

GET/api/v1/email/inbound-settings

GET /api/email/inbound-settings — current org catch-all, if configured.

Responses

StatusDescription
200

Security: bearer

PUT/api/v1/email/inbound-settings

PUT /api/email/inbound-settings — upsert the org catch-all route.

Request body

PutInboundSettingsRequest

Responses

StatusDescription
200
409address already routed

Security: bearer

PUT/api/v1/email/outbound-settings

PUT /api/email/outbound-settings — partial update of the org outbound identity, transport selection, and digest policy. Values are validated against their registry declarations before any write.

Request body

PutOutboundSettingsRequest

Responses

StatusDescription
200
422invalid value

Security: bearer

GET/api/v1/email/settings

GET /api/email/settings — the whole mail surface in one read: inbound routes + per-board identities, outbound identity + transport readiness (never credential material), the delivery ledger's enablement bits, and the org digest policy.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/email/test-send

POST /api/email/test-send — renders a branded test message and enqueues it through the configured transport. Refuses with a typed conflict when no transport is configured (the honest not-configured state).

Request body

TestSendRequest

Responses

StatusDescription
200
409transport not configured

Security: bearer

PUT/api/v1/email/transport-credentials

PUT /api/email/transport-credentials — seals the selected transport's credential into the sealed slot (presence-only response). The plaintext exists exactly once, in this request.

Request body

PutTransportCredentialsRequest

Responses

StatusDescription
200
422unknown transport or missing secret

Security: bearer

DELETE/api/v1/email/transport-credentials

DELETE /api/email/transport-credentials?transport=… — removes the sealed credential; the transport then reports not-configured (mail stays queued).

Parameters

NameInTypeRequiredDescription
transportquerystringYespostmark | smtp | ses

Responses

StatusDescription
200
422unknown transport

Security: bearer