Skip to content

Errors ​

Every error has a stable code, a message and a hint written for the agent: what to do next.

REST answers with the HTTP status of the code and this body (details only when there are details):

json
{ "error": { "code": "SCOPE_MISSING", "message": "This key lacks scope 'send'.", "hint": "…", "details": { "scope": "send" } } }

An MCP tool answers with isError: true and one text block, CODE: message hint. A missing or revoked key and a rate limit are refused before any tool runs: HTTP 401 or 429 with a JSON-RPC error whose message is the same text.

CodeHTTPMessageHint
UNAUTHENTICATED401Missing or invalid API key.Pass the project key as Authorization: Bearer brk_live_…. Run npx brynth init to get one.
KEY_REVOKED401This API key has been revoked.This key was revoked. Ask the project owner for a new key.
SCOPE_MISSING403This key lacks a required scope.Create a key with that scope (POST /v1/keys, needs admin).
VALIDATION_FAILED400The request is invalid.Fix the listed fields and retry.
NOT_FOUND404Not found.
SLUG_TAKEN409This slug is already taken.Choose another slug or omit it to get one derived from the name.
LOGIN_NOT_VERIFIED409The sign-in link has not been confirmed yet.The user has not clicked the email link yet. Keep polling /v1/auth/poll.
LOGIN_EXPIRED410This sign-in has expired.Start again with /v1/auth/start.
LOGIN_CONSUMED409This sign-in was already used.This login was already used to create a project. Start a new login.
PROJECT_LIMIT_REACHED409This account already has the maximum number of projects.Reuse an existing project: run npx brynth status or connect it with BRYNTH_KEY. Contact support to raise the limit.
LAST_ADMIN_KEY409This is the last active admin key of the project.Create another admin key before revoking this one.
RATE_LIMITED429Too many requests.Wait retry_after seconds.
EMAIL_DELIVERY_FAILED502The sign-in email could not be sent.Retry in a minute. If it keeps failing, contact support.
INGRESS_SIGNATURE_INVALID401The webhook signature is missing or invalid.Signature missing or wrong. Check the source secret set with source_add.
PAYLOAD_TOO_LARGE413The request body is too large.Webhook bodies are limited to 5 MB.
SOURCE_NAME_TAKEN409A source with this name already exists in the project.Choose another name.
EMAIL_SOURCE_EXISTS409The project already has an email source.The project already has its email address; see source_list.
EVENT_NOT_CLAIMABLE409The event cannot be claimed or changed in its current state.The event is already claimed or closed. Call inbox_list for pending events.
EVENT_ROUTED409The event is delivered by a routing rule.This event is delivered by callback, not by pull.
LEASE_NOT_HELD409Another key holds the lease on this event.Another key holds this event. Claim a pending event instead.
LEASE_EXPIRED409The lease on this event has expired.Your lease expired and the event went back to the queue. Claim it again with inbox_claim.
TOO_MANY_WAITS429Too many concurrent waits.Too many concurrent inbox_wait (10 per key, 25 per project). Wait for one to return.
CALLBACK_URL_REJECTED400The callback URL is not allowed.Use an https URL on a public address.
KEY_LIMIT_REACHED409The project has reached its limit of active keys.The project has 20 active keys. Revoke one first.
CHANNEL_NOT_VERIFIED409An approver is not an active channel of this project.An approver is not an active channel. Call channel_list, or channel_add("telegram") and ask the user to complete verification.
CHANNEL_ADDRESS_REJECTED400This address cannot be used as a channel.Use a valid email outside the Brynth inbound domain.
CHANNEL_EXISTS409This address is already a channel of the project.This address is already a channel; see channel_list.
CHANNEL_OWNER_PROTECTED409The owner's channel cannot be removed.The owner's channel cannot be removed.
CHANNEL_KIND_UNAVAILABLE400This channel kind is not available on this server.This channel kind is not configured on this server. Use email.
POLICY_INVALID400The policy document is invalid.Fix the field at path and call policy_set again.
TOO_MANY_PENDING_REQUESTS429The project has too many pending requests.50 requests are pending. Wait for answers or let old ones expire.
CALLBACK_SECRET_MISSING409The project has no request callback secret.Create the project's callback secret with POST /v1/request-callback-secret, or omit callback_url.
DETAILS_REQUIRED400A high-risk request needs details.Put in details what you will do, why, what it touches (resources, people, amounts) and whether it can be undone. If the action is not high risk, lower risk.
QUOTA_EXCEEDED409The project disk is full.The project disk is full (limit, used). Delete keys or files you no longer need, then retry.
POLICY_DENIED403A project policy denies this action.A project policy denies this action (rule). Ask the user to change the policy with policy_set if it should be allowed.
APPROVAL_NOT_APPLICABLE409The approval does not apply to this call.The approval does not match this call: it must be an approved file_url request for the same file and expires_in, not yet used, redeemed with the API key that asked for it within 24 hours of the decision. Call file_url without approval to ask again.
UPLOAD_INCOMPLETE409The upload is incomplete.The upload is missing or its size differs from the declared one. PUT the file to upload_url with upload_headers, then call file_put with complete again.
UPLOAD_LIMIT429Too many open uploads at this path.3 presigned uploads are already open at this path. Finish one with complete, or wait for its upload_url to expire (15 minutes after upload), then call file_put with upload again.
PATH_RESERVED400This key or path is reserved.Keys under state/ are managed by state_save; paths under evt_…/ are inbound attachments and read-only.
SEND_LIMIT_REACHED429The project reached its sending limit.The project reached its sending limit (limit, window). Retry after retry_after, or send to fewer recipients.
SEND_BLOCKED403Sending is blocked for this project.Sending is blocked for this project after too many bounces or complaints, or by the operator. Tell the user; only Brynth support can unblock it.
EMAIL_SOURCE_REQUIRED409The project has no active email source.The project has no active email address, so replies would be lost. Add one with source_add (type email), then retry.
INTERNAL500Internal error.Retry later. Quote the X-Request-Id header if it keeps failing.

CLI and skill released under the MIT License.