Error codes | Brixus365 Docs
Docs Errors Error codes

Error codes

All error codes the Developer Email API can return, grouped by error.type. Codes marked with † carry extra fields in the error object — see the note under each. For the error object shape and handling patterns, see Errors.


invalid_request_error — 400, 409, 422

The request was well-formed but contained bad input. Fix the request body; retrying as-is returns the same error.

CodeHTTPMeaningSuggested action
missing_field400None of starter_template, template_id, or html was providedSupply exactly one of the three
multiple_modes400More than one of starter_template, template_id, html was providedRemove all but one
invalid_recipient400One or more recipient addresses failed syntax or mail-server lookupCheck addresses; remove invalid ones
recipient_suppressed400The recipient is on the platform-wide bounce/complaint suppression listAddress is globally blocked — contact support if you believe this is an error
recipient_limit_exceeded400Combined to + cc + bcc exceeds 50 recipientsSplit into multiple sends; use Spark for large-scale sends
batch_limit_exceeded400Batch request exceeds 100 messages or 1,000 total recipientsSplit into smaller batches
attachment_too_large400A single attachment exceeds 5 MB, or all attachments combined exceed 7 MBReduce file size or link to the file instead of embedding
attachment_type_not_allowed400Attachment content type is not in the allowlistSee Allowed attachment types below
too_many_attachments400More than 10 attachments on a single messageReduce to 10 or fewer; link to additional files instead
variable_validation_failed400Template variable values failed validationCheck variable names and value types against the template definition
idempotency_key_too_long400Idempotency-Key header exceeds 256 bytesShorten the key value
validation_failed422Request body is structurally invalid — wrong field type, missing required field, unparseable JSONFix the field named in details.field
domain_already_exists409A domain with this hostname is already added for this accountNo action needed — domain already exists
domain_in_use409Domain cannot be deleted because campaigns reference itReassign or delete the campaigns that use this domain first
domain_cannot_delete_default400Cannot delete the default sending domainSet another domain as default in Settings → Email Setup, then delete

recipient_suppressed details:

"details": { "recipient": "user@example.com", "bounce_type": "hard" }

bounce_type is "hard" or "complaint".

recipient_limit_exceeded details:

"details": { "total": 55, "limit": 50 }

batch_limit_exceeded details:

"details": { "message_count": 120, "total_recipients": 800, "max_messages": 100, "max_recipients": 1000 }

attachment_too_large details:

"details": { "scope": "per_attachment", "size_bytes": 6291456, "limit_bytes": 5242880, "filename": "report.pdf" }

scope is "per_attachment" (5 MB cap) or "total" (7 MB cap).

attachment_type_not_allowed details:

"details": { "content_type": "application/x-executable", "filename": "setup.exe" }

too_many_attachments details:

"details": { "count": 13, "limit": 10 }

validation_failed details:

"details": {
  "field": "body.to",
  "errors": [{ "type": "missing", "loc": ["body", "to"], "msg": "field required" }]
}

authentication_error — 401

The request could not be authenticated. Check your API key.

CodeHTTPMeaningSuggested action
missing_api_key401X-API-Key header is absentAdd the X-API-Key header to every request
invalid_api_key401The API key is invalid, malformed, or has been revokedVerify the key in Settings → API Keys; rotate if revoked
key_revoked_upgrade401The preview-tier key was revoked when the account was upgraded to a full accountUse the new bx_live_ key from Settings → API Keys

authorization_error — 403

The request was authenticated but is not permitted.

CodeHTTPMeaningSuggested action
upgrade_required403The feature is only available on a paid planUpgrade at brixus365.com/pricing
tier_suspended403The account is suspended due to deliverability thresholds (bounce or complaint rate too high)Check your rates in Connect → Dashboard; contact support to appeal
scope_required403The API key does not have the required scope for this endpointIssue a new key with the required scope in Settings → API Keys
no_verified_sender403No verified sending domain on this accountVerify a domain first — see Verify your sending domain
jwt_required403The endpoint requires dashboard login authentication, not an API keyThis operation can only be performed from the dashboard — use the web UI instead

upgrade_required extras:

"upgrade_url": "https://brixus365.com/pricing"

not_found — 404

The requested resource does not exist or is not accessible from this API key.

CodeHTTPMeaningSuggested action
message_not_found404Message ID not found or belongs to a different API keyCheck the message ID and that the key has emails:read scope
template_not_found404Template ID not foundVerify the template exists in Connect → Templates
domain_not_found404Domain ID not foundCheck the domain ID in Settings → Email Setup

idempotency_error — 409

The Idempotency-Key header was used in a conflicting way.

CodeHTTPMeaningSuggested action
idempotency_key_mismatch409This key was previously used with a different request bodyUse a new unique key, or re-send the original request body unchanged
idempotency_in_flight409A concurrent request with this key is still processingWait and retry — the original request will complete shortly

idempotency_in_flight extras:

"retry_after_seconds": 5

rate_limit_error — 429

A send limit was reached. See Rate limits for thresholds and reset windows.

CodeHTTPMeaningSuggested action
rate_limit_exceeded429Request rate too high — too many calls in a short windowRead the Retry-After header; wait, then retry
daily_limit_exceeded429Daily send quota reachedWait for the daily reset, or upgrade your plan
monthly_limit_exceeded429Monthly send quota reachedUpgrade your plan to send more this month

rate_limit_exceeded extras:

"retry_after_seconds": 47,
"details": { "limit": 10, "window_seconds": 60 }

api_error — 500

An internal error that is not a client mistake.

CodeHTTPMeaningSuggested action
internal_error500Internal inconsistency on our sideRetry with exponential backoff; contact support if it persists

service_unavailable — 503

The email delivery provider is temporarily unavailable.

CodeHTTPMeaningSuggested action
provider_unavailable503Upstream provider temporarily downRetry with exponential backoff

Sign-up API codes

These codes are only returned by the developer sign-up and account upgrade endpoints (/v1/auth/magic-link, /v1/auth/upgrade). You will not encounter them from the send or message endpoints.

CodeHTTPtypeMeaning
magic_link_invalid401authentication_errorThe sign-in magic link is invalid or has expired — request a new one
already_signed_up409idempotency_errorThis email address is already registered
not_a_preview_account404not_foundEmail not registered as a developer preview account
already_upgraded400invalid_request_errorAccount has already been upgraded — preview-to-full is a one-way transition

Allowed attachment types

The following MIME types are accepted. Any other content type returns attachment_type_not_allowed.

CategoryMIME typeCommon extension
Documentapplication/pdf.pdf
Calendartext/calendar.ics
Imageimage/png.png
image/jpeg.jpg / .jpeg
image/gif.gif
image/webp.webp
Officeapplication/msword.doc
application/vnd.openxmlformats-officedocument.wordprocessingml.document.docx
application/vnd.ms-excel.xls
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xlsx
application/vnd.ms-powerpoint.ppt
application/vnd.openxmlformats-officedocument.presentationml.presentation.pptx
Texttext/csv.csv
text/plain.txt

Attachment limits: 5 MB per file, 7 MB total across all attachments on a single message, 10 attachments maximum.


What’s next

You want to…Go to
Understand the error object shape and handle errors in codeErrors
See request rate limits and monthly send quotasRate limits
Send your first emailQuickstart
Start sending

9,000 transactional emails a month, free.

No credit card. No commitment. Every error code you just read is one less surprise.