Point any HTML form at Manifolio and the submissions land in Forms in the admin, with the page, country and device next to each one. No backend needed.
A plain HTML form
<form method="post" action="https://api.manifolio.com/v1/forms/contact?key=mf_pk_live_your_site_key">
<input name="name" required>
<input name="email" type="email" required>
<textarea name="message"></textarea>
<input type="hidden" name="_redirect" value="https://aurora.coffee/thanks">
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off" hidden>
<button>Send</button>
</form>contact is the form key: lowercase letters, digits, - and _, up to 48 characters. A form appears in the admin with its first submission; a project can have up to 50 forms.
With fetch
const res = await fetch("https://api.manifolio.com/v1/forms/contact", {
method: "POST",
headers: { "content-type": "application/json", "x-manifolio-key": "mf_pk_live_your_site_key" },
body: JSON.stringify({ name: "Ana", email: "ana@example.com", message: "Do you ship to Cluj?", _page: location.pathname }),
});
// 201 { "ok": true, "id": "01a1b2c3-0000-7000-8000-000000000003" }The endpoint accepts JSON, application/x-www-form-urlencoded and multipart/form-data. Files in a multipart form are ignored.
The key
Send the publishable key in one of three ways: the key query parameter, the x-manifolio-key header or a _key field. The request must come from one of the key's domains (checked from Origin, then Referer).
Reserved fields
Fields that start with _ are read by Manifolio and not stored:
| Field | Does |
|---|---|
_gotcha | a honeypot: when it has a value, the answer is success and nothing is saved |
_redirect | after saving, a 303 redirect to this address; it must be on the key's domain |
_page | the page the form was on, since browsers send only the origin across sites |
cf-turnstile-response | the Turnstile token, for forms that require a captcha |
Limits
- 32 KB per submission, 50 fields, 5,000 characters per value, no nested objects
- 5 submissions a minute per visitor and form, 120 a minute per project
Webhooks and export
Every submission fires form.submitted, with the form and the submitted fields, so you can forward it anywhere. See Webhooks. In the admin you can mark submissions read, unread or spam, delete them and export a form to CSV.