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.