FreelyForm

Documentation

Quickstart: send your first submission.

Create a form, verify a recipient, and post to the endpoint. The whole path takes a few minutes.

1. Create a form

Sign up, open the dashboard, and create a form. Add up to five recipient addresses and choose what the browser should see after a successful post: a message, a redirect, or JSON.

2. Verify the recipient

Each recipient receives a confirmation link. Submissions that arrive before confirmation are stored with pending_verification and delivered automatically after the address is confirmed.

3. Post from HTML

HTML
<form action="https://freelyform.com/f/FORM_ID" method="POST">
  <input type="text" name="name" required>
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button type="submit">Send</button>
</form>

4. Or post JSON

cURL
curl -X POST https://freelyform.com/f/FORM_ID \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'Idempotency-Key: contact-2026-11-12-001' \
  -d '{"name":"Ada","email":"[email protected]","message":"Hello"}'

Successful JSON responses include the submission id and status. Validation failures return a 4xx status and a structured error code.

Response modes

Accepted responseResult
Browser form post303 redirect or an HTML success page.
Accept: application/jsonJSON with the submission id and status.
_redirect fieldRedirect to a URL you supply, subject to allowed schemes.

Inline status with the embed script

HTML
<script src="https://freelyform.com/embed.js" defer></script>

<form action="https://freelyform.com/f/FORM_ID" method="POST">
  ...
</form>

The script intercepts forms that point at /f/, posts them with fetch, disables the submit button while sending, and writes a status message. Add data-fs-native to opt a form out.

Common errors

CodeMeaning
form_not_foundThe form id is wrong or the form is inactive.
origin_not_allowedThe request origin is not on the form allowlist.
invalid_submissionA require or block rule rejected the fields.
quota_exceededThe account reached its configured monthly limit.
turnstile_requiredThe form requires a verification token.

Next: the API reference for forms, submissions, deliveries, webhooks, suppressions, and sending domains.

Request path from an HTML form to delivery HTML form action=…/f/FORM_ID Guarded ingest rate limit · honeypot Rules require · block · route Stored Postgres + queue Delivered email · webhook
Every submission is stored first, then delivered per channel. Nothing is lost when an inbox bounces.

Put your forms on a backend that keeps a record.

Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.

POST https://freelyform.com/f/FORM_ID