What is a static form?

A static form is an HTML form on a static website. The site is just files (HTML, CSS and JavaScript) served as they are, with no server code of its own. The form collects input like any other, but when a visitor presses Submit, the site has nothing to receive the data. So a static form sends its submissions to a service outside the site, usually a form backend, which delivers them to your inbox or other tools.

Updated

Why a static site can't handle a form on its own

Static hosts such as GitHub Pages, Cloudflare Pages, Netlify and Vercel serve your files fast and cheaply. Sites built with Hugo, Jekyll, Astro, Eleventy or plain HTML all end up as static files. What a static host doesn't do by default is run your code when a request comes in, and a form submission is exactly that: a POST request that something has to receive, check and pass on.

You can write the HTML for a form on a static site. The missing part is the address in its action attribute: a URL that accepts the submission. A static form points that attribute at a service that does the server work for you.

How a static form works with a form backend

  1. The form's action is the backend's endpoint, and its method is POST. A hidden field identifies your form, so the backend knows where to deliver it.
  2. A visitor fills in the form and submits it. The browser sends the fields straight to the backend; your site plays no part.
  3. The backend checks the submission for spam, for example a filled-in honeypot field or a failed CAPTCHA.
  4. It delivers what passes: by email, and depending on the service and plan, to a dashboard, a webhook or apps such as Slack or Google Sheets.
  5. The visitor is sent to a thank-you page, or, if you submitted with JavaScript, your code gets a response and shows a message.

The How it works page in our docs follows a Static Forms submission through each of these steps.

A minimal static form

This is a working contact form for Static Forms. Replace YOUR_API_KEY with the key from your dashboard and put it on any page of your site. Submissions go to https://api.staticforms.dev/submit and arrive in your inbox.

contact.html
<form action="https://api.staticforms.dev/submit" method="POST">
  <!-- Your form's API key, from the Static Forms dashboard -->
  <input type="hidden" name="apiKey" value="YOUR_API_KEY">
  <!-- Optional: where to send the visitor after a successful submission -->
  <input type="hidden" name="redirectTo" value="https://example.com/thanks">
  <!-- Optional: a honeypot field that people leave empty and bots fill in -->
  <input type="text" name="honeypot" style="display:none" tabindex="-1" autocomplete="off">

  <label for="name">Name</label>
  <input type="text" id="name" name="name" required>

  <label for="email">Email</label>
  <input type="email" id="email" name="email" required>

  <label for="message">Message</label>
  <textarea id="message" name="message" required></textarea>

  <button type="submit">Send</button>
</form>
  • apiKey identifies your form. It's meant to sit in public HTML: it can submit to your form, but it can't read your submissions or change your settings.
  • redirectTo is optional and sends the visitor to your own page after a successful submission.
  • honeypot is optional. People don't see it, so a value in it usually means a bot filled in the form.
  • Your other fields (name, email, message…) appear in the email.

The quick start guide covers signup, CAPTCHA and testing. There are also guides for plain HTML, Hugo, Jekyll, Astro and GitHub Pages.

Ways to handle a static form

A form backend isn't the only option. Which one fits depends on where your site is hosted and how much you want to run yourself. We make Static Forms, so read this as our take; the facts about other services were checked in October 2026.

A form backend service

Services such as Static Forms and Formspree give you an endpoint that works from any host. You keep your own HTML and change hosts without touching the form. The trade-off is a monthly submission limit on each plan, and another account to manage. Static Forms' free plan covers 250 submissions a month; Formspree's covers 50. Compare the two on our Formspree comparison.

Your host's built-in forms

Netlify Forms detects forms marked with a data-netlify="true" attribute when Netlify builds your site, and collects their submissions without a separate service. On Netlify's credit-based plans, forms are free and unlimited. It only works for sites Netlify builds and hosts, so moving hosts means moving your forms too. If you're already on Netlify and only need submissions emailed to you, it's hard to beat. See our Netlify Forms comparison or how to use Static Forms on Netlify.

Your own server or serverless function

You can write a small endpoint yourself, as a serverless function on your host or on a server you run, and send the email through an email provider. You control every detail and pay no form service. In exchange you build and maintain the spam checks, email delivery, bounces and storage yourself, and keep them working as your site changes.

More options are on the alternatives page.

Static form FAQ

What is a static form?
A static form is an HTML form on a static website: a site made of HTML, CSS and JavaScript files with no server code of its own. The form can collect input, but the site has nothing to receive the submission, so the form sends it to an outside service, called a form backend, which delivers it by email or to other tools.
Does a static form need a backend?
Yes. Something has to receive the POST request when a visitor submits the form. On a static site that is usually a form backend service, a form feature built into your host, or a small server or serverless function you run yourself.
Can a static form work without JavaScript?
Yes. A plain HTML form with an action URL and method="POST" works without any JavaScript. With Static Forms you can add a hidden redirectTo field to send the visitor to your own thank-you page. If you prefer to submit with fetch, send the request with an Accept: application/json header to get a JSON response.
How do I stop spam on a static form?
Use a hidden honeypot field and a CAPTCHA. On the Static Forms Free plan you get a built-in spam filter, a honeypot field and Google reCAPTCHA v2. From Starter ($4/month billed annually) you can also use Cloudflare Turnstile, hCaptcha, ALTCHA or reCAPTCHA v3, and restrict submissions to your own domains.
Is Static Forms free?
Static Forms has a free plan with 250 submissions a month delivered by email. It doesn't need a credit card. Paid plans start at $6/month, or $4/month billed annually, and add file uploads, webhooks and auto-responders.
Is Static Forms the same as StaticForm?
No. StaticForm (staticform.app) is a separate company with a similar name. Static Forms is at staticforms.dev and accepts submissions at https://api.staticforms.dev/submit.

If you're comparing the two similar names, see Static Forms vs StaticForm.

Make your static form work

The Free plan takes 250 submissions a month with no credit card. Paid plans start at $4/month billed annually.