trusted domains.md
title: "Trusted Domains" description: "Domains and addresses the organization, a pod or an inbox trusts: mail they genuinely sign is never quarantined or withheld from agents. Preview an entry first." canonical: "https://machinemail.dev/docs/reference/api/trusted-domains"
Trusted Domains
Domains and addresses the organization, a pod or an inbox trusts: mail they genuinely sign is never quarantined or withheld from agents. Preview an entry first.
Source: https://machinemail.dev/docs/reference/api/trusted-domains
| Method | Path | Summary |
|---|---|---|
GET |
/v0/inboxes/{inbox_id}/trusted-domains |
List Trusted Domains in Inbox |
POST |
/v0/inboxes/{inbox_id}/trusted-domains |
Create Trusted Domain in Inbox |
POST |
/v0/inboxes/{inbox_id}/trusted-domains/preview |
Preview Trusted Domain in Inbox |
GET |
/v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id} |
Get Trusted Domain in Inbox |
PATCH |
/v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id} |
Update Trusted Domain in Inbox |
DELETE |
/v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id} |
Delete Trusted Domain in Inbox |
GET |
/v0/pods/{pod_id}/trusted-domains |
List Trusted Domains in Pod |
POST |
/v0/pods/{pod_id}/trusted-domains |
Create Trusted Domain in Pod |
POST |
/v0/pods/{pod_id}/trusted-domains/preview |
Preview Trusted Domain in Pod |
GET |
/v0/pods/{pod_id}/trusted-domains/{trusted_domain_id} |
Get Trusted Domain in Pod |
PATCH |
/v0/pods/{pod_id}/trusted-domains/{trusted_domain_id} |
Update Trusted Domain in Pod |
DELETE |
/v0/pods/{pod_id}/trusted-domains/{trusted_domain_id} |
Delete Trusted Domain in Pod |
GET |
/v0/trusted-domains |
List Trusted Domains |
POST |
/v0/trusted-domains |
Create Trusted Domain |
POST |
/v0/trusted-domains/preview |
Preview Trusted Domain |
GET |
/v0/trusted-domains/{trusted_domain_id} |
Get Trusted Domain |
PATCH |
/v0/trusted-domains/{trusted_domain_id} |
Update Trusted Domain |
DELETE |
/v0/trusted-domains/{trusted_domain_id} |
Delete Trusted Domain |
List Trusted Domains in Inbox
GET /v0/inboxes/{inbox_id}/trusted-domains
Same as List Trusted Domains (GET /v0/trusted-domains), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox. |
Query parameters
| Field | Type | Description | |
|---|---|---|---|
limit |
integer |
Maximum number of items to return. Default 50, maximum 500; larger values are capped. | |
page_token |
string |
next_page_token from the previous page. | |
ascending |
boolean |
Oldest first. |
Response
200 A page of trusted domains (application/json)
| Field | Type | Description | |
|---|---|---|---|
count |
integer |
required | Number of items returned. |
limit |
integer |
Maximum number of items per page. Default 50, maximum 500; larger values are capped. | |
next_page_token |
string |
Page token for pagination. Absent on the last page. | |
trusted_domains |
TrustedDomain[] |
required | Entries stored at exactly this level (organization, pod or inbox), newest first unless ascending is set. |
Each item of trusted_domains is a TrustedDomain:
| Field | Type | Description | |
|---|---|---|---|
trusted_domain_id |
string |
required | ID of the entry (td_...). |
entry_type |
"domain" | "email" |
required | domain: every address at the domain (and its subdomains with include_subdomains). email: exactly one address. |
domain |
string |
required | The domain, or for entry_type: "email" the address, lowercased, with the domain in its ASCII (punycode) form. |
domain_unicode |
string |
required | The same, with the domain in its Unicode form. Equal to domain for ASCII names. |
include_subdomains |
boolean |
required | Also trust mail signed by subdomains (billing.example.com for example.com). Always false for addresses. |
scope |
"org" | "pod" | "inbox" |
required | Where an entry applies: the whole organization, one pod, or one inbox. |
pod_id |
string | null |
required | The pod, for pod- and inbox-scoped entries. |
inbox_id |
string | null |
required | The inbox, for inbox-scoped entries. |
reason |
string | null |
required | Why it was added, for people reading the list. Never included in a message’s trust report. |
expires_at |
string (date-time) | null |
required | When the entry stops applying. null: never. |
created_by |
object | null |
required | Who added the entry. |
match_count |
integer |
required | Messages this entry has marked trusted. |
last_matched_at |
string (date-time) | null |
required | When this entry last marked a message trusted. null: never. |
created_at |
string (date-time) |
required | When the entry was added. |
updated_at |
string (date-time) |
required | When the entry last changed. |
Errors
| Status | Meaning |
|---|---|
400 |
Invalid request: error.type is validation and error.param names the field. |
401 |
Missing, invalid, expired or revoked credential. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
404 |
Not found. Also returned for resources outside the credential scope. |
500 |
Unexpected server error. |
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
{
"count": 1,
"limit": 50,
"next_page_token": "eyJvIjo1MH0",
"trusted_domains": [
{
"trusted_domain_id": "string",
"entry_type": "domain",
"domain": "example.com",
"domain_unicode": "string",
"include_subdomains": false,
"scope": "org",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f",
"inbox_id": "agent@machinemail.dev",
"reason": "string",
"expires_at": "2026-10-01T12:00:00.000Z",
"created_by": {
"type": "user",
"id": "string"
},
"match_count": 1,
"last_matched_at": "2026-10-01T12:00:00.000Z",
"created_at": "2026-10-01T12:00:00.000Z",
"updated_at": "2026-10-01T12:00:00.000Z"
}
]
}
Create Trusted Domain in Inbox
POST /v0/inboxes/{inbox_id}/trusted-domains
Same as Create Trusted Domain (POST /v0/trusted-domains), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_create.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox. |
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
domain |
string |
required | A domain (example.com) or an exact address (invoices@example.com). Unicode names are accepted and stored in ASCII (punycode) form. (min length 1, max length 320) |
include_subdomains |
boolean |
Also trust mail signed by subdomains. Default false. Not allowed for an address. | |
reason |
string |
Why you trust it, for people reading the list. Never included in a message’s trust report. (max length 500) | |
expires_at |
string (date-time) |
When the entry stops applying. Must be in the future. Omit for never. | |
confirm |
boolean |
Required (true) for platforms where anyone can write the content (github.com, google.com, slack.com and similar, or one under the domain with include_subdomains) and for one address on a group or marketplace relay (team@googlegroups.com): without it the answer is 422 confirmation_required. | |
client_id |
string |
Idempotency key: a create with a client_id already used in the organization returns that entry (200). |
Response
200 The existing entry for this domain or client_id (application/json)
Each item of warnings is a Warning:
| Field | Type | Description | |
|---|---|---|---|
code |
"shadowed_by_block" | "shadowed_by_allow_only" |
required | shadowed_by_block: a receive/block list entry matches some or all of the mail this entry trusts, and a block always wins over trust. shadowed_by_allow_only: the scope is allow-only (it has receive/allow entries) and none of them allows this sender, so the mail is still BLOCKED. |
scope |
"org" | "pod" | "inbox" |
required | Where an entry applies: the whole organization, one pod, or one inbox. |
pod_id |
string |
The pod of the list, for pod and inbox scopes. | |
inbox_id |
string |
The inbox of the list, for the inbox scope. | |
entry |
object |
shadowed_by_block only: the block entry. Left out for credentials without list_entry_read. | |
message |
string |
required | What the warning means, in one sentence. |
201 Created (application/json)
Each item of warnings is a Warning:
Errors
| Status | Meaning |
|---|---|
400 |
Invalid request: error.type is validation and error.param names the field. |
401 |
Missing, invalid, expired or revoked credential. |
402 |
The organization already has as many trusted domains as its plan allows (limit_key: "trusted_domains"): 10 on Free, 500 on paid plans, none for unclaimed sandbox agents. Remove one first. |
403 |
The credential lacks trusted_domain_create, or is not an organization API key or a dashboard session. Only an organization API key or a dashboard session can add or change an entry: pod and inbox keys, OAuth apps and agent access tokens get 403, whatever their permissions, so an agent cannot be talked into trusting a domain. |
404 |
Not found. Also returned for resources outside the credential scope. |
409 |
client_id is already used at another level. |
422 |
trusted_domain_not_allowed (with error.reason) or confirmation_required (resend with confirm: true). |
500 |
Unexpected server error. |
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com",
"reason": "string"
}'
{
"trusted_domain_id": "string",
"entry_type": "domain",
"domain": "example.com",
"domain_unicode": "string",
"include_subdomains": false,
"scope": "org",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f",
"inbox_id": "agent@machinemail.dev",
"reason": "string",
"expires_at": "2026-10-01T12:00:00.000Z",
"created_by": {
"type": "user",
"id": "string"
},
"match_count": 1,
"last_matched_at": "2026-10-01T12:00:00.000Z",
"created_at": "2026-10-01T12:00:00.000Z",
"updated_at": "2026-10-01T12:00:00.000Z",
"warnings": [
{
"code": "shadowed_by_block",
"scope": "org",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f",
"inbox_id": "agent@machinemail.dev",
"entry": {
"entry": "customer@example.com",
"entry_type": "email"
},
"message": "string"
}
]
}
Preview Trusted Domain in Inbox
POST /v0/inboxes/{inbox_id}/trusted-domains/preview
Same as Preview Trusted Domain (POST /v0/trusted-domains/preview), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox. |
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
domain |
string |
required | A domain (example.com) or an exact address (invoices@example.com). Unicode names are accepted and stored in ASCII (punycode) form. (min length 1, max length 320) |
include_subdomains |
boolean |
As for create. |
Response
200 The preview (application/json)
| Field | Type | Description | |
|---|---|---|---|
domain |
string | null |
required | The entry as it would be stored (ASCII form). null when it is not a domain or address. |
domain_unicode |
string | null |
required | The same in Unicode form. |
entry_type |
object |
required | |
allowed |
boolean |
required | Whether a create would be accepted (with confirm: true when confirmation_required), plan limit aside. |
refusal |
("free_mail" | "privacy_relay" | "shared_platform" | "public_suffix" | "disposable" | "invalid" | "confusable_idn" | null) | null |
required | Why it cannot be trusted. null when it can. |
message |
string | null |
required | The refusal or confirmation, in one sentence. null when there is neither. |
confirmation_required |
boolean |
required | A platform where anyone can write the content, or a relay address: a create needs confirm: true. |
warnings |
Warning[] |
required | Conflicts with block entries or allow-only scopes, as a create would report them. |
would_release |
object | null |
required | Not computed yet: always null. |
suggestions |
string[] | null |
required | Narrower entries to consider (an exact address). Not computed yet: always null. |
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains/preview" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com"
}'
{
"domain": "example.com",
"domain_unicode": "string",
"entry_type": {},
"allowed": false,
"refusal": "free_mail",
"message": "string",
"confirmation_required": false,
"warnings": [
{
"code": "shadowed_by_block",
"scope": "org",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f",
"inbox_id": "agent@machinemail.dev",
"entry": {
"entry": "customer@example.com",
"entry_type": "email"
},
"message": "string"
}
],
"would_release": {
"count": 1
},
"suggestions": ["string"]
}
Get Trusted Domain in Inbox
GET /v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id}
Same as Get Trusted Domain (GET /v0/trusted-domains/{trusted_domain_id}), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox. |
trusted_domain_id |
string |
required | ID of the entry (td_...). |
Response
200 The entry (application/json)
Errors
| Status | Meaning |
|---|---|
401 |
Missing, invalid, expired or revoked credential. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
404 |
Not found. Also returned for resources outside the credential scope. |
500 |
Unexpected server error. |
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Update Trusted Domain in Inbox
PATCH /v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id}
Same as Update Trusted Domain (PATCH /v0/trusted-domains/{trusted_domain_id}), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_update.
Path parameters
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
include_subdomains |
boolean |
Also trust mail signed by subdomains. Not allowed for an address. | |
confirm |
boolean |
Required (true) to turn on include_subdomains when a platform where anyone can write the content lies under the domain: without it the answer is 422 confirmation_required. | |
reason |
string | null |
New reason; null clears it. (max length 500) | |
expires_at |
string (date-time) | null |
New expiry, in the future; null removes it. |
Response
200 The updated entry (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X PATCH "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "string"
}'
Delete Trusted Domain in Inbox
DELETE /v0/inboxes/{inbox_id}/trusted-domains/{trusted_domain_id}
Same as Delete Trusted Domain (DELETE /v0/trusted-domains/{trusted_domain_id}), limited to the inbox.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_delete.
Path parameters
Response
204 Deleted
Errors
Error bodies use the error envelope.
Example
curl -X DELETE "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
List Trusted Domains in Pod
GET /v0/pods/{pod_id}/trusted-domains
Same as List Trusted Domains (GET /v0/trusted-domains), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
Query parameters
Response
200 A page of trusted domains (application/json)
Each item of trusted_domains is a TrustedDomain:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Create Trusted Domain in Pod
POST /v0/pods/{pod_id}/trusted-domains
Same as Create Trusted Domain (POST /v0/trusted-domains), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_create.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
Request body
Content type: application/json.
Response
200 The existing entry for this domain or client_id (application/json)
Each item of warnings is a Warning:
201 Created (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com",
"reason": "string"
}'
Preview Trusted Domain in Pod
POST /v0/pods/{pod_id}/trusted-domains/preview
Same as Preview Trusted Domain (POST /v0/trusted-domains/preview), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
Request body
Content type: application/json.
Response
200 The preview (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains/preview" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com"
}'
Get Trusted Domain in Pod
GET /v0/pods/{pod_id}/trusted-domains/{trusted_domain_id}
Same as Get Trusted Domain (GET /v0/trusted-domains/{trusted_domain_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
trusted_domain_id |
string |
required | ID of the entry (td_...). |
Response
200 The entry (application/json)
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Update Trusted Domain in Pod
PATCH /v0/pods/{pod_id}/trusted-domains/{trusted_domain_id}
Same as Update Trusted Domain (PATCH /v0/trusted-domains/{trusted_domain_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_update.
Path parameters
Request body
Content type: application/json.
Response
200 The updated entry (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X PATCH "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "string"
}'
Delete Trusted Domain in Pod
DELETE /v0/pods/{pod_id}/trusted-domains/{trusted_domain_id}
Same as Delete Trusted Domain (DELETE /v0/trusted-domains/{trusted_domain_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_delete.
Path parameters
Response
204 Deleted
Errors
Error bodies use the error envelope.
Example
curl -X DELETE "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
List Trusted Domains
GET /v0/trusted-domains
Entries stored at exactly this level: /v0/trusted-domains lists the organization entries, /v0/pods/{pod_id}/trusted-domains a pod’s, /v0/inboxes/{inbox_id}/trusted-domains an inbox’s. Mail to an inbox is judged against all three.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Query parameters
Response
200 A page of trusted domains (application/json)
Each item of trusted_domains is a TrustedDomain:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Create Trusted Domain
POST /v0/trusted-domains
Trust a domain (example.com) or one address (invoices@example.com) at this level. Domains are stored in ASCII (punycode) form; responses carry both forms. Adding an entry that exists at this level (the same domain, or the same client_id) returns it unchanged with 200.
Trust takes effect only on mail that carries a DKIM signature of the trusted domain itself (d= equal to the domain, or a subdomain with include_subdomains); a block entry always wins over trust, and an allow-only scope still blocks every sender it does not allow.
Conflicts with block entries and allow-only scopes do not refuse the entry: they are returned as warnings.
Refused with 422: trusted_domain_not_allowed for names anyone can get mail from (error.reason: free_mail, privacy_relay, shared_platform, public_suffix, disposable, invalid, confusable_idn); confirmation_required for platforms where anyone can write the content (github.com, google.com, slack.com and similar, or one under the domain with include_subdomains) and for one address on a group or marketplace relay (team@googlegroups.com), until you resend with confirm: true. An address on a free mail provider (someone@gmail.com) can be trusted.
Refused with 402 plan_limit_exceeded (limit_key: "trusted_domains") past the organization’s limit: 10 on Free, 500 on paid plans, none for unclaimed sandbox agents. Entries at every level count.
Only an organization API key or a dashboard session can add or change an entry: pod and inbox keys, OAuth apps and agent access tokens get 403, whatever their permissions, so an agent cannot be talked into trusting a domain.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_create.
Request body
Content type: application/json.
Response
200 The existing entry for this domain or client_id (application/json)
Each item of warnings is a Warning:
201 Created (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/trusted-domains" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com",
"reason": "string"
}'
Preview Trusted Domain
POST /v0/trusted-domains/preview
What creating this entry at this level would do, without saving anything: whether it is allowed (and if not, why), whether it needs confirm: true, and its warnings. For validating as someone types. would_release and suggestions are not computed yet and are always null.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Request body
Content type: application/json.
Response
200 The preview (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/trusted-domains/preview" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com"
}'
Get Trusted Domain
GET /v0/trusted-domains/{trusted_domain_id}
An entry stored at this level (404 for entries at another level).
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
trusted_domain_id |
string |
required | ID of the entry (td_...). |
Response
200 The entry (application/json)
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Update Trusted Domain
PATCH /v0/trusted-domains/{trusted_domain_id}
Change include_subdomains, reason or expires_at. The domain and level are fixed: delete and create to change them. Turning on include_subdomains is checked like a create with it: refused (422 trusted_domain_not_allowed) when a privacy relay or MachineMail shared domain lies under the domain, and 422 confirmation_required until you send confirm: true when a platform where anyone can write the content does. Returns the entry with its current warnings. Only an organization API key or a dashboard session can add or change an entry: pod and inbox keys, OAuth apps and agent access tokens get 403, whatever their permissions, so an agent cannot be talked into trusting a domain.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_update.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
trusted_domain_id |
string |
required | ID of the entry (td_...). |
Request body
Content type: application/json.
Response
200 The updated entry (application/json)
Each item of warnings is a Warning:
Errors
Error bodies use the error envelope.
Example
curl -X PATCH "https://api.machinemail.dev/v0/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "string"
}'
Delete Trusted Domain
DELETE /v0/trusted-domains/{trusted_domain_id}
Mail from the domain is judged normally again from now on. Any credential with trusted_domain_delete that can see the entry may remove it.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: trusted_domain_delete.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
trusted_domain_id |
string |
required | ID of the entry (td_...). |
Response
204 Deleted
Errors
Error bodies use the error envelope.
Example
curl -X DELETE "https://api.machinemail.dev/v0/trusted-domains/string" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"