Documentation

Everything you need to integrate FormCatch with your website.

Quick Start

Get form submissions in 3 simple steps. No backend code needed.

1

Create an account

Sign up with GitHub. No credit card required. Takes 10 seconds.

2

Create a form endpoint

In your dashboard, click "New Form" to create an endpoint. You'll get a unique URL like https://formcatch.vercel.app/api/f/abc123.

3

Point your form

Set your HTML form's action attribute to your FormCatch endpoint URL. Submit, and see data appear in your dashboard instantly.

HTML Form

The simplest integration. Works with any static site -- no JavaScript required. Just set the action and method attributes.

HTML
<form action="https://formcatch.vercel.app/api/f/YOUR_FORM_ID" method="POST">
  <input type="text" name="name" required />
  <input type="email" name="email" required />
  <textarea name="message"></textarea>

  <!-- Honeypot field for spam protection -->
  <input type="text" name="_honey" style="display:none" />

  <!-- Optional: redirect after submission -->
  <input type="hidden" name="_redirect" value="https://yoursite.com/thanks" />

  <button type="submit">Send</button>
</form>
Tip: Replace YOUR_FORM_ID with the form ID from your dashboard. You can find it on the form settings page.

React / Next.js

A complete React component with loading state, success/error feedback, and form reset. Works in Next.js, Gatsby, Vite, and any React project.

React / TypeScript
import { useState } from "react";

export default function ContactForm() {
  const [status, setStatus] = useState("");

  async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    setStatus("sending");

    const form = e.currentTarget;
    const data = new FormData(form);

    const res = await fetch("https://formcatch.vercel.app/api/f/YOUR_FORM_ID", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(Object.fromEntries(data)),
    });

    if (res.ok) {
      setStatus("success");
      form.reset();
    } else {
      setStatus("error");
    }
  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="name" placeholder="Name" required />
      <input type="email" name="email" placeholder="Email" required />
      <textarea name="message" placeholder="Message" />
      <button type="submit" disabled={status === "sending"}>
        {status === "sending" ? "Sending..." : "Send"}
      </button>
      {status === "success" && <p>Message sent!</p>}
      {status === "error" && <p>Something went wrong. Try again.</p>}
    </form>
  );
}

AJAX / Fetch

Submit forms without page reload using the Fetch API. Send JSON with the Content-Type: application/json header.

JavaScript
fetch("https://formcatch.vercel.app/api/f/YOUR_FORM_ID", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "Jane Doe",
    email: "jane@example.com",
    message: "Hello from JavaScript!"
  })
})
.then(res => res.json())
.then(data => console.log("Success:", data))
.catch(err => console.error("Error:", err));
Supported Content Types:
  • application/json -- JSON body
  • application/x-www-form-urlencoded -- Standard HTML form encoding
  • multipart/form-data -- File uploads (Pro plan and above)

Webhooks

Forward form submissions to your own backend in real time. Available on Pro and Business plans.

Setup

  1. Go to your form settings in the dashboard.
  2. Under the Webhooks section, enter your endpoint URL (e.g. https://api.yoursite.com/webhooks/formcatch).
  3. Choose which events to send: submission.created, submission.spam.
  4. Save. FormCatch will send a test ping to verify your endpoint.

Payload Example

JSON
// Webhook payload (POST to your URL)
{
  "event": "submission.created",
  "form_id": "abc123",
  "form_name": "Contact Form",
  "submitted_at": "2026-03-17T10:30:00Z",
  "data": {
    "name": "Jane Doe",
    "email": "jane@example.com",
    "message": "Hello!"
  }
}

Retry Policy

If your endpoint returns a non-2xx status, FormCatch will retry up to 3 times with exponential backoff (1 min, 5 min, 30 min). Failed deliveries are logged in your dashboard.

Spam Filtering

FormCatch provides multiple layers of spam protection, all enabled by default on every plan.

Honeypot Field

Add a hidden field named _honey to your form. Bots will fill it in, and FormCatch will reject those submissions silently with a fake 200 response (so bots think it succeeded).

<input type="text" name="_honey" style="display:none" />

Built-in Spam Detection

Every submission is automatically checked against common spam patterns, including link stuffing, known bot user agents, and high-frequency IP detection. No configuration needed.

Rate Limiting

Each form endpoint is rate-limited to prevent abuse. Free plan: 10 submissions/minute. Pro: 30/min. Business: 100/min. Excess requests receive a 429 response.

reCAPTCHA Integration

For extra protection, enable Google reCAPTCHA v2 on your form. FormCatch verifies the token server-side so your secret key stays safe.

Setup Steps

  1. Get your reCAPTCHA v2 keys from Google reCAPTCHA Admin.
  2. In your FormCatch dashboard, go to form settings and paste your Secret Key.
  3. Add the reCAPTCHA widget to your form (see examples below).

HTML Example

HTML
<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<form action="https://formcatch.vercel.app/api/f/YOUR_FORM_ID" method="POST">
  <input type="text" name="name" required />
  <input type="email" name="email" required />
  <textarea name="message"></textarea>

  <div class="g-recaptcha" data-sitekey="YOUR_RECAPTCHA_SITE_KEY"></div>

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

AJAX Example

JavaScript
// For AJAX submissions, get the token and include it
const token = grecaptcha.getResponse();

fetch("https://formcatch.vercel.app/api/f/YOUR_FORM_ID", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "Jane Doe",
    email: "jane@example.com",
    _recaptcha: token
  })
});

Email Notifications

Get notified instantly when someone submits a form. Email notifications are included on all plans.

Configuration

  • Notification emails: Set up to 5 email addresses per form (Pro/Business). Free plan: 1 email.
  • Subject template: Customize the email subject. Use {formName} as a placeholder.
  • Toggle per form: Enable or disable notifications for each form independently.

Auto-Reply (Pro+)

Automatically send a confirmation email to the person who submitted the form. Requires an email field in the submission.

  • Customize the reply subject and body in form settings.
  • Use placeholders like {name} and {email} to personalize the message.
  • Set a custom "From" name (Business plan).

API Reference

POST/api/f/:formId

Submit data to a form endpoint. Accepts JSON, form-urlencoded, and multipart/form-data.

Headers

HeaderValueRequired
Content-Typeapplication/json, multipart/form-data, or application/x-www-form-urlencodedYes

Body Parameters

FieldTypeDescription
*anyAny key-value pairs. All fields are stored as submission data.
_honeystringHoneypot field. If filled, submission is rejected silently.
_redirectstring (URL)URL to redirect to after successful submission (HTML form only).
_recaptchastringreCAPTCHA response token for verification.

Response

JSON
// 200 OK
{
  "success": true,
  "message": "Submission received"
}

// 400 Bad Request (spam)
{
  "success": false,
  "error": "Spam detected"
}

// 404 Not Found
{
  "success": false,
  "error": "Form not found"
}

// 429 Too Many Requests
{
  "success": false,
  "error": "Rate limit exceeded"
}
GET/api/forms/:formId/submissions

Retrieve submissions for a form. Requires authentication. Business plan only.

Query Parameters

ParamTypeDescription
pagenumberPage number (default: 1)
limitnumberResults per page (default: 50, max: 100)
sincestring (ISO 8601)Filter submissions after this date
DELETE/api/forms/:formId/submissions/:submissionId

Delete a specific submission. Requires authentication. Available on all plans.

Error Codes

StatusCodeDescription
200OKSubmission received successfully.
400Bad RequestInvalid data, spam detected, or reCAPTCHA verification failed.
401UnauthorizedMissing or invalid authentication (API endpoints only).
403ForbiddenMonthly submission limit reached or form is disabled.
404Not FoundForm endpoint does not exist or has been deleted.
429Too Many RequestsRate limit exceeded. Wait and retry.
500Server ErrorSomething went wrong on our end. Please retry or contact support.

Add a FormCatch Badge

Show your visitors that your forms are powered by FormCatch. Copy the HTML below and paste it into your website footer or form page. It's a great way to support us!

Preview

Powered by FormCatch
HTML
<a href="https://formcatch.vercel.app" target="_blank" rel="noopener"
   style="display:inline-flex;align-items:center;gap:6px;background:#1f2937;border:1px solid #374151;color:#d1d5db;font-size:12px;padding:4px 12px;border-radius:9999px;text-decoration:none;font-family:system-ui,sans-serif;">
  <svg width="14" height="14" viewBox="0 0 20 20" fill="#60a5fa">
    <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
  </svg>
  Powered by <strong style="color:#fff;">FormCatch</strong>
</a>
Tip: Adding a FormCatch badge helps other developers discover FormCatch and supports our free tier. Thank you!

FAQ

Do I need a backend to use FormCatch?
No. FormCatch is the backend. Just point your HTML form to your endpoint URL and submissions are collected automatically. No server code needed.
Can I use FormCatch with static site generators like Hugo or Jekyll?
Yes. FormCatch works with any HTML form, regardless of how it is generated. Just set the form action to your endpoint URL.
What happens when I hit my monthly submission limit?
New submissions will return a 403 error with a clear message. Your existing data is safe. You can upgrade your plan anytime to increase the limit.
Is file upload supported?
Yes, on Pro and Business plans. Use multipart/form-data encoding and add a file input to your form. Max file size: 10MB per file, 25MB total per submission.
Can I export my submissions?
Yes. All plans support CSV export from the dashboard. Business plan users can also fetch data via the REST API.
Is my data secure?
All data is transmitted over HTTPS. Submissions are stored encrypted at rest. You can delete any submission at any time from your dashboard.

Ready to get started?

Create your free account and start collecting submissions in 30 seconds.

Start Free -- No Credit Card Required