---
title: "Every command"
description: "All 241, one row each, with the endpoint each resource command calls."
url: "https://openemail.uk/docs/cli/reference/commands"
area: "CLI"
category: "Reference"
---

# Every command

All 241, one row each, with the endpoint each resource command calls.

## Every command

There are 241 commands, each on its own row in the order `openemail --help` lists them. 46 are written by hand for people: they ask for what is missing, format what they print and combine several API calls where that helps, so their row names no single endpoint. The other 195 are the resource commands, `openemail <namespace> <verb>` across 25 namespaces, and each one calls the endpoint its row names.

The resource commands are not written one by one. The CLI reads the SDK's method manifest, which describes every method with its parameters, endpoint and scopes, and turns each method into a verb named after the namespace and the method in kebab case, so `domains.createAddress` is `openemail domains create-address`. A `list` and the `listAll` and `iterate` that walk it become one `list` verb with `--all` and `--max`, which is why there are fewer commands than SDK methods.

The package's parity check proves it before every release. For every SDK method it builds the command line three ways, with the required values only, with them in a `--data` file, and with every flag set, runs the command against a recording `fetch`, and fails when a method has no command or when a command sends anything other than the method, path, query, body and credential the manifest names. It then runs the same command lines through the real parser and dispatcher, and fails on any request that differs from the direct call.

Each row shows the first usage line of its command. `openemail <command> --help` shows the rest: every argument and flag with what it takes, and examples, and for a resource command its scopes, its endpoint, what it returns and the notes from the API reference. Add `--json` for the same page as one JSON document, and `openemail --help --json` prints every command, argument and flag at once. Every command also takes the global flags, `--json`, `--yes`, `--dry-run`, `--profile`, `--api-key`, `--base-url`, `--no-input`, `--no-color` and `--debug`, so no row repeats them.

| Command | Calls | Scope |
| --- | --- | --- |
| openemail login | - | none |
| openemail whoami | - | none |
| openemail status | - | none |
| openemail send --to <address> --subject <text> --text <body> [flags] | - | `emails:send` |
| openemail inbox [folder] [flags] | - | `threads:read` |
| openemail read <thread-id> [flags] | - | `threads:read` |
| openemail search <query...> [flags] | - | `threads:read` |
| openemail reply <thread-id> --text <body> [flags] | - | `threads:read` + `emails:send` |
| openemail archive <thread-id...> | - | `threads:write` |
| openemail unarchive <thread-id...> | - | `threads:write` |
| openemail trash <thread-id...> | - | `threads:write` |
| openemail star <thread-id...> | - | `threads:write` |
| openemail unstar <thread-id...> | - | `threads:write` |
| openemail mark read <thread-id...> | - | `threads:write` |
| openemail mark unread <thread-id...> | - | `threads:write` |
| openemail snooze <thread-id...> --until <when> | - | `threads:write` |
| openemail unsnooze <thread-id...> | - | `threads:write` |
| openemail label add <thread-id...> --label <label-id> | - | `threads:write` |
| openemail label remove <thread-id...> --label <label-id> | - | `threads:write` |
| openemail temp new [--name <local-part>] [--domain <domain>] [--ttl <minutes>] | - | none |
| openemail temp list | - | none |
| openemail temp read [inbox] [message-id] [flags] | - | none |
| openemail temp watch [inbox] [--first] | - | none |
| openemail temp delete [inbox] [--yes] | - | none |
| openemail ai translate --to <language> [--text <text>\|--html <html>\|--body-file <path>] [--subject <subject>] | - | `emails:send` |
| openemail ai languages [--search <text>] | - | none |
| openemail ai compose "<prompt>" [--to <address>] [--subject <subject>] [--thread <thread-id>] [--tone <tone>] | - | `drafts:write` |
| openemail ai summarize <thread-id> | - | `threads:read` |
| openemail mcp config [--client <client>] | - | none |
| openemail mcp tools [tool] | - | none |
| openemail mcp call <tool> [--args <json\|@file\|->] [--arg key=value ...] | - | none |
| openemail mcp serve | - | none |
| openemail docs ask "<question>" | - | none |
| openemail docs open [slug] [--print] | - | none |
| openemail docs read [slug] | - | none |
| openemail agents | - | none |
| openemail me get [flags] | `GET /keys/self` | none |
| openemail me ping [flags] | `GET /ping` | none |
| openemail me rotate [flags] | `POST /keys/self/rotate` | `keys:write` |
| openemail keys list [flags] | `GET /keys` | `keys:read` |
| openemail keys get <id> [flags] | `GET /keys/{id}` | `keys:read` |
| openemail keys create --name <value> [flags] | `POST /keys` | `keys:manage` |
| openemail keys update <id> [flags] | `PATCH /keys/{id}` | `keys:manage` |
| openemail keys delete <id> [flags] | `DELETE /keys/{id}` | `keys:manage` |
| openemail keys rotate <id> [flags] | `POST /keys/{id}/rotate` | `keys:manage` |
| openemail keys revoke <id> [flags] | `POST /keys/{id}/revoke` | `keys:manage` |
| openemail keys list-requests <id> [flags] | `GET /keys/{id}/requests` | `keys:read` |
| openemail keys list-activity <id> [flags] | `GET /keys/{id}/activity` | `keys:read` |
| openemail keys list-workspace-requests [flags] | `GET /keys/requests` | `keys:read` |
| openemail keys list-workspace-activity [flags] | `GET /keys/activity` | `keys:read` |
| openemail addresses list [flags] | `GET /addresses` | `emails:send` |
| openemail languages list [flags] | `GET /languages` | none |
| openemail emails send --from <value> --to <a,b> [flags] | `POST /emails` | `emails:send` |
| openemail emails send-batch <emails> [flags] | `POST /emails/batch` | `emails:send` |
| openemail emails translate --to <value> [flags] | `POST /emails/translate` | `emails:send` |
| openemail emails list [flags] | `GET /emails` | `emails:read` |
| openemail emails get <id> [flags] | `GET /emails/{id}` | `emails:read` |
| openemail emails list-events <id> [flags] | `GET /emails/{id}/events` | `emails:read` |
| openemail emails get-tracking <id> [flags] | `GET /emails/{id}/tracking` | `emails:read` |
| openemail emails cancel <id> [flags] | `POST /emails/{id}/cancel` | `emails:send` |
| openemail emails reschedule <id> <scheduled-at> [flags] | `PATCH /emails/{id}` | `emails:send` |
| openemail templates list [flags] | `GET /templates` | `templates:read` |
| openemail templates get <id-or-slug> [flags] | `GET /templates/{id}` | `templates:read` |
| openemail templates create --name <value> [flags] | `POST /templates` | `templates:write` |
| openemail templates update <id-or-slug> [flags] | `PATCH /templates/{id}` | `templates:write` |
| openemail templates duplicate <id-or-slug> [flags] | `POST /templates/{id}/duplicate` | `templates:write` |
| openemail templates replace-content <id-or-slug> [flags] | `POST /templates/{id}/content` | `templates:write` |
| openemail templates delete <id-or-slug> [flags] | `DELETE /templates/{id}` | `templates:write` |
| openemail templates list-versions <id-or-slug> [flags] | `GET /templates/{id}/versions` | `templates:read` |
| openemail templates get-version <id-or-slug> <version> [flags] | `GET /templates/{id}/versions/{version}` | `templates:read` |
| openemail templates publish <id-or-slug> [flags] | `POST /templates/{id}/versions` | `templates:write` |
| openemail templates restore-version <id-or-slug> <version> [flags] | `POST /templates/{id}/versions/{version}/restore` | `templates:write` |
| openemail templates delete-version <id-or-slug> <version> [flags] | `DELETE /templates/{id}/versions/{version}` | `templates:write` |
| openemail templates list-starters [flags] | `GET /templates/starters` | `templates:read` |
| openemail templates get-starter <slug> [flags] | `GET /templates/starters/{slug}` | `templates:read` |
| openemail templates list-fonts [flags] | `GET /templates/fonts` | `templates:read` |
| openemail templates render [flags] | `POST /templates/render` | `templates:read` |
| openemail templates preview <id-or-slug> [flags] | `POST /templates/{id}/preview` | `templates:read` |
| openemail templates get-analytics <id-or-slug> [flags] | `GET /templates/{id}/analytics` | `templates:read` |
| openemail templates list-sends <id-or-slug> [flags] | `GET /templates/{id}/sends` | `templates:read` |
| openemail templates send <id-or-slug> --from <value> --to <a,b> [flags] | `POST /templates/{id}/send` | `templates:write` + `emails:send` |
| openemail tracking list [flags] | `GET /tracking` | `emails:read` |
| openemail tracking get-stats [flags] | `GET /tracking/stats` | `emails:read` |
| openemail tracking get <id> [flags] | `GET /tracking/{id}` | `emails:read` |
| openemail tracking list-opens <id> [flags] | `GET /tracking/{id}/opens` | `emails:read` |
| openemail tracking list-clicks <id> [flags] | `GET /tracking/{id}/clicks` | `emails:read` |
| openemail threads list [flags] | `GET /threads` | `threads:read` |
| openemail threads get <id> [flags] | `GET /threads/{id}` | `threads:read` |
| openemail threads update <id> [flags] | `PATCH /threads/{id}` | `threads:write` |
| openemail threads trash <id> [flags] | `POST /threads/{id}/trash` | `threads:write` |
| openemail threads snooze <id> <wake-at> [flags] | `POST /threads/{id}/snooze` | `threads:write` |
| openemail threads unsnooze <id> [flags] | `POST /threads/{id}/unsnooze` | `threads:write` |
| openemail threads list-attachments <id> <message-id> [flags] | `GET /threads/{id}/messages/{messageId}/attachments` | `threads:read` |
| openemail drafts list [flags] | `GET /drafts` | `drafts:read` |
| openemail drafts get <id> [flags] | `GET /drafts/{id}` | `drafts:read` |
| openemail drafts create [flags] | `POST /drafts` | `drafts:write` |
| openemail drafts update <id> [flags] | `PATCH /drafts/{id}` | `drafts:write` |
| openemail drafts delete <id> [flags] | `DELETE /drafts/{id}` | `drafts:write` |
| openemail labels list [flags] | `GET /labels` | `labels:read` |
| openemail labels list-colors [flags] | `GET /labels/colors` | `labels:read` |
| openemail labels get <id> [flags] | `GET /labels/{id}` | `labels:read` |
| openemail labels create --name <value> [flags] | `POST /labels` | `labels:write` |
| openemail labels update <id> [flags] | `PATCH /labels/{id}` | `labels:write` |
| openemail labels delete <id> [flags] | `DELETE /labels/{id}` | `labels:write` |
| openemail contacts list [flags] | `GET /contacts` | `contacts:read` |
| openemail contacts get <email> [flags] | `GET /contacts/{email}` | `contacts:read` |
| openemail contacts create --email <value> [flags] | `POST /contacts` | `contacts:write` |
| openemail contacts update <email> [flags] | `PATCH /contacts/{email}` | `contacts:write` |
| openemail contacts delete <email> [flags] | `DELETE /contacts/{email}` | `contacts:write` |
| openemail contacts set-audiences <email> --audience-ids <a,b> [flags] | `PUT /contacts/{email}/audiences` | `audiences:write` |
| openemail contacts list-people [flags] | `GET /contacts/people` | `contacts:read` |
| openemail contacts save <email> [flags] | `PUT /contacts/{email}` | `contacts:write` |
| openemail contacts delete-many <emails...> [flags] | `POST /contacts/batch-delete` | `contacts:write` |
| openemail contacts set-photo <email> <data> [flags] | `PUT /contacts/{email}/photo` | `contacts:write` |
| openemail contacts remove-photo <email> [flags] | `DELETE /contacts/{email}/photo` | `contacts:write` |
| openemail contacts block <email> [flags] | `POST /contacts/{email}/block` | `settings:write` |
| openemail contacts unblock <email> [flags] | `DELETE /contacts/{email}/block` | `settings:write` |
| openemail contacts list-threads <email> [flags] | `GET /contacts/{email}/threads` | `threads:read` |
| openemail contacts activity <email> [flags] | `GET /contacts/{email}/activity` | `threads:read` |
| openemail audiences list [flags] | `GET /audiences` | `audiences:read` |
| openemail audiences growth [flags] | `GET /audiences/growth` | `audiences:read` |
| openemail audiences get <id> [flags] | `GET /audiences/{id}` | `audiences:read` |
| openemail audiences create --name <value> [flags] | `POST /audiences` | `audiences:write` |
| openemail audiences update <id> [flags] | `PATCH /audiences/{id}` | `audiences:write` |
| openemail audiences delete <id> [flags] | `DELETE /audiences/{id}` | `audiences:write` |
| openemail audiences empty <id> [flags] | `POST /audiences/{id}/empty` | `audiences:write` |
| openemail audiences list-contacts <id> [flags] | `GET /audiences/{id}/contacts` | `audiences:read` |
| openemail audiences add-contact <id> --email <value> [flags] | `POST /audiences/{id}/contacts` | `audiences:write` |
| openemail audiences remove-contact <id> <email> [flags] | `DELETE /audiences/{id}/contacts/{email}` | `audiences:write` |
| openemail audiences add-contacts <id> --emails <a,b> [flags] | `POST /audiences/{id}/contacts/batch` | `audiences:write` |
| openemail audiences remove-contacts <id> --emails <a,b> [flags] | `POST /audiences/{id}/contacts/batch-remove` | `audiences:write` |
| openemail audiences import-contacts <id> --contacts <json\|@file\|-> [flags] | `POST /audiences/{id}/import` | `audiences:write` + `contacts:write` |
| openemail broadcasts preview --audience-ids <a,b> [flags] | `POST /broadcasts/preview` | `audiences:read` |
| openemail broadcasts send --audience-ids <a,b> --from <value> [flags] | `POST /broadcasts` | `emails:send` + `audiences:read` |
| openemail broadcasts list [flags] | `GET /broadcasts` | `emails:read` |
| openemail broadcasts get <id> [flags] | `GET /broadcasts/{id}` | `emails:read` |
| openemail broadcasts stats <id> [flags] | `GET /broadcasts/{id}/stats` | `emails:read` |
| openemail broadcasts list-recipients <id> [flags] | `GET /broadcasts/{id}/recipients` | `emails:read` |
| openemail broadcasts get-recipient <id> <email-id> [flags] | `GET /broadcasts/{id}/recipients/{emailId}` | `emails:read` |
| openemail broadcasts cancel <id> [flags] | `POST /broadcasts/{id}/cancel` | `emails:send` |
| openemail domains list [flags] | `GET /domains` | `domains:read` |
| openemail domains get <id> [flags] | `GET /domains/{id}` | `domains:read` |
| openemail domains create --domain <value> [flags] | `POST /domains` | `domains:write` |
| openemail domains verify <id> [flags] | `POST /domains/{id}/verify` | `domains:write` |
| openemail domains update <id> [flags] | `PATCH /domains/{id}` | `domains:write` |
| openemail domains delete <id> [flags] | `DELETE /domains/{id}` | `domains:write` |
| openemail domains list-addresses <id> [flags] | `GET /domains/{id}/addresses` | `domains:read` |
| openemail domains create-address <id> --local-part <value> [flags] | `POST /domains/{id}/addresses` | `domains:write` |
| openemail domains get-address <id> <address-id> [flags] | `GET /domains/{id}/addresses/{addressId}` | `domains:read` |
| openemail domains update-address <id> <address-id> [flags] | `PATCH /domains/{id}/addresses/{addressId}` | `domains:write` |
| openemail domains delete-address <id> <address-id> [flags] | `DELETE /domains/{id}/addresses/{addressId}` | `domains:write` |
| openemail rules list [flags] | `GET /rules` | `rules:read` |
| openemail rules get <id> [flags] | `GET /rules/{id}` | `rules:read` |
| openemail rules create --name <value> --conditions <json\|@file\|-> --actions <json\|@file\|-> [flags] | `POST /rules` | `rules:write` |
| openemail rules update <id> [flags] | `PATCH /rules/{id}` | `rules:write` |
| openemail rules delete <id> [flags] | `DELETE /rules/{id}` | `rules:write` |
| openemail rules reorder <rule-ids...> [flags] | `POST /rules/reorder` | `rules:write` |
| openemail rules test <id> [flags] | `POST /rules/{id}/test` | `rules:read` |
| openemail rules list-runs [flags] | `GET /rules/runs` | `rules:read` |
| openemail webhooks list [flags] | `GET /webhooks` | `webhooks:read` |
| openemail webhooks get <id> [flags] | `GET /webhooks/{id}` | `webhooks:read` |
| openemail webhooks create --url <value> [flags] | `POST /webhooks` | `webhooks:write` |
| openemail webhooks update <id> [flags] | `PATCH /webhooks/{id}` | `webhooks:write` |
| openemail webhooks delete <id> [flags] | `DELETE /webhooks/{id}` | `webhooks:write` |
| openemail webhooks rotate-secret <id> [flags] | `POST /webhooks/{id}/rotate-secret` | `webhooks:write` |
| openemail webhooks test <id> [flags] | `POST /webhooks/{id}/test` | `webhooks:write` |
| openemail webhooks list-deliveries <id> [flags] | `GET /webhooks/{id}/deliveries` | `webhooks:read` |
| openemail webhooks get-delivery <id> <delivery-id> [flags] | `GET /webhooks/{id}/deliveries/{deliveryId}` | `webhooks:read` |
| openemail webhooks replay-delivery <id> <delivery-id> [flags] | `POST /webhooks/{id}/deliveries/{deliveryId}/replay` | `webhooks:write` |
| openemail webhooks list-workspace-deliveries [flags] | `GET /webhooks/deliveries` | `webhooks:read` |
| openemail webhooks list-activity <id> [flags] | `GET /webhooks/{id}/activity` | `webhooks:read` |
| openemail webhooks list-workspace-activity [flags] | `GET /webhooks/activity` | `webhooks:read` |
| openemail imports list [flags] | `GET /imports` | `threads:read` |
| openemail imports get <id> [flags] | `GET /imports/{id}` | `threads:read` |
| openemail imports create --address-id <value> --files <json\|@file\|-> [flags] | `POST /imports` | `threads:write` |
| openemail imports upload-state <id> [flags] | `GET /imports/{id}/upload` | `threads:write` |
| openemail imports upload-chunk <id> <file> <chunk> <data> [flags] | `PUT /imports/{id}/files/{file}/chunks/{chunk}` | `threads:write` |
| openemail imports start <id> [flags] | `POST /imports/{id}/start` | `threads:write` |
| openemail imports cancel <id> [flags] | `POST /imports/{id}/cancel` | `threads:write` |
| openemail imports list-failures <id> [flags] | `GET /imports/{id}/failures` | `threads:read` |
| openemail imports delete-upload <id> [flags] | `DELETE /imports/{id}/upload` | `threads:write` |
| openemail imports import-files --address-id <value> --files <path> [flags] | `POST /imports` | `threads:write` |
| openemail provider-imports inspect <api-key> [flags] | `POST /provider-imports/inspect` | `settings:write` |
| openemail provider-imports create --resend-key <value> --resources <a,b> [flags] | `POST /provider-imports` | `settings:write` |
| openemail provider-imports list [flags] | `GET /provider-imports` | `settings:read` |
| openemail provider-imports get <id> [flags] | `GET /provider-imports/{id}` | `settings:read` |
| openemail provider-imports cancel <id> [flags] | `POST /provider-imports/{id}/cancel` | `settings:write` |
| openemail calendar list-events --from <when> --to <when> [flags] | `GET /calendar/events` | `calendar:read` |
| openemail calendar get-event <id> [flags] | `GET /calendar/events/{id}` | `calendar:read` |
| openemail calendar get-event-ics <id> [flags] | `GET /calendar/events/{id}/ics` | `calendar:read` |
| openemail settings get [flags] | `GET /settings` | `settings:read` |
| openemail settings update [flags] | `PATCH /settings` | `settings:write` |
| openemail roles list [flags] | `GET /roles` | `roles:read` |
| openemail roles get <id> [flags] | `GET /roles/{id}` | `roles:read` |
| openemail roles create --name <value> --permissions <a,b> [flags] | `POST /roles` | `roles:write` |
| openemail roles update <id> [flags] | `PATCH /roles/{id}` | `roles:write` |
| openemail roles delete <id> [flags] | `DELETE /roles/{id}` | `roles:write` |
| openemail roles list-permissions [flags] | `GET /roles/permissions` | `roles:read` |
| openemail members list [flags] | `GET /members` | `members:read` |
| openemail members get <user-id> [flags] | `GET /members/{userId}` | `members:read` |
| openemail members add --email <value> --role-id <value> [flags] | `POST /members` | `members:write` |
| openemail members update <user-id> --role-id <value> [flags] | `PATCH /members/{userId}` | `members:write` |
| openemail members remove <user-id> [flags] | `DELETE /members/{userId}` | `members:write` |
| openemail members grant-address <user-id> --address-id <value> [flags] | `POST /members/{userId}/addresses` | `members:write` |
| openemail members revoke-address <user-id> <address-id> [flags] | `DELETE /members/{userId}/addresses/{addressId}` | `members:write` |
| openemail members list-invitations [flags] | `GET /members/invitations` | `members:read` |
| openemail members revoke-invitation <invitation-id> [flags] | `DELETE /members/invitations/{invitationId}` | `members:write` |
| openemail members resend-invitation <invitation-id> [flags] | `POST /members/invitations/{invitationId}/resend` | `members:write` |
| openemail suppressions list [flags] | `GET /suppressions` | `settings:read` |
| openemail suppressions get <id> [flags] | `GET /suppressions/{id}` | `settings:read` |
| openemail suppressions add --email <value> [flags] | `POST /suppressions` | `settings:write` |
| openemail suppressions remove <id> [flags] | `DELETE /suppressions/{id}` | `settings:write` |
| openemail files list [flags] | `GET /files` | `files:read` |
| openemail files get <id> [flags] | `GET /files/{id}` | `files:read` |
| openemail files stats [flags] | `GET /files/stats` | `files:read` |
| openemail files download <id> [flags] | `GET /files/{id}/content` | `files:read` |
| openemail files list-links <id> [flags] | `GET /files/{id}/links` | `files:read` |
| openemail files create-link <id> [flags] | `POST /files/{id}/links` | `files:write` |
| openemail files revoke-link <id> <link-id> [flags] | `DELETE /files/{id}/links/{linkId}` | `files:write` |
| openemail files upload <data> [flags] | `POST /files` | `files:write` |
| openemail files delete <id> [flags] | `DELETE /files/{id}` | `files:write` |
| openemail files delete-many <ids...> [flags] | `POST /files/batch-delete` | `files:write` |
| openemail temp-mail list-domains [flags] | `GET /temp-mail/domains` | none |
| openemail temp-mail create [flags] | `POST /temp-mail/inboxes` | none |
| openemail temp-mail get <inbox-id> [flags] | `GET /temp-mail/inboxes/{id}` | inbox token |
| openemail temp-mail extend <inbox-id> [flags] | `POST /temp-mail/inboxes/{id}/extend` | inbox token |
| openemail temp-mail delete <inbox-id> [flags] | `DELETE /temp-mail/inboxes/{id}` | inbox token |
| openemail temp-mail list-messages <inbox-id> [flags] | `GET /temp-mail/inboxes/{id}/messages` | inbox token |
| openemail temp-mail get-message <inbox-id> <message-id> [flags] | `GET /temp-mail/inboxes/{id}/messages/{messageId}` | inbox token |
| openemail temp-mail delete-message <inbox-id> <message-id> [flags] | `DELETE /temp-mail/inboxes/{id}/messages/{messageId}` | inbox token |
| openemail temp-mail list-attachments <inbox-id> <message-id> [flags] | `GET /temp-mail/inboxes/{id}/messages/{messageId}/attachments` | inbox token |
| openemail verify | - | none |
| openemail logout | - | none |
| openemail profile list | - | none |
| openemail profile use <name> | - | none |
| openemail profile remove <name> | - | none |
| openemail profile current | - | none |
| openemail open [page] [--print] | - | none |
| openemail update | - | none |
| openemail completion <bash\|zsh\|fish> | - | none |
| openemail api <method> <path> [--data <json\|@file\|->] [--query <key=value>] [--header <key=value>] | - | none |

> Scope names what every run of the command needs. With a saved sign-in the CLI checks it before the command does anything, and a missing scope stops it with exit code `4`. `api` and `mcp call` name none, because what they need depends on the endpoint or the tool you call, and the server checks that. The `temp-mail` rows that say "inbox token" send the `oe_inbox_` token that `temp-mail create` returned, which the CLI saves, and `--inbox-token` passes one it did not create.

> 6 commands need a browser sign-in, the kind `openemail login` saves when you choose the browser: `ai compose`, `ai summarize`, `mcp tools`, `mcp call`, `mcp serve` and `verify`. The AI and MCP ones run on the MCP server, which accepts no API key, and `verify` enters the verification codes that only a browser sign-in is asked for.

> 19 hand-written commands need no sign-in at all: `login`, `temp new`, `temp list`, `temp read`, `temp watch`, `temp delete`, `mcp config`, `docs ask`, `docs open`, `docs read`, `agents`, `logout`, `profile list`, `profile use`, `profile remove`, `profile current`, `open`, `update` and `completion`. Neither do the `temp-mail` rows. `ai languages` works signed in or not.

> 42 commands are destructive, such as deleting, revoking, rotating, cancelling or emptying, so they ask you to confirm first and stop with exit code `2` when nobody can answer. `--yes` confirms for you, and `--dry-run` runs the reads and prints the request that would change something instead of sending it.

> `openemail --help` leaves out a few commands, and so does this table. `help` is the long form of `--help`, `version` prints the CLI, SDK and runtime versions, and `verify` covers the `security` verbs.
