---
title: "Read the workspace mail-agent settings"
method: GET
path: "/account/settings"
tags: ["Account"]
---

# Read the workspace mail-agent settings

`GET /account/settings`

## Request

- Base URL: `https://inkseal.net/api/v1`
- URL: `https://inkseal.net/api/v1/account/settings`
- Auth: HTTP bearer

The workspace's effective mail-agent preferences.

There is one setting today, `emailKeywordApprovalEnabled`, and it governs whether a reply to an InkSeal notification containing an approval keyword is allowed to release an envelope for signature without anyone opening the dashboard.

The value returned is the tenant-effective one: it is read from the workspace's owner of record, not from whoever issued the credential. The underlying column lives on a user row and the dashboard toggle writes the signed-in user's copy, but only the owner's copy is consulted when inbound mail asks to approve a send. A service credential has no user of its own, so the owner's value is the only one it could sensibly mean.

`account:read` is enough: knowing whether a reply keyword can approve a send is part of reading how the account behaves. Only a person can change it in the dashboard; a credential cannot change it, even with `settings:write`.

## Response `200`

The workspace's effective settings.

- object
  - `data` AccountSettings, required: The workspace's effective mail-agent preferences, read from the owner of record, plus the guardrails it holds its agent credentials to.
    - `emailKeywordApprovalEnabled` boolean, required: Whether a reply containing an approval keyword may release a pending envelope for signature without a dashboard visit. When true, an emailed approval spends the envelope's credits and mails the signers.
    - `agentSendApproval` 'none' | 'required', required: Whether a send made by a service credential waits for a person. `required` parks every credential-initiated `sendEnvelope` as a pending approval, emails the workspace owner, and answers 202 `pending_approval`. Read-only here: a credential that could relax this would make it decorative, so it is changed by a person in the dashboard.
    - `recipientDenyList` string[], required: Addresses and domains no service credential may send to. An entry with an `@` matches that address; an entry without one matches that domain and its subdomains. Read-only here, like `agentSendApproval`.
    - `apiAccessPaused` boolean, required: True while every service credential in this workspace is paused. A paused workspace answers 401 `unauthorized` to every API and MCP request, exactly as a revoked key does, so reading this field back is only possible when it is false. Read-only here.

## Other responses

- `401`: The credential is missing, malformed, unknown, expired, revoked, or past its rotation grace window. Code: `unauthorized`. Every authentication failure is deliberately indistinguishable.
- `403`: The credential is valid but may not do this. Codes: `insufficient_scope` (the route's scopes are not all held; `details` names `requiredScopes` and `missingScopes`), `forbidden` (the capability check on the resolved resource failed), `scope_escalation` (a grant wider than the caller's own was requested).
- `409`: The resource's state forbids this transition, or another request owns the work. Codes: `invalid_state`, `invalid_status`, `credential_state`, `limit_exceeded`, `envelope_missing`, `not_retryable`, `owner_unavailable`, `workspace_unavailable`, `detection_not_completed`, `document_in_use`, `version_conflict`, `document_processing`, `document_processing_failed`, `normalized_pdf_unavailable`, `pages_not_rendered`, `document_not_ready`, `idempotency_in_progress` (which also carries `Retry-After`), `payment_replayed` (a USDC payment signature presented twice), `payment_pending` (a USDC settlement whose outcome is not yet known).
- `429`: A limit was reached. Codes: `rate_limited` (the credential's per-bucket HTTP limit, or the per-workspace detection throttle), `workspace_limit_exceeded` (a workspace content or send limit; `details.limit` names it), `daily_budget_exceeded` (the workspace's daily detection budget). The four rate-limit headers are sent on this response and on no successful one, so a client cannot read its remaining budget without being refused. Retrying after `Retry-After` is always safe: a rate-limit refusal happens before the handler runs.
- `503`: A dependency the request needs is unreachable and nothing was changed. Codes: `queue_unavailable` (a background job could not be enqueued; retry the call), `billing_unavailable` (Stripe would not open a checkout session; nothing was charged, retry the call), `service_unavailable` (the rate-limit store is down, so the request was refused before running).

---

[API](https://skmtc.dev/inkseal/apis/inkseal-api.md) · [All operations](https://skmtc.dev/inkseal/apis/inkseal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inkseal/apis/inkseal-api/revisions/c440c981d578?raw)
