Skip to content

Forms ​

A form is a hosted endpoint you point ordinary HTML at. There is no API key in the markup — the endpoint is public and rate-limited instead — so you can paste a snippet into a static site and be collecting leads in a minute.

Each submission is stored and emits form.submitted, which is what makes forms the usual trigger for an automation.

The list ​

Three stats across the top — forms, total submissions, when the last one arrived — then a table with each form's name, submission count and last submission.

Row actions are Open form, Activate / Deactivate, and delete. A paused form's endpoint rejects submissions until you turn it back on; the form page says so in a banner.

Creating one ​

New form (/forms/new) — or start from a preset, which is /forms/new/<preset>: Contact form, Newsletter sign-up or Feedback form. A preset only prefills the fields; everything stays editable before you create it.

For each field you give:

KeyThe HTML name of the input.
LabelOptional. How the value is shown in saved submissions.
TypeText, Email, Phone, URL, Number, Date, Long text or Checkbox.
RequiredWhether the snippet marks it required.

A live preview builds alongside as you add fields.

An empty field list is a valid choice

Define no fields and the form captures whatever is posted. Useful when the markup already exists and you just want somewhere for it to go.

The form page ​

Three tabs, in the URL as ?tab=.

Embed ​

The endpoint to copy, and the snippet in three flavours.

SnippetWhen to use it
HTMLWorks anywhere, no JavaScript. The browser navigates away on submit — set a thank-you page under Settings, or the visitor lands on the endpoint's JSON response.
ReactSubmits in the background and stays on the page, so a thank-you page does not apply. Your site's origin has to be allowed by the API's CORS setting.
cURLFor checking the form is live before you embed it. It deliberately leaves out the spam trap, so the submission is really stored.

Below the snippets, a preview of the fields your visitors will see, in the order the markup renders them.

The snippet carries a spam trap

The HTML and React snippets include a hidden _gotcha field. A bot that fills every input fills that one too, and the submission is discarded. Keep it in the markup, and keep it hidden — leaving it out is what the cURL snippet does on purpose, because you want that one stored.

Submissions ​

Every submission with when it arrived, paged. Open one to see the whole payload, including keys you never declared — the endpoint stores what it is sent.

Settings ​

  • General — the form's name, and the thank-you page: an absolute http(s) URL a browser is sent to after submitting the HTML snippet. Leave it empty to answer with JSON instead.
  • Fields — the same editor as create. Changing these updates the embed snippets; markup already on your site keeps working, because the endpoint stores whatever it is sent.
  • Delete this form — removes every submission with it.

What the endpoint accepts ​

The submission endpoint takes form encodings only — application/x-www-form-urlencoded or multipart/form-data, which is what a browser sends. When the caller accepts text/html, it answers with a redirect to your thank-you page; otherwise it answers JSON.

It is the one route in the public API with no API key. It is rate-limited, and it is scoped by the form id in the path, so a leaked endpoint can add submissions to that one form and nothing else.

Released under the Apache 2.0 License.