Verify a custom domain to send and receive email from your own addresses (e.g. agent@yourco.com). All endpoints require a user auth session token.
- Add the domain —
POST /v1/domains/returns the DNS records to configure. - Add all five records at your DNS registrar (MX, SPF, DKIM, DMARC, gent-verify).
- Trigger verification —
POST /v1/domains/{name}/verify/runs a DNS check. Repeat until status isverified. - Create inboxes with
"address": "agent@yourco.com".
The gent-verify TXT record can be removed after the domain is verified. The other four records must remain in place for mail to work.
For a customer-owned sending subdomain used only with Gent, p=reject is the recommended DMARC policy because all legitimate mail for that subdomain should flow through Gent. For an existing or root domain, start with p=quarantine while reports confirm every legitimate sender passes alignment, then move to p=reject.
GET /v1/domains/reference/ List domain setup contract user auth
p=reject for a customer-owned subdomain when all legitimate mail for that subdomain should be sent by Gent. Use p=quarantine for existing or root domains until reports show legitimate senders are aligned.GET /v1/domains/dns-record-types/ List DNS record types user auth
POST /v1/domains/ Add a domain → domain_id user auth
domain_use is optional. Omitted requests use existing_domain and default DMARC to quarantine. For a subdomain reserved only for Gent/agent mail, pass "domain_use": "dedicated_subdomain"; that defaults DMARC to reject unless dmarc_policy is explicitly set.GET /v1/domains/ List all domains for the tenant user auth
POST /v1/domains/{name}/verify/ Trigger DNS verification — returns updated domain user auth
status is verified. DNS propagation can take up to 48 hours.GET /v1/domains/{name}/check/ Per-record verification status — does not mutate domain user auth
DELETE /v1/domains/{name}/ Remove domain — 409 if active inboxes exist user auth
An inbox is a programmable email address on a verified custom domain, and the unit of access control, configuration, and storage. How you organize inboxes depends on your use case: one per agent, one per workflow, one per client, or one shared across a team. All endpoints in this section require a user auth session token.
GET /v1/tenants/reference/ List tenant configuration options tenant admin
workflow_review_defaults on PATCH /v1/tenants/ to decide whether uncertain, missing, shape-changed, or risky workflow output should hold for review, skip, fail, or use delayed auto-approval.GET /v1/tenants/cap-resources/ List configurable cap resources tenant admin
GET /v1/tenants/cap-modes/ List cap behavior modes tenant admin
POST /v1/inboxes/ Create an inbox → inbox_id user auth
GET /v1/inboxes/ List all inboxes for your tenant user auth
GET /v1/inboxes/{inbox_id}/ Retrieve an inbox user auth
DEL /v1/inboxes/{inbox_id}/ Initiate inbox closure user auth
GET /v1/inboxes/{inbox_id}/imports/reference/ Mail import builder contract tenant admin
POST /v1/inboxes/{inbox_id}/imports/ Create a mail import job → import_id tenant admin
GET /v1/inboxes/{inbox_id}/imports/ List import jobs for an inbox tenant admin
GET /v1/inboxes/{inbox_id}/imports/{import_id}/ Retrieve an import job tenant admin
POST /v1/inboxes/{inbox_id}/imports/{import_id}/start/ Queue an import job tenant admin
POST /v1/inboxes/{inbox_id}/imports/{import_id}/rerun/ Queue a fresh import attempt tenant admin
POST /v1/inboxes/{inbox_id}/imports/{import_id}/cancel/ Cancel a pending or running import tenant admin
GET /v1/inboxes/{inbox_id}/handoff/ Handoff context — paused tokens, open threads, recent activity user auth
| Field | Type | Required | Description |
|---|---|---|---|
| recent_activity | array | optional | Last 30 timeline entries. |
| active_relationships | array | optional | Top 10 contacts by recency (30-day window) |
GET /v1/inboxes/{inbox_id}/quota/ Storage quota for an inbox session auth
| Field | Type | Required | Description |
|---|---|---|---|
| used_pct | number | optional | 0.0–100.0; 0.0 when no limit is configured. |
active — normal operation. suspended — outbound blocked, inbound continues. closing — deletion initiated, data retained for 30 days. purged — terminal, address released. Deleting an inbox via DELETE moves it to closing; it is not immediately removed.Tokens are API keys scoped to a single inbox. Create one token per agent or integration. The raw token value is shown exactly once — at creation or rotation. Store it immediately. All endpoints in this section require a user auth session token.
GET /v1/tokens/reference/ List available token scopes no auth required; admins see admin-only scopes
"admin": true.POST /v1/tokens/ Create a token → token_id user auth
| Field | Type | Required | Description |
|---|---|---|---|
| inbox_id | string | required | — |
| scopes | array | required | One or more scope strings (see table) |
| label | string | required | Human-readable name. |
| expires_at | string | optional | ISO 8601, omit for no expiry. |
| requires_approval | array | optional | Scopes that queue actions for human review. Set at token creation; create a replacement token to change it. |
GET /v1/tokens/?inbox_id={id} List tokens for an inbox user auth
PATCH /v1/tokens/{token_id}/?inbox_id= Rotate, pause, or resume a token user auth
action must be one of rotate · pause · resume| Field | Type | Required | Description |
|---|---|---|---|
| action | string | optional | One of: rotate, pause, resume. |
raw_token; pause/resume return updated tokenGET /v1/tokens/{token_id}/?inbox_id= Retrieve token metadata user auth
DEL /v1/tokens/{token_id}/?inbox_id= Revoke a token user auth
gent_<base64url-43-chars> — 32 random bytes, 256 bits of entropy. Only the SHA-256 digest is stored; the raw value cannot be recovered. Revoking a token takes effect immediately on the next API call.pause and resume actions on PATCH /v1/tokens/{token_id}/ require the governance feature tier to be token_controls or higher. Tenants below this tier receive 403 Forbidden.?q= on the list endpoint), inbox_id is auto-derived from an agent token and does not need to be supplied. Users authenticating with a session token still pass it as documented since they may own multiple inboxes. For most other inbox-scoped endpoints (Event Notifications, Send/Mailbox Caps, Sender Rules, Forwarding, Intelligence, Audit), inbox_id must be supplied — either as a query parameter or in the request body as documented per endpoint. Tenant/workspace endpoints such as Files caps use the caller's tenant instead.Configure per-inbox settings and outbound webhooks. Webhooks deliver event payloads to your server in real time — configure a URL and sign with a secret for verified delivery. All endpoints in this section require a user auth session token.
GET /v1/inboxes/{inbox_id}/config/ Retrieve all inbox settings user auth
| Field | Type | Required | Description |
|---|---|---|---|
| default_timezone | string | optional | IANA — used to display event/message times. |
| missed_reply_threshold_days | number | optional | Null = feature disabled. |
| signature | string | optional | Null = no signature; plain text or HTML. |
| label_inference_threshold | number | optional | Null = use default (0.65) |
PATCH /v1/inboxes/{inbox_id}/config/ Update inbox settings user auth
| Field | Type | Required | Description |
|---|---|---|---|
| default_timezone | string | optional | IANA timezone — e.g. "Europe/London", "UTC". |
| missed_reply_threshold_days | number | optional | Null to disable. |
| signature | string | optional | Plain text or HTML; "" or null to clear. |
| label_inference_threshold | number | optional | 0.0–1.0; null to reset to default. |
| webhook | object | optional | Webhook config block: {"url", "events", "secret"}. url must be HTTPS. events is optional and defaults to ["message.received"]. |
| webhook.secret | string | optional | Optional; omit to keep current secret, empty string to clear. |
GET /v1/inboxes/{inbox_id}/webhook/ Retrieve webhook config user auth
PUT /v1/inboxes/{inbox_id}/webhook/ Create or replace webhook config user auth
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | optional | Must be HTTPS. |
| events | array | optional | Defaults to ["message.received"]. |
| secret | string | optional | Optional HMAC-SHA256 signing secret. |
DEL /v1/inboxes/{inbox_id}/webhook/ Remove webhook config user auth
default_timezone is set to an IANA timezone (e.g. America/New_York) it affects all datetime handling across the API:
- Messages —
received_at/sent_atare returned as LocalDateTime strings in this timezone - Calendar events —
startis returned in this timezone;time_zoneon each event reflects it; events created without an explicittime_zoneuse it as the default - Filter inputs — naive
after/beforeparams on messages and calendar are treated as being in this timezone before converting to UTC - Time Utils — omitting
timezonein the parse endpoint automatically uses this timezone
X-Gent-Signature header to each delivery — an HMAC-SHA256 hex digest of the raw request body keyed with your secret. Verify it server-side to reject forged payloads. The secret is write-only; only has_secret: true/false is ever returned.GET /v1/inboxes/{inbox_id}/handoff/) and can trigger event notifications. Set to null to disable.label_suggest feature. A label is suggested only when its confidence score meets or exceeds this value. Default is 0.65 when not set. Lower values surface more (noisier) suggestions; higher values surface fewer (more precise) ones.POST /v1/messages/ and to send_reply workflow writes. A plain-text version is always derived from the signature (HTML tags stripped) and appended to the text_body after a -- separator; if the message also has an html_body, the HTML signature is appended there too. Signatures are not applied to forwarded messages or system emails. Set to "" or null to clear.false). When true, this inbox participates in team collaboration features — overlap detection, expertise discovery, and new-member onboarding. Only active when the parent tenant also has collaboration_enabled: true (team governance plan, admin-controlled). Members opt in individually; the admin enables the feature tenant-wide.Control who your agent can communicate with. Configure separate modes for inbound (who can reach the inbox) and outbound (who the agent can send to). Default mode is open — no restrictions.
GET /v1/sender-rules/reference/ List sender rule builder contract scope: workflows:read
GET /v1/sender-rules/modes/ List sender rule modes scope: workflows:read
PUT /v1/sender-rules/ Set sender rules scope: workflows:write
| Field | Type | Required | Description |
|---|---|---|---|
| inbox_id | string | required | — |
| inbound_mode | string | optional | One of: open, allowlist, blocklist. |
| outbound_mode | string | optional | One of: open, allowlist, blocklist. |
| inbound_patterns | array | optional | Domain or address patterns. |
| outbound_patterns | array | optional | Empty = no outbound restrictions. |
GET /v1/sender-rules/?inbox_id={id} Get sender rule config for an inbox scope: workflows:read
DEL /v1/sender-rules/ Remove sender rules (resets to open) scope: workflows:write
@domain.com to match all addresses on a domain, or user@domain.com for an exact match. Inbound blocks drop the message silently at the SMTP layer — the sender receives no delivery failure. Outbound blocks return a 403 to the agent's API call.Forward copies of incoming messages to external addresses. Configure a default forward address or create conditional rules that forward selectively based on sender, subject, or recipient. Forwarding is additive — the original message stays in the inbox.
GET /v1/forwarding/reference/ List forwarding builder contract scope: workflows:read
GET /v1/forwarding/condition-types/ List forwarding rule conditions scope: workflows:read
PUT /v1/forwarding/ Configure forwarding scope: workflows:write
| Field | Type | Required | Description |
|---|---|---|---|
| inbox_id | string | required | — |
| default_address | string | optional | Forward all incoming to this address. |
GET /v1/forwarding/?inbox_id={id} Get forwarding config scope: workflows:read
DEL /v1/forwarding/ Disable forwarding scope: workflows:write
POST /v1/forwarding/rules/ Create a forwarding rule scope: workflows:write
| Field | Type | Required | Description |
|---|---|---|---|
| inbox_id | string | required | — |
| destination | string | required | Forward target. |
| condition_type | string | required | One of: all, sender, domain, subject_keyword. |
| condition_value | string | conditional | Required for sender, domain, and subject_keyword; ignored for all. |
| priority | number | optional | Lower = higher priority. |
GET /v1/forwarding/rules/?inbox_id={id} List forwarding rules
PATCH /v1/forwarding/rules/{rule_id}/ Update a rule
| Field | Type | Required | Description |
|---|---|---|---|
| destination | string | optional | — |
| condition_type | string | optional | — |
| condition_value | string | optional | — |
| priority | number | optional | — |
| enabled | boolean | optional | — |
DEL /v1/forwarding/rules/{rule_id}/ Delete a rule
condition_type: "all" creates a catch-all rule that forwards every incoming message. Rules without a default_address config only forward when a rule matches.List-Unsubscribe and RFC 8058 List-Unsubscribe-Post headers, plus an Unsubscribe: footer line appended to the text body. Each link encodes a per-rule, per-destination HMAC token. When the destination clicks Unsubscribe, that address is suppressed from future forwards by this rule. The original sender is unaffected.Manage team invitations for your tenant. Invites are session-authenticated and require owner or admin role — they cannot be created with agent tokens. Accepted invites provision a new user account in the tenant.
GET /v1/invites/ List invites session auth
| Field | Type | Required | Description |
|---|---|---|---|
| role | string | optional | One of: member, admin, owner. |
| string | optional | Null = open invite (any email). | |
| status | string | optional | One of: pending, accepted, cancelled, expired. |
POST /v1/invites/ Create an invite session auth
| Field | Type | Required | Description |
|---|---|---|---|
| role | string | optional | One of: member, admin, owner. Default: member. |
| string | optional | Restrict to one email; null = open invite. | |
| expires_at | string | optional | ISO 8601 datetime; null = no expiry. |