Documentation
Error reference
Every JSON error response has the same shape: { ok: false, error: <code>, message: <human-readable text> }. The error code is stable and meant to be matched on in code; the message is meant to be read by a person and can change wording.
Ingest endpoint
Errors from posting a submission to send.webforms.to.
| Code | HTTP | Where | Meaning |
|---|---|---|---|
missing_access_key | 400 | Ingest | No key in the URL path or an access_key field in the body. |
form_not_found | 404 | Ingest | The key doesn't match any form, or the form is deactivated. |
method_not_allowed | 405 | Ingest | Something other than POST (or the OPTIONS preflight). |
rate_limited | 429 | Ingest / all APIs | Per-IP or per-key burst limit hit. Check retry-after / X-RateLimit-Reset. |
account_unverified | 403 | Ingest | No owner/admin on the workspace has a verified, unblocked account, so the form is inactive. |
quota_exceeded | 402 | Ingest | The workspace's monthly submission limit has been reached. |
validation_failed | 422 | Ingest | The submission didn't match the form's field schema. issues lists each failing field. |
Submissions API / write API / MCP
Cross-cutting errors that any authenticated endpoint can return.
| Code | HTTP | Where | Meaning |
|---|---|---|---|
unauthorized | 401 | Submissions API / write API / MCP | Missing, malformed or revoked API key. Identical body whether the key never existed or was revoked, so the endpoint can't be used to enumerate valid keys. |
insufficient_scope | 403 | Write API | The key doesn't carry the scope the endpoint requires - forms:write, destinations:write, routes:write, templates:write, api_keys:write or members:write. |
plan_required | 403 | Write API | The workspace's plan doesn't include the feature being configured (routing rules, custom templates, domain allowlist, autoresponder, custom thank-you page). |
not_found | 404 | Submissions API / write API | No such resource in this workspace - including when the id is real but belongs to a different workspace. Never distinguishes the two. |
invalid_cursor | 400 | Submissions API | The cursor query parameter isn't one this API issued. |
invalid_status | 400 | Submissions API | An unrecognised value in the status filter. |
Write API specifics
Errors specific to individual write endpoints.
| Code | HTTP | Where | Meaning |
|---|---|---|---|
invalid_name | 400 | Forms, templates | Empty or over the length limit. |
invalid_input | 400 | Destinations, Forms | A field failed validation - malformed webhook URL, SSRF-blocked host, invalid Slack/Discord/Telegram config, or an invalid customJsonSuccess/customJsonError key or value on a form's confirmation settings. |
invalid_provider | 400 | Destinations | Not one of email, slack, discord, telegram, webhook. |
unverified_address | 400 | Destinations | An email destination must point at a verified linked address for the workspace. |
linked_email_limit | 403 | Destinations | The plan's ceiling on distinct linked email addresses would be exceeded. |
unsupported | 400 | Destinations | The destination's provider can't be edited through this endpoint. |
invalid_route | 400 | Routes | The condition tree is malformed - see the routing rules validation rules. |
invalid_conditions | 400 | Routes | A new rule was posted with no conditions. Only the default rule may have none, and it already exists. |
invalid_destination | 400 | Routes | One of the integrationIds doesn't belong to this workspace. |
invalid_direction | 400 | Routes | Reorder direction must be "up" or "down". |
cannot_delete_default | 400 | Routes | The default (catch-all) rule can't be deleted. |
cannot_disable_default | 400 | Routes | The default rule can't be paused. |
invalid_template | 400 | Forms, templates | Unknown built-in template id, or a custom template id that doesn't parse. |
invalid_subject | 400 | Templates | Empty or over the length limit. |
invalid_html | 400 | Templates | Empty or over the size limit. |
template_limit | 403 | Templates | The plan's ceiling on saved custom templates would be exceeded. |
cannot_change_owner | 400 | Members | The workspace owner's role can't be changed through this endpoint. |
cannot_remove_owner | 400 | Members | The workspace owner can't be removed. |
invalid_slug | 400 | Workspace | Under 3 characters after normalizing to lowercase letters, numbers and hyphens. |
slug_taken | 400 | Workspace | Another workspace already uses that slug. |
Get your endpoint
Free for 300 submissions a month. No card required.
Start free