Errors
The public endpoint answers with HTTP 200 even when a submission is rejected, and puts a machine-readable code in the error key. A browser submission renders the confirmation page with a human-readable message instead. Branch on the payload, never on the status code.
{ "error": "cooldown", "remaining_seconds": 18342 }
Contact form errors
| Code | Meaning | What to do |
|---|---|---|
missing_form_id |
The URL carried no form ID. | Check the action URL. |
not_found |
No such form, or the form is disabled. | Confirm the endpoint, and that the form is enabled in the dashboard. |
unverified |
The form's notification email was never verified, so nothing can be delivered. | Click the verification link sent to that address. The owner is reminded once a day. |
missing_fields |
email or message was empty. |
Both are required on contact forms. |
invalid_email |
The email value did not validate. |
Fix the address. |
cooldown |
This address already submitted to this form within the last 6 hours. Includes remaining_seconds. |
Wait it out; the limit cannot be disabled. |
limit_reached |
The form owner's account hit its monthly submission cap. Includes monthly_limit. |
The owner needs to upgrade; submissions across all their forms are turned away until the month resets. |
Feedback form errors
| Code | Meaning |
|---|---|
invalid_rating |
The rating value did not match the form's style - 1/0 for yes-no forms, 1-5 for star forms. |
limit_reached |
The owner's monthly submission cap is reached. Votes count against the same quota. |
server_error |
The vote could not be stored. Safe to retry. |
Successful responses that did nothing
Some outcomes deliberately look like success to the caller. This is intentional: a bot that gets an error learns something, and a visitor should never see a broken widget.
| Response | Meaning |
|---|---|
{"success": true} after a spam signal fired |
The submission was silently dropped. Nothing was stored or delivered, and the form's blocked-spam counter went up. See Spam protection. |
{"success": true, "duplicate": true} |
A repeat vote from the same form, page and IP within 12 hours. Not stored. |
{"success": true, "not_collected": true} |
The owner's plan no longer includes feedback forms, so the vote was discarded. The owner is alerted once a day. |
Uploads behave the same way: a file that is too large, of a disallowed type, or over the account's storage quota is skipped while the text submission still succeeds. There is no error code for a dropped attachment - check the submission in the dashboard. See File uploads.
Verification link
Opening /forms/verify with a missing, unknown or already-used token shows the invalid_token state. Verification tokens are single-use and expire after 24 hours; request a fresh one from the form's settings.