Everything you need to integrate FormCatch with your website.
Get form submissions in 3 simple steps. No backend code needed.
Sign up with GitHub. No credit card required. Takes 10 seconds.
In your dashboard, click "New Form" to create an endpoint. You'll get a unique URL like https://formcatch.vercel.app/api/f/abc123.
Set your HTML form's action attribute to your FormCatch endpoint URL. Submit, and see data appear in your dashboard instantly.
The simplest integration. Works with any static site -- no JavaScript required. Just set the action and method attributes.
<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>YOUR_FORM_ID with the form ID from your dashboard. You can find it on the form settings page.A complete React component with loading state, success/error feedback, and form reset. Works in Next.js, Gatsby, Vite, and any React project.
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>
);
}Submit forms without page reload using the Fetch API. Send JSON with the Content-Type: application/json header.
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));application/json -- JSON bodyapplication/x-www-form-urlencoded -- Standard HTML form encodingmultipart/form-data -- File uploads (Pro plan and above)Forward form submissions to your own backend in real time. Available on Pro and Business plans.
https://api.yoursite.com/webhooks/formcatch).submission.created, submission.spam.// 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!"
}
}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.
FormCatch provides multiple layers of spam protection, all enabled by default on every plan.
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" />Every submission is automatically checked against common spam patterns, including link stuffing, known bot user agents, and high-frequency IP detection. No configuration needed.
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.
For extra protection, enable Google reCAPTCHA v2 on your form. FormCatch verifies the token server-side so your secret key stays safe.
<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>// 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
})
});Get notified instantly when someone submits a form. Email notifications are included on all plans.
{formName} as a placeholder.Automatically send a confirmation email to the person who submitted the form. Requires an email field in the submission.
{name} and {email} to personalize the message./api/f/:formIdSubmit data to a form endpoint. Accepts JSON, form-urlencoded, and multipart/form-data.
| Header | Value | Required |
|---|---|---|
| Content-Type | application/json, multipart/form-data, or application/x-www-form-urlencoded | Yes |
| Field | Type | Description |
|---|---|---|
| * | any | Any key-value pairs. All fields are stored as submission data. |
| _honey | string | Honeypot field. If filled, submission is rejected silently. |
| _redirect | string (URL) | URL to redirect to after successful submission (HTML form only). |
| _recaptcha | string | reCAPTCHA response token for verification. |
// 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"
}/api/forms/:formId/submissionsRetrieve submissions for a form. Requires authentication. Business plan only.
| Param | Type | Description |
|---|---|---|
| page | number | Page number (default: 1) |
| limit | number | Results per page (default: 50, max: 100) |
| since | string (ISO 8601) | Filter submissions after this date |
/api/forms/:formId/submissions/:submissionIdDelete a specific submission. Requires authentication. Available on all plans.
| Status | Code | Description |
|---|---|---|
| 200 | OK | Submission received successfully. |
| 400 | Bad Request | Invalid data, spam detected, or reCAPTCHA verification failed. |
| 401 | Unauthorized | Missing or invalid authentication (API endpoints only). |
| 403 | Forbidden | Monthly submission limit reached or form is disabled. |
| 404 | Not Found | Form endpoint does not exist or has been deleted. |
| 429 | Too Many Requests | Rate limit exceeded. Wait and retry. |
| 500 | Server Error | Something went wrong on our end. Please retry or contact support. |
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!
<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>Create your free account and start collecting submissions in 30 seconds.
Start Free -- No Credit Card Required