API reference
12 operations in email. Raw spec: openapi.json.
PUT
/api/v1/boards/{id}/email-identityPUT /api/boards/{id}/email-identity — set/clear per-board outbound identity fields (from address, display name, reply-to, signature).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Board id |
Request body
PutBoardIdentityRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | board not found |
409 | from address already in use |
Security: bearer
PUT
/api/v1/boards/{id}/inbound-addressPUT /api/boards/{id}/inbound-address — set/clear a board-level address.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Board id |
Request body
PutBoardAddressRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | board not found |
409 | address already routed |
Security: bearer
GET
/api/v1/email/delivery-ledgerGET /api/email/delivery-ledger — the outbound message ledger (queued/sending/sent/dead) with attempts, last error, and counts.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
status | query | string | No | queued | sending | sent | dead |
limit | query | integer | No | page size (default 25, max 100) |
cursor | query | string | No | opaque next-page cursor |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
GET
/api/v1/email/inbound-holdsGET /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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | — | No | Defaults to 50, capped at 200. |
Responses
| Status | Description |
|---|---|
200 | |
403 |
Security: bearer
POST
/api/v1/email/inbound-holds/{id}/decidePOST /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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | Ledger message id |
Request body
DecideHeldRequest
Responses
| Status | Description |
|---|---|
200 | |
403 | |
404 | no such message in this org |
409 | already decided |
422 | unknown decision, no ticket to attach to, or a reason over the cap |
Security: bearer
GET
/api/v1/email/inbound-settingsGET /api/email/inbound-settings — current org catch-all, if configured.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
PUT
/api/v1/email/inbound-settingsPUT /api/email/inbound-settings — upsert the org catch-all route.
Request body
PutInboundSettingsRequest
Responses
| Status | Description |
|---|---|
200 | |
409 | address already routed |
Security: bearer
PUT
/api/v1/email/outbound-settingsPUT /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
| Status | Description |
|---|---|
200 | |
422 | invalid value |
Security: bearer
GET
/api/v1/email/settingsGET /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
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/email/test-sendPOST /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
| Status | Description |
|---|---|
200 | |
409 | transport not configured |
Security: bearer
PUT
/api/v1/email/transport-credentialsPUT /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
| Status | Description |
|---|---|
200 | |
422 | unknown transport or missing secret |
Security: bearer
DELETE
/api/v1/email/transport-credentialsDELETE /api/email/transport-credentials?transport=… — removes the sealed credential; the transport then reports not-configured (mail stays queued).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
transport | query | string | Yes | postmark | smtp | ses |
Responses
| Status | Description |
|---|---|
200 | |
422 | unknown transport |
Security: bearer