FormFlow
EN
Start free
Docs/ Forms/ Forms

Forms

Create a form in the console, point your HTML at its endpoint, and tune how it accepts submissions.

A form in FormFlow is an endpoint. You create it once in the console, point any <form> tag at it, and FormFlow takes care of storage, notifications, anti-spam and webhooks. There is nothing to deploy on your side.

Creating a form

From the console, click New form and give it a name and one or more notification email addresses. That’s the whole setup.

Every form gets a URL-safe slug, generated from the name (Contact formcontact-form). You can pass your own slug when creating the form; if it’s taken, FormFlow appends a short suffix to keep it unique. The slug is part of your public endpoint:

https://api.formflow.cc/v1/f/<slug>

Point your form at it and you’re live:

<form action="https://api.formflow.cc/v1/f/contact-form" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" rows="4"></textarea>
  <button type="submit">Send</button>
</form>

Statuses

A form is in one of three states:

StatusMeaning
liveAccepting submissions. The default for new forms.
pausedEndpoint stays up but rejects submissions with 403 form-not-live. Existing data is untouched.
draftSame as paused — useful while you’re still wiring things up.

Only live forms accept submissions. Posting to a paused or draft form returns a 403 with a problem+json body (https://formflow.cc/problems/form-not-live), so your monitoring can tell “paused on purpose” apart from “form deleted” (404).

Configuration

Everything below is editable per form in the console (or via PATCH /v1/forms/:id with a management key):

SettingDefaultWhat it does
nameDisplay name in the console and in notification emails.
notify_emailsComma-separated list of addresses; each one gets an email notification for every submission.
from_addressFormFlow defaultOverride the From address on notification emails.
subject_templateNew submission — <form name>Subject line for notification emails; {form} and {id} are replaced with the form name and submission id.
honeypot_enabledonHidden-field spam trap. See Anti-spam.
honeypot_field_gotchaName of the honeypot field your markup includes.
turnstile_enabledonRequire a valid Cloudflare Turnstile token on every submission — turn it off if you can’t add the widget. See Anti-spam.
rate_limit_per_10m60Max submissions per IP per 10 minutes for this form.
retention_days30How long submissions are kept before automatic deletion (capped by your plan).

Limits

Your plan caps the number of forms, monthly submissions, attachment sizes and retention. When the monthly submission quota is used up, the endpoint responds 402 quota-exceeded until the calendar month rolls over or you upgrade — see Submission ingest for the exact behaviour.

Next steps

  • Anti-spam — honeypot, Turnstile and rate limits in detail.
  • Submission ingest — content types, files, idempotency and every response shape.
  • Webhooks — fan submissions out to your own services.
Last updated: June 10, 2026