Point your form at one endpoint. We handle the rest.
Submissions are stored, spam-filtered and delivered to your inbox, Slack or webhook. No server to write, no database to run.
- 250 free submissions / month
- No credit card
- Spam filtering built in
| Form | Project | From | Status | Received |
|---|---|---|---|---|
| quote-request | Copper & Oak | kate@brightlane.co | Delivered | Just now |
| contact | Northwind Dental | maria.l@gmail.com | Delivered | 2 min ago |
| quote-request | Copper & Oak | d.fontenot@outlook.com | Delivered | 9 min ago |
| newsletter | Bayou Outfitters | win-prize@x7f.ru | Spam | 14 min ago |
| careers | Harborlight Studio | sam.nguyen@proton.me | Retrying | 21 min ago |
Everything your form needs after someone hits submit
Storage, spam filtering, notifications, webhooks and exports, from one endpoint.
MakeTheForm is the backend your forms are missing, whether you use it in plain HTML, from your framework, or from your server.
<form action>Plain HTML
Paste your endpoint into the action attribute. Works on static sites, Webflow, Framer and anything that renders a form.
fetch()Your framework
POST JSON or FormData from React, Next.js, Astro or Vue and read a JSON response back. No API route to maintain.
POST /v1/forms/:id/submissionsFrom your server
Submit with a secret API key and an idempotency key, so a retried request never stores a submission twice.
Collect, filter and deliver every submission
Point any form at your endpoint and start receiving.
Form data, JSON and file uploads land in one inbox, searchable and exportable.
Create a free endpoint- Any content type
- URL-encoded, multipart and JSON. File uploads on Pro and Agency, up to 10 GB of storage.
- Redirects and responses
- Send people to your own thank-you page on an allowed domain, or get JSON back for AJAX forms.
- Search and export
- Filter by form, project or field value, then export to CSV.
// app/contact/actions.ts
const res = await fetch("https://mtform.co/f/your-form-key", {
method: "POST",
headers: { "Accept": "application/json" },
body: new FormData(form),
});
// 201 Created
{
"ok": true,
"submission_id": "5f0c2b8e-3d1a-4c6e-9b7f-2a8d4e6c1b90",
"message": "Submission received"
}Stop spam before it reaches your client’s inbox.
Layered filtering runs on every request, without making real visitors solve a CAPTCHA.
See how filtering works- Honeypots and content scoring
- Bots fill the hidden field. A 0 to 100 score, at the sensitivity you choose per form, catches the ones that do not.
- Allowed domains
- List the sites your form lives on, and posts from anywhere else are refused before they are stored.
- Rate limits
- Per-visitor and per-form limits stop floods without blocking real traffic.
- win-prize@x7f.ruHoneypot field filledBlocked
- seo-deals@mail.xyzContent score 94Spam
- 203.0.113.42Rate limited, 30 per 10 min429
- jr.landry@gmail.comPassed all checksDelivered
- 198.51.100.7Bot challenge failed403
Route every submission to where the work happens.
Email, Slack, 18 integrations and signed webhooks (up to 10 per form), retried automatically when a destination is down.
Set up a webhook- Email notifications
- Per-form verified recipients, with the sender in Reply-To. Instant on Pro and Agency, a daily digest on Free.
- Signed webhooks
- An HMAC-SHA256 signature on every request, and retries with backoff for up to 12 hours.
- Stored first, delivered second
- Every submission is saved before any delivery is tried, so an outage delays a notification and never loses one.
- Emailquotes@copperandoak.comReply-To: senderDelivered
- Slack#leadsDelivered
- Webhookapi.copperandoak.com/leadsattempt 2Delivered
POST /leads
x-maketheform-signature: t=1758561,v1=5c1e…
{ "event": "submission.created",
"submission": { "form_name": "quote-request",
"fields": [{ "name": "email", "value": "kate@brightlane.co" }] } }An API that does exactly what the docs say.
Predictable JSON, real status codes and idempotent retries. Submit from your server with a secret key and get the same answers a browser form gets.
- 201
- stored
- 200
- idempotent replay
- 429
- with Retry-After
# Submit from your server, with a secret key
curl -X POST https://mtform.co/v1/forms/YOUR_FORM_ID/submissions \
-H "Authorization: Bearer mtf_sk_••••••••" \
-H "Idempotency-Key: order-4815" \
-H "Content-Type: application/json" \
-d '{"email":"kate@brightlane.co","message":"Quote please"}'
HTTP/1.1 201 Created
{
"ok": true,
"submission_id": "5f0c2b8e-3d1a-4c6e-9b7f-2a8d4e6c1b90",
"message": "Submission received"
}Your forms, wherever you build
Static sites and builders
Anything that can render a <form> tag works on day one, including pages an AI builder generated.
Platform guidesJavaScript frameworks
Post with fetch and handle the JSON response inline, or let the browser follow a redirect.
Framework snippetsNotifications and automations
Post to Slack or Discord, add a row in Airtable or Notion, or open a GitHub issue, among 18 integrations. Google Sheets is coming soon.
All integrationsEvery client’s forms in one workspace.
Build the site, hand over the inbox. Keep each client’s forms, recipients and access separate, on one plan.
- A project per client
- Each client’s forms, recipients and allowed domains stay together, in one workspace.
- Client access
- Invite a client to see only their own project’s submissions, nothing else in the workspace.
- Hand over the project
- Move a project to the client’s own workspace when the job ends. Their endpoints keep working.
- One plan
- Every project runs on the workspace’s plan: 25,000 submissions a month on Agency, with usage per project.
Switch workspace
Projects
- NDNorthwind Dental4 forms · 318 submissions this month
- COCopper & Oak6 forms · 1,204 submissions this month
- BOBayou Outfitters3 forms · 842 submissions this month
Get started with MakeTheForm
Read the docs
Guides for HTML, Next.js, React and server-side submissions, with copy-paste examples.
Open the docsTalk to us
Running forms for dozens of clients? Tell us what you are moving and we will help.
Contact usForm backend questions
What is a form backend?
A form backend is the server side of a web form: the part that receives the POST, filters spam, stores the submission, and delivers it to you. HTML can describe a form but cannot process one, so without a backend a form has nowhere to send anything. A hosted form backend gives you that endpoint without deploying or maintaining a server.
Can I send an HTML form to email without a server?
Yes. Set your form action to a hosted endpoint URL and the submission is received, spam filtered, stored, and emailed to you. This is a two-line change to your markup, needs no JavaScript, and works on static hosts like GitHub Pages and Netlify that cannot run server code.
Is my form endpoint URL a secret?
No. The endpoint lives in client-side HTML that anyone can view, so it is an address rather than a credential. Forms are protected by restricting which domains may submit, by rate limits, and by spam filtering. Any provider telling you to hide a key that ships in the page is describing something that cannot work.
What happens to my submissions if the email fails?
Nothing is lost. A submission is stored the moment it is accepted, before any notification is attempted, so storage and delivery are independent. An unverified recipient or a mail outage delays the email while the payload stays in your inbox and remains exportable.
Does this work with React, Next.js, and AI site builders?
Yes. The endpoint accepts an ordinary POST, so it does not care what rendered the form. That covers plain HTML, React, Next.js, Vue, Svelte, Astro, and Webflow, along with pages generated by Lovable, Bolt, v0, Cursor, and Replit, which produce working markup but no backend to receive it.
Ship the form. Skip the backend.
Get your endpoint, free250 submissions a month free. No credit card. No trial clock.