Free plan250 submissions a month, spam filtering included, no card.See pricing →
The form backend for developers and agencies

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

Everything your form needs after someone hits submit

Storage, spam filtering, notifications, webhooks and exports, from one endpoint.

Create your first form

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/submissions

From your server

Submit with a secret API key and an idempotency key, so a retried request never stores a submission twice.

End to end

Collect, filter and deliver every submission

One endpoint takes the request, checks it for spam and sends it wherever your client needs it.
Collect

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"
}
Protect

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.
Spam · newsletterBayou Outfitters
  • win-prize@x7f.ruBlocked
  • seo-deals@mail.xyzSpam
  • 203.0.113.42429
  • jr.landry@gmail.comDelivered
  • 198.51.100.7403
Blocked this month
1,932
Marked not spam
3
Deliver

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.
Deliveries · quote-request3 of 3 delivered
  • Emailquotes@copperandoak.comDelivered
  • Slack#leadsDelivered
  • Webhookapi.copperandoak.com/leadsDelivered
POST /leads
x-maketheform-signature: t=1758561,v1=5c1e…
{ "event": "submission.created",
  "submission": { "form_name": "quote-request",
    "fields": [{ "name": "email", "value": "kate@brightlane.co" }] } }
For developers

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"
}
Works with your stack

Your forms, wherever you build

Drop it into any site, and send submissions to the tools your clients already use.
HTMLWebflowFramer

Static sites and builders

Anything that can render a <form> tag works on day one, including pages an AI builder generated.

Platform guides
ReactNext.jsAstro

JavaScript frameworks

Post with fetch and handle the JSON response inline, or let the browser follow a redirect.

Framework snippets
DiscordNotionAirtableGitHub

Notifications 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 integrations
For agencies

Every 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.

Get started with MakeTheForm

Create a form

Get an endpoint in under a minute. The free plan needs no credit card.

Sign up free

Read the docs

Guides for HTML, Next.js, React and server-side submissions, with copy-paste examples.

Open the docs

Talk to us

Running forms for dozens of clients? Tell us what you are moving and we will help.

Contact us
Questions

Form 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, free

250 submissions a month free. No credit card. No trial clock.