Point your HTML form at our endpoint and start collecting submissions. No server, no backend code.
Pay only for what you use — no subscriptions, no monthly fees.
Works with any static site or CMS.
<form action="https://formpost.org/f/3QQPFnq8qVtVnfW" method="POST">
<label>Your Email</label>
<input type="email" name="email" required />
<label>Message</label>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
No server or complex code required.
Most form backends bill you every month whether your forms were used or not. This one does not.
There is no monthly fee to keep your forms alive. A landing page that saw no traffic in March does not send you a bill for March.
Top up a balance of submissions and forms, and it is spent as they arrive. Nothing to forecast, no tier to outgrow, no upgrade prompt at the wrong moment.
Change your form’s action attribute and you are collecting data. No SDK to install, no build step, no deployment.
There is no contract and no renewal date. Stop using it and you simply stop spending — your existing submissions stay where they are.
The endpoint is plain HTTP. Nothing below needs a server, an SDK or a build step.
<form action="https://formpost.org/f/3QQPFnq8qVtVnfW" method="POST">
<label>Your Email</label>
<input type="email" name="email" required />
<label>Message</label>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
A plain form submit. The browser posts the fields and gets a confirmation page with a link back to your site.
const form = document.querySelector('#contact')
form.addEventListener('submit', async (event) => {
event.preventDefault()
const response = await fetch('https://formpost.org/f/3QQPFnq8qVtVnfW', {
method: 'POST',
body: new FormData(form),
headers: { 'Accept': 'application/json' },
})
const result = await response.json()
if (response.ok) {
form.reset()
showMessage(result.message)
} else {
// Errors come back as JSON too, e.g. submission_limit_reached
showError(result.text)
}
})
Submit without leaving the page. Success and failure both come back as JSON, so you render your own states.
export default function ContactForm() {
const [status, setStatus] = useState(null)
async function handleSubmit(event) {
event.preventDefault()
const response = await fetch('https://formpost.org/f/3QQPFnq8qVtVnfW', {
method: 'POST',
body: new FormData(event.target),
headers: { 'Accept': 'application/json' },
})
const result = await response.json()
setStatus(response.ok ? { sent: true } : { error: result.text })
}
if (status?.sent) return <p>Thanks!</p>
return (
<form onSubmit={handleSubmit}>
{status?.error && <p>{status.error}</p>}
<input name="email" type="email" required />
<textarea name="message" required />
<button>Send</button>
</form>
)
}
The same call from a React component. Works unchanged in Next.js.
<script setup>
import { ref } from 'vue'
const sent = ref(false)
const error = ref(null)
async function submit(event) {
const response = await fetch('https://formpost.org/f/3QQPFnq8qVtVnfW', {
method: 'POST',
body: new FormData(event.target),
headers: { 'Accept': 'application/json' },
})
const result = await response.json()
if (response.ok) sent.value = true
else error.value = result.text
}
</script>
<template>
<p v-if="sent">Thanks!</p>
<form v-else @submit.prevent="submit">
<p v-if="error">{{ error }}</p>
<input name="email" type="email" required />
<textarea name="message" required></textarea>
<button>Send</button>
</form>
</template>
The same idea in Vue. Nuxt and any other SFC setup behave identically.
No. Point your form’s action attribute at your FormPost endpoint and submit it. We store the submission and show it in your dashboard. There is nothing to deploy and nothing to maintain.
Yes. The endpoint is plain HTTP, so it does not care what rendered the page. Use a normal HTML form, or post to it with fetch from any framework, static site generator or CMS.
Yes, and cross-origin requests are allowed, so it works from any domain. A fetch or XHR call gets JSON back, including for errors, so you can show your own success and failure states. A plain browser form submit gets a confirmation page with a link back to your site instead. Send Accept: application/json if you want to be explicit about it.
You pay 10 USD per 1,000 submissions and 5 USD per 10 forms, with a minimum purchase of 5 USD. You top up a balance and it is spent as submissions arrive.
There are no plans and no monthly fee. You buy submissions and forms when you need them, and a quiet month costs you nothing.
Into your dashboard, where you can browse and read every submission. You can also forward each one to your own endpoint with a webhook, optionally authenticated with a bearer token.
Requests whose user agent identifies them as a bot, crawler or spider, and requests with no user agent at all, are rejected before a submission is stored. Submitted values are sanitised before they are saved.
Create your endpoint and start collecting data today.
Try for Free