Features

The complete forms stack.

Every piece of infrastructure you need to handle form submissions — without managing a single server.

01 — Core

A POST endpoint.
That is the setup.

Add a URL to your form action. FormKove handles validation, storage, and notifications. Works with plain HTML, React, Vue, Svelte, Next.js — anything that can send an HTTP request.

No SDK to install. No framework to learn. No configuration file.

Works with plain HTML

<form action="https://formkove.com/f/abc123"
      method="POST">
  <input name="email" type="email" required>
  <textarea name="message"></textarea>
  <button type="submit">Send</button>
</form>

02 — Protection

Spam that does not
humiliate users.

Honeypot fields catch bots invisibly. Cloudflare Turnstile integration (bring your own keys on Free) adds invisible challenge scoring. KV-backed rate limits stop floods at the edge.

Honeypot fields

Hidden fields that bots fill. Zero user friction.

Turnstile

Invisible challenge. Bring your own keys on Free.

KV rate limiting

Per-form, per-IP. Configurable window and max.

Per-form rate limit config

{
  "windowMs": 900000,  // 15 minutes
  "maxRequests": 10,  // per IP
  "enabled": true
}

03 — Notifications

Know when
submissions arrive.

Email notifications fire on every submission. Pro adds Slack, webhook triggers, and integration with Zapier and Make. Configure notification rules per form.

New submission

contact-form — just now

From: amara@startup.io

Subject: New submission via contact-form

Name: Amara Osei

Message: Interested in the Pro plan for our agency...

04 — Automation

Webhooks with
HMAC signing.

Trigger automations on every submission. HMAC-SHA256 signatures let you verify payloads came from FormKove. SSRF protection prevents abuse. Exponential backoff handles retries.

HMAC-SHA256 signed payloads
SSRF protection on outbound delivery
Exponential backoff (up to 5 retries)

Verify the signature (Node.js)

import crypto from 'crypto';

const sig = crypto
  .createHmac('sha256', secret)
  .update(rawBody)
  .digest('hex');

return crypto.
  timingSafeEqual(
    Buffer.from(sig),
    Buffer.from(expected),
  );

05 — Dashboard

See everything
in one place.

Every submission lands in a searchable table. Filter by form, date, or status. View trends over time. Export any form's history as CSV — no limits.

Dashboard Last 30 days
Apr 1Apr 8Apr 15Apr 22Apr 29

2.4k

submissions

18

forms

0

spam

Ready to ship smarter forms?

Start free. Upgrade when you need more.

Start building free