Success and errors

What happens after someone submits your form depends on how the form was sent.

  • A plain HTML form always navigates to another page.
  • A JavaScript form that asks for JSON stays on your page unless your code redirects it.

Plain HTML forms always redirect

A normal browser submission receives a 303 redirect from Form Plume:

<form action="https://api.formplume.com/f/{public_slug}" method="POST">

You choose where that redirect goes in the form's Settings under What to do on success? and What to do on failure?

When the submission succeeds

You can choose one of these options in the dashboard.

SettingWhat the visitor sees
Hosted thank-you pageForm Plume's default confirmation page
Redirect to URLA page on your own website

The hosted page is the default. View an example thank-you page.

When the submission fails

You can choose one of these options in the dashboard.

SettingWhat the visitor sees
Hosted error pageForm Plume's default error page
Same redirect as successThe custom URL already configured for success
Redirect to URLA separate error page on your website

View an example error page.

Form Plume adds fp_error to custom failure URLs so your page can decide what to show:

https://example.com/form-error?fp_error=validation_failed

Can I customize the hosted pages?

No. The hosted thank-you and error pages use Form Plume's standard title, message, and branding. They do not display submitted values.

Use Redirect to URL when you need your own design, copy, tracking scripts, navigation, or next steps. You build and host that page, then paste its absolute https:// URL into the form settings.

Override the destination from one form

The saved dashboard settings apply to every submission. Reserved fields can override them for one HTML form:

<input type="hidden" name="_redirect" value="https://example.com/thank-you">
<input type="hidden" name="_error_redirect" value="https://example.com/form-error">

The order is:

  1. A valid _redirect or _error_redirect field in the request
  2. The destination saved in the form settings
  3. The Form Plume hosted page

Use dashboard settings when every copy of the form should behave the same way. Use reserved fields only when separate forms or landing pages need separate destinations.

JavaScript forms do not redirect automatically

Send Accept: application/json when your page will handle the result:

const response = await fetch(endpoint, {
  method: "POST",
  headers: { Accept: "application/json" },
  body: new FormData(form),
});
 
const result = await response.json();
 
if (!response.ok) {
  showError(result.errors?._form ?? "The form could not be submitted.");
  return;
}
 
if (result.next) {
  window.location.assign(result.next);
} else {
  showSuccess("Your message was sent.");
}

On success, Form Plume returns:

{
  "ok": true,
  "id": "submission_id",
  "next": "https://example.com/thank-you"
}

next contains the configured custom success URL, or null when the form uses the hosted page. Your JavaScript decides whether to follow it or show an inline message.

On failure, Form Plume returns the correct HTTP status and an error body:

{
  "ok": false,
  "error": "validation_failed",
  "errors": {
    "_form": "The submission could not be accepted."
  }
}

Always check response.ok. A completed network request is not necessarily a successful submission.

Error codes

CodeStatusWhat it means
not_found404The endpoint does not match a form
form_inactive410The form has been disabled
unauthorized401A private form did not receive a valid access key
origin_not_allowed403The browser origin is not allowed
rate_limited429Too many submissions arrived too quickly
email_rejected422An email address failed the configured hygiene rules
captcha_failed403A required CAPTCHA token did not verify
uploads_unavailable503File storage is unavailable
too_many_files413The submission contains too many files
invalid_file400A file was empty, unreadable, or invalid
file_too_large413A file exceeds the configured limit
unsupported_type415The file type is not allowed
storage_quota_exceeded402The account has reached its storage limit
validation_failed400 or 422The payload or a protected control was invalid
payload_too_large413The submission exceeds the field or payload limit
internal_error500Form Plume could not process the request safely

A 429 response also includes Retry-After. Wait for that period before allowing another attempt.

On this page