THE QUICK START

From your website
to your inbox.

Keep your frontend. Add a little Contact. Here’s everything you need to get connected.

01. Create your first form

Create a workspace, then choose New form in your dashboard. Name your form and enter the exact origins allowed to submit, such as https://example.com or http://localhost:3000. Origins include the scheme and port, without a path.

The starter schema accepts a name, email, and message. Customize the JSON Schema when creating or editing a form. Add an email destination or HTTPS webhook if you want automatic delivery.

02. Connect your frontend

Copy the endpoint from your form’s integration panel. Submit JSON from an allowed website origin; a native HTML form POST is not supported.

const response = await fetch(
  "https://contact.kirandhakal.me/v1/forms/YOUR_PUBLIC_KEY/submissions",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Idempotency-Key": crypto.randomUUID()
    },
    body: JSON.stringify({
      name: "Alex Morgan",
      email: "alex@example.com",
      message: "Let’s build something together.",
      _website: ""
    })
  }
);
const result = await response.json();
if (!response.ok) throw new Error(result.detail);
console.log(result.message);

Create one idempotency key per submission and reuse it if retrying that same submission. Never put an admin API key in browser code. The public form key is designed to be public.

03. Follow the message

Your website→Validation & spam checks→Inbox & delivery queue

A new submission returns 202 with a message and a private response token. A duplicate returns 200. Keep response tokens private. Invalid fields return 422, blocked origins return 403, and rate or usage limits return 429.

A few thoughtful safeguards

Add a hidden _website honeypot field and leave it empty. Filled honeypots are marked as spam and are not delivered. If your service administrator enables Turnstile, send a valid token in the Turnstile-Token header.

Email and webhook delivery happens in the backend worker, with retries. Submissions expire according to the service’s configured retention period. Analytics describe retained, non-deleted submissions; active tenants are workspaces with at least one active form.

Your workspace, organized

Filter forms by status, search submissions, and view trends in Analytics. Tenant accounts only access their own workspace. Super and sudo administrators can create tenants, adjust limits, and reset tenant passwords. Sudo administrators can additionally edit submissions.

Change your own password in Settings using your current password. Password changes revoke all sessions, so you’ll sign in again.

Open your dashboard ↗