Getting started
Everything you need to start collecting form submissions with formvoxo.
Quick start
1. Create a form in your dashboard
2. Set your form action to the endpoint URL
3. Submit. emails arrive instantly
That's it. No backend to write, no webhooks to configure, no server to maintain. Create your free account →
Embedding a form
Set your form's action attribute to your formvoxo endpoint URL. The token is generated when you create a form in your dashboard.
<form action="https://app.formvoxo.com/f/YOUR_TOKEN" method="POST" > <!-- Always include this hidden honeypot --> <input type="text" name="_honey" style="display:none" tabindex="-1"> <input type="text" name="name" required> <input type="email" name="email" required> <textarea name="message"></textarea> <button type="submit">Send</button> </form>
Replace YOUR_TOKEN with the unique token from your form's dashboard page.
Reserved fields
These field names are handled specially by formvoxo and are stripped from stored and emailed data.
| Field | Purpose | Required |
|---|---|---|
_honey |
Honeypot spam trap. Must always be empty. Keep it hidden with CSS. | Recommended |
_redirect |
Override the redirect URL for this specific submission (Pro+). | Optional |
_subject |
Custom subject line for the notification email. | Optional |
AJAX / JSON API mode
Send Accept: application/json to receive a JSON response instead of a redirect. Perfect for single-page apps and headless sites.
async function submitForm(data) { const res = await fetch( 'https://app.formvoxo.com/f/YOUR_TOKEN', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(data), } ); if (!res.ok) throw new Error('Submission failed'); return res.json(); // { message: "Submission received." } }
JSON mode works with any JS framework. React, Vue, Svelte, vanilla JS. No special library needed.
Spam protection
formvoxo has two built-in spam defences. No CAPTCHA friction for real users.
Add a hidden _honey text input. Bots fill it. Humans don't see it. If it's not empty when submitted, the submission is silently flagged as spam (stored but not emailed).
Configurable rate limit (default 5 submissions per 10 minutes per IP address). Exceeded requests receive a 429 response.
Custom redirects
By default, successful submissions redirect to /thank-you. Pro+ plans can override this globally per form or per-submission.
<!-- Global redirect: set on the form in your dashboard --> <!-- Per-submission override: --> <input type="hidden" name="_redirect" value="https://yoursite.com/custom-thank-you">
Domain whitelist
Pro+ plans can restrict which domains can submit to a form. Add domains in your form's settings. Supported patterns:
example.com # exact match *.example.com # any subdomain localhost # local development
If no domains are configured, submissions are accepted from any origin.
Error responses
All errors return JSON with a single error key when Accept: application/json is set.
| Status | Meaning |
|---|---|
200 |
Submission received successfully. |
403 |
Form inactive / domain not allowed / submission limit reached. |
404 |
Token not found (form does not exist). |
429 |
Rate limit exceeded. Too many requests from this IP. |