Docs

Everything you need to send HTML form submissions to a client inbox in minutes.

1) Create a form endpoint

After creating a form in your dashboard, you get a unique endpoint like:

https://getformali.com/f.php?form_key=<form_key>

2) Plain HTML (copy/paste)

<form action="https://getformali.com/f.php?form_key=a1b2c3d4e5f6a7b8" method="POST">

  <input name="email" type="email" required />
  <textarea name="message" required></textarea>

  <button type="submit">Send</button>

</form>

Replace <form_key> with your real key from the dashboard.

3) Email notifications

Every valid submission is sent as an email notification to the configured client mailbox. If no client email is set, Get Formali uses the account email.

Flow: HTML form → Get Formali → client inbox.

4) Optional storage

In each form configuration, choose whether Get Formali keeps a dashboard copy of submissions.

5) Redirect after submit

Add an optional _redirect field:

<input type="hidden" name="_redirect" value="https://your-site.com/thanks" />

Get Formali will redirect with a 303 when the URL is safe.

6) JavaScript / fetch

If you prefer AJAX, POST as application/x-www-form-urlencoded or multipart/form-data:

const form = new FormData();
form.append('email', 'name@domain.com');
form.append('message', 'Hello');

const res = await fetch('https://getformali.com/f.php?form_key=a1b2c3d4e5f6a7b8', {
  method: 'POST',
  body: form,
  headers: { 'Accept': 'application/json' },
});

console.log(await res.json());

Limits & behavior

Security

Recommended for production forms:

Webhooks

Get Formali can POST each submission to your server (signed HMAC).

Delivery is best-effort (no retries). Use your endpoint to return 2xx quickly.

Request format

JSON body:

{
  "form_id": 123,
  "timestamp": 1717171717,
  "data": {
    "email": "name@domain.com",
    "message": "Hello"
  }
}

X-Formali-Signature verification

Headers: X-Formali-Timestamp and X-Formali-Signature where signature is sha256=HMAC(secret, timestamp + '.' + body).

// Node.js example
import crypto from 'crypto';

const timestamp = req.headers['x-formali-timestamp'];
const signature = req.headers['x-formali-signature'];
const body = rawBody; // raw request body string

const expected = 'sha256=' + crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(String(timestamp) + '.' + body)
  .digest('hex');

if (signature !== expected) throw new Error('Invalid signature');