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
<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 -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 response | Result |
|---|---|
| Browser form post | 303 redirect or an HTML success page. |
Accept: application/json | JSON with the submission id and status. |
_redirect field | Redirect to a URL you supply, subject to allowed schemes. |
Inline status with the embed script
<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
| Code | Meaning |
|---|---|
form_not_found | The form id is wrong or the form is inactive. |
origin_not_allowed | The request origin is not on the form allowlist. |
invalid_submission | A require or block rule rejected the fields. |
quota_exceeded | The account reached its configured monthly limit. |
turnstile_required | The form requires a verification token. |
Next: the API reference for forms, submissions, deliveries, webhooks, suppressions, and sending domains.
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