English
Error codes
Every error Mankomail reports carries a stable code: a short lower-case identifier such as auth.unauthenticated or llm.rate_limited. Programs should test the code, never the message, which is a technical English text that may change. The interface translates each code into a message in your language.
This page explains where codes appear and lists the families of codes in use. It is not an exhaustive list of every code.
Where codes appear
- In API responses. Every error response of the REST API is a JSON object with
code,messageand, sometimes,details. The HTTP status gives the class of the error; the code gives the precise cause. - In the errors of a run. When a step fails, its error details show a Code, next to the server message, the node and the attempt number. See Errors and retries.
How codes are written
Every API code has the form domain.code: the domain names the part of the product, the code names the cause, for example webmail.sending_disabled, workflow.not_publishable, approval.not_found, wait.step_not_waiting or api_key.scope_missing. Codes contain only lower-case letters, digits, _ and ., and exactly one dot. The generic codes of the HTTP layer have a domain too: request.bad_request, request.not_found, request.internal_error. Treat every code as an opaque string and compare it as a whole; the domain is there to let you handle a family at once. See Errors for the full error format.
The errors of a run use a second, shorter vocabulary: a step that fails carries a code without a domain, such as node_invalid_param, node_timeout or execution_timeout. These codes appear in the error details of an execution, never in the code of an API response.
Families of codes
| Domain | What it covers | Examples |
|---|---|---|
auth | Sign-in, sessions, roles, passwords | auth.invalid_credentials, auth.unauthenticated, auth.forbidden, auth.too_many_attempts, auth.https_required, auth.weak_password |
governance | Members, invitations, node policy | governance.invitation_expired, governance.last_admin, governance.unknown_node_type |
mailbox | Connected mailboxes and their mirror | mailbox.not_active, mailbox.resync_window_invalid, mailbox.confirmation_mismatch |
imap, smtp | Connecting an IMAP mailbox | imap.auth_failed, imap.tls_failed, smtp.unreachable |
oauth | Connecting a Google or Microsoft account | oauth.app_not_configured, oauth.access_denied, oauth.missing_refresh_token, oauth.encryption_disabled |
credential | Stored connections | credential.not_found, credential.in_use, credential.encryption_disabled, credential.capability_missing |
webmail | Reading and sending mail in the webmail | webmail.sending_disabled, webmail.rate_limited, webmail.message_too_large, webmail.attachment_too_large |
workflow, execution | Saving, publishing and running workflows | workflow.draft_conflict, workflow.not_published, workflow.not_publishable, execution.not_retryable, execution.version_unavailable |
request | The HTTP layer itself: unreadable or oversized body, unknown route, unexpected failure | request.bad_request, request.not_found, request.internal_error |
idempotency | The Idempotency-Key header | idempotency.key_reused, idempotency.in_progress, idempotency.invalid_key |
node (run errors) | A step that cannot run; shown in the detail of an execution, not in API responses | node_missing_email, node_invalid_param, node_service_failed, node_timeout |
llm | AI models and providers | llm.provider_not_configured, llm.invalid_api_key, llm.rate_limited, llm.timeout, llm.output_truncated, llm.content_refused |
integration | Third-party services (Airtable, Notion…) | integration.unauthorized, integration.missing_scopes, integration.rate_limited, integration.unavailable |
google, microsoft | Google and Microsoft 365 actions in a step | google.insufficient_permissions, google.not_found, microsoft.access_denied, microsoft.storage_full |
tables, table | Tables, from the interface and from nodes | tables.duplicate_key, tables.limit_reached, tables.invalid_csv, table.row_not_found |
contacts | Address book and signatures | contacts.invalid_csv, contacts.duplicate_signature_name |
review | Morning review of drafts | review.already_resolved, review.content_gone |
approval | Approval requests | approval.not_found, approval.already_decided |
wait | Waits and signals | wait.step_not_waiting, wait.deadline_invalid, wait.outcome_not_available |
api_key | API keys and their scopes | api_key.scope_missing, api_key.session_required, api_key.rate_limited, api_key.scope_forbidden |
analyzer | Mailbox analyzer | analyzer.llm_unavailable, analyzer.tables_required, analyzer.report_busy |
templates | Workflow templates | templates.invalid_graph, templates.forbidden_node |
resource | Lists offered while configuring a node | resource.unavailable, resource.context_required |
notification, dashboard | Notifications and dashboards | notification.not_found, dashboard.forbidden |