missing_api_key 401 API key required- Send Authorization: Bearer <API key>.
invalid_api_key 401 Invalid API key- The key is wrong, revoked or expired. Create or rotate one in Settings, API keys.
key_not_workspace_scoped 403 API key has no workspace- An old key with no workspace. Create a new key in the workspace you want to use.
key_owner_not_member 403 API key's creator left the workspace- An older key acts as the person who made it, and they have left the workspace. Create a new key: new keys belong to the workspace.
insufficient_scope 403 API key is missing a scope- The key lacks the scope named in required_scope. An owner or admin can add it in Settings, API keys.
insufficient_permission 403 Your role does not allow this- An older key is limited by its creator's role, and that role cannot do this.
invalid_request 400 Invalid request- A field is missing, the wrong type, or not one the endpoint knows. param names it.
invalid_json 400 Request body is not valid JSON- The body is not valid JSON.
invalid_cursor 400 Invalid cursor- Pass next_cursor exactly as a list returned it, to the same endpoint.
unsupported_api_version 400 Unsupported API version- Envoi-Version must be a released version. supported_versions lists them.
api_version_sunset 410 API version retired- That version is retired. Send a newer Envoi-Version.
resource_missing 404 Not found- Nothing with that id in this workspace.
payload_too_large 413 Request body too large- Bodies are limited to 1 MB.
unsupported_media_type 415 Request body must be JSON- Send Content-Type: application/json.
idempotency_key_required 400 Idempotency-Key required- Creates and sends need an Idempotency-Key header: any unique string up to 255 characters.
invalid_idempotency_key 400 Invalid Idempotency-Key- Use up to 255 printable ASCII characters, no spaces.
idempotency_conflict 422 Idempotency-Key reused with a different request- That Idempotency-Key was already used by another key, with a different body, or on another endpoint. Use a new key for a new request.
idempotency_in_flight 409 Request with this Idempotency-Key is still running- The first request with this key is still running. Retry with the same key after Retry-After.
idempotency_result_unavailable 409 Request already ran; its response was not stored- The request with this key already ran, but its response could not be stored. Read the resource to see what it did; do not retry it.
precondition_required 428 If-Match required- Writes to a draft need If-Match with the version (the ETag) you last read.
precondition_failed 412 Version has changed- Someone changed it since you read it, and nothing was saved. Read it again, re-apply your change, and send the new version.
rate_limited 429 Too many requests- Wait for Retry-After seconds. limit_scope says whether the key, the workspace, or the key’s reports (analytics, 60 a minute) hit their limit.
conflict 409 Conflicts with the current state- The object is not in a state that allows this, such as a campaign that is no longer a draft or a live flow whose steps you tried to change. detail says which.
work_session_expired 410 Work session expired- The ws_ session went 30 days without use. detail names the tool that reopens it; the draft is kept.
work_session_closed 409 Work session closed- The ws_ session was finished or abandoned. Start a new one on the same object.
send_blocked 409 Not ready to send- Something stops the send or the flow going live. blockers lists each one and who can fix it; the campaign or flow check shows them all.
setup_incomplete 409 Workspace setup not finished- The workspace has not finished its setup: its domain, sender or business details. missing lists each row with where it is fixed; a person finishes them at setup_url. Nothing was sent.
list_source_missing 409 A list in the audience has no answered source- The campaign reaches people on a list nobody has said the source of. lists names each one (id and name), and detail says the same in words. A teammate answers how those people joined from the list in Envoi (Answer for this list); an API key or agent cannot. Checked after setup_incomplete. Nothing was sent.
publish_blocked 409 Not ready to publish- The form is not fit to go live. blockers lists each one and who can fix it; form_check shows them all.
approval_required 403 Approval required- A person must approve this send or flow. Ask with POST /approvals and share the link it returns.
approval_unusable 409 Approval cannot be used- The approval cannot be used: already used, rejected, voided by an edit, over its recipient cap, or outside its window. reason says which.
approval_expired 410 Approval expired- Approvals last 24 hours. Ask for a new one.
agent_send_cap 403 Agent send limit reached- This agent reached the workspace's daily limit for sends without approval. Ask a person to approve it.
agent_unsubscribe_cap 403 Agent unsubscribe limit reached- API keys and agents can unsubscribe at most 100 subscribed people in a workspace in any 24 hours, across contact writes and imports. Nothing in the request was changed. A teammate can unsubscribe more people in Envoi.
confirmation_required 409 Confirm the recipient count- Repeat the exact count to go ahead without a person approving it: recipient_count as confirm_recipients for a send, entrants as confirm_entrants for a flow.
send_worker_updating 503 Send worker is updating- Envoi is deploying its send worker, which must be on the current release before an approved send can go out. Nothing was sent. Retry in a few minutes.
storage_not_configured 503 Media storage not configured- Media storage is not set up on this Envoi instance.
email_provider_error 502 Email provider refused the message- The email provider did not accept a test message, so nothing was sent and the campaign is unchanged. Retry shortly; provider_code names the provider’s reason when it gave one.
range_too_wide 400 Date range too wide- A report reads at most about three years, and a grouped series at most 100 points. Shorten the range, or group by a longer period.
report_timeout 503 Report took too long- The report ran past its time limit and was stopped. Ask for less: a shorter range, a longer group_by, fewer metrics, or no compare or people.
validation_error 400 Invalid request- The request was well formed but not allowed. detail says why.
usage_limit_exceeded 402 Plan limit reached- The workspace's plan limit for this is used up.
unverified_sender 400 Sender not verified- Send from a domain verified in this workspace.
url_blocked 400 URL not allowed- That URL points somewhere Envoi will not fetch, such as a private address.
domain_rejected 400 Domain rejected- That domain cannot be used for sending.
domain_already_registered 409 Domain already registered- That domain is already registered to a workspace.
domain_provider_unavailable 503 Domain provider unavailable- The domain provider did not answer. Try again shortly.
agentmail_not_configured 503 Inbound email not configured- Inbound email is not set up on this Envoi instance.
inbox_provider_not_configured 503 Inbound email not configured- Inbound email is not set up on this Envoi instance.
internal_error 500 Internal error- Our fault. Retry, and quote request_id to support if it keeps happening.