Website contact form for a static HTML page
A website contact form here is a normal HTML form that posts to an endpoint you do not have to host. The visitor writes a name, an email address, and a message. We accept the POST, drop obvious bots, and email the fields to the address on your account. The same page is also a contact us form you can paste into a page that already exists.
Create an access key
Sign up, open the dashboard, and copy the access key. It is meant to sit in the page source. It does not log anyone into the account. Treat it like a mailbox address, not like a password. The access key is how the website contact form reaches your inbox.
Paste the form
Point the form action at https://getformpost.com/api/submit and send the key in a hidden field named access_key. Keep your own labels, layout, and CSS. The endpoint reads the fields you already wrote. Pasting that markup is the website contact form integration.
Read the email
A successful post is stored on your dashboard and mailed to the notification address. If the visitor typed a valid email field, that address is used as Reply-To so you can answer in your mail client. When that mail arrives, the website contact form has done its job.
Copy this HTML
Paste the form into any static page. Put your access key in the box, then copy. The HTML is already filled in.
The HTML below updates as you type. You do not edit the code.
HTML
<form action="https://getformpost.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
<label>
Name
<input type="text" name="name" required>
</label>
<label>
Email
<input type="email" name="email" required>
</label>
<label>
Message
<textarea name="message" required></textarea>
</label>
<input type="text" name="botcheck" tabindex="-1" autocomplete="off" style="display:none" aria-hidden="true">
<button type="submit">Send</button>
</form>What the other tools are built for
Hosted builders cover most of this job. POWr sells an embeddable widget, Jotform sells a form studio with its own editor, and Mailchimp folds a contact us form into an audience you then email as a list. Those products are built for teams that want a visual designer. This page is for a file of HTML. A website contact form on this host is that file plus the endpoint.
| Formpost | POWr | Jotform | Mailchimp | |
|---|---|---|---|---|
| You keep the markup | Your HTML | Hosted widget | Form builder | Audience tool |
| Works on a static site | Yes | Script embed | Embed | Embed |
| Mail goes to | Your inbox | Depends on the widget | Yes | A marketing list |
| Free plan | 100 a month | Limited | Limited | Limited |
What this website contact form replaces
A static host serves files. It will not run PHP, it will not open an SMTP socket, and it should not hold your mailbox password inside a repository. The usual workaround is a third-party widget that injects its own iframe, its own stylesheet, and its own account system. A website contact form of the kind described here leaves the markup in your repository. The only moving part on our side is the POST handler: read the body, check the key, apply the spam rules, write a row, and hand the text to the inbox you named on the dashboard.

A contact us form with your markup
People also search for a contact us form when they already have a page titled Contact and only need the fields to arrive somewhere. Use the same endpoint. Name the fields however the page already names them. name, email, and message are enough for a basic contact us form, and any extra text input is forwarded as its own line in the email. File inputs are ignored. There is no attachment store, which keeps the free plan from turning into an open dropbox. The website contact form and the contact us form on this page post to the same place.
The access key is public on purpose
The key ships in the HTML, so anyone who can read the page can submit. That is the product. What they cannot do is change your notification address, read other people's messages, or raise the monthly cap. Those actions require the account session. Rotate the key from the dashboard if a page you no longer control is still posting. The old key stops immediately. A website contact form that has been copied onto a spam page is fixed by rotation, not by hiding the key, because a hidden key in a public page is not hidden.

Spam: honeypot, then a short pause
The snippet includes a text field named botcheck, hidden with CSS and removed from tab order. People do not see it. A bot that fills every input will put something in it, and the endpoint answers with the same success message it uses for a real note, then throws the post away. Nothing is stored and nothing is emailed, so the bot is not told which field gave it away. After that, the same IP and the same access key are each limited to one accepted attempt every few seconds. A person sending a single contact us form never notices. A script that loops the key does. When the honeypot trips, the website contact form keeps that note out of your inbox.
JSON for scripts, a redirect for plain HTML
A browser form that posts the classic way, with Accept set to text/html, follows a redirect when you have saved a thank-you URL on the inbox. That URL has to be https, or http on localhost, and it has to be the URL you saved while signed in. A redirect field in the POST cannot point the browser somewhere else. That stops the public key from becoming an open redirect on this domain. A fetch call that sends Accept: application/json, or a body with _reply=json, gets a JSON object instead: success, a short message, and an id. The live demo on this page uses that JSON path so you can see the result without leaving the article. Either response finishes that website contact form submission.

Free cap, then a paid month
The free plan stores 100 submissions per UTC month across your inboxes, and it allows one inbox. When the counter passes the cap, later posts are still saved but locked: the fields are not emailed, and the dashboard hides them until you upgrade. At most one note a day says how many are waiting. The Pro plan, sold on the free contact form page, raises the cap to 5,000 submissions a month and 20 inboxes, with unlimited history and no branding. Checkout charges the price in the server catalog. A number typed in the browser is ignored. The website contact form keeps accepting posts after the free cap, and Pro refuses only past 5,000.
How this differs from the top results
POWr is a widget gallery. You design the form in their editor and paste a script tag. That is convenient when you do not want to write inputs, and it is the wrong trade when the page already has a design system. Jotform is a full form product: conditional logic, payments inside the form, and a builder that becomes the source of truth. Use it when the form is the product. Mailchimp wants the submission as a subscriber. That is correct for a newsletter and awkward for a support note you will answer once. This website contact form does one job: deliver the fields to your inbox and keep a copy in the dashboard. It does not score leads, and it does not start a drip campaign.
What a good page still has to do itself
The endpoint does not write your labels, your privacy line, or your required attributes. Put the email input on type=email if you want the browser to check the shape before the request leaves. Tell people how soon you read mail. If you collect anything beyond a reply address and a message, say so next to the button. We store the fields you send so you can read them when email is delayed, and we delete an inbox only when you delete it. Do not ask for passwords, card numbers, or government ids in a website contact form. The email copy is plain text plus a simple HTML table, and a secret in that table will sit in a mailbox.
From a static file to a real message
A typical page is index.html on a host such as GitHub Pages, Cloudflare Pages, or a bucket. You add the form, deploy the file, and submit once from the deployed URL so you know the host is not stripping POST bodies. Some static hosts intercept form posts on their own domain. Posting to this origin avoids that, because the action points at our host, not at theirs. If you later add a build step, keep the access key in the HTML or inject it at build time from an environment variable that is allowed to be public. Do not put a mail password in that variable. Leave the mailbox password off the static host. Deploy the file, then send one website contact form from the live URL.
When you outgrow a single inbox
One free inbox covers a single site. An inbox you already created stays, even when an older plan allowed a second one, and you cannot add another until you are back within the free limit. The monthly counter is per account, not per inbox, so an extra inbox does not multiply the free cap. The dashboard lists every stored submission from the last 30 days with the time and the email status: sent when delivery was accepted, logged when delivery is not connected yet, failed when delivery returned an error, or locked when the free month is full. A failed send is still in the list, which matters more than a green toast on the visitor's screen. You can rotate the key on one website contact form without touching another inbox.
Read the longer versions
The form to email page walks through the request itself: headers, the honeypot, and the difference between a redirect and JSON. Three short tutorials sit on the blog: html contact form send to email, submit form to email, and html form to email php. The pricing page is the free contact form plan, including what happens at the cap. If you only needed the box, the snippet below is the whole integration. Start with that snippet when a website contact form is all you came for.
Frequently asked questions
Form guides
How to post an HTML form to email without a server of your own.
HTML contact form send to email
Put a real HTML contact form on a static page and send each message to your inbox with an access key, a honeypot, and a thank-you page.
Oct 27, 2026Formpost
Submit form to email
How a browser or a small script can submit form to email: access keys, JSON replies, redirects, and the fields that must stay out of the message.
Oct 26, 2026Formpost
HTML form to email PHP
What an HTML form to email PHP script actually needs, why most static hosts cannot run it, and the same form pointed at a hosted endpoint instead.
Oct 25, 2026Formpost