Headless Architecture

The Headless Form Backend for React Developers.

Stop building form infrastructure from scratch. Bring your own UI components and let our API handle validation, spam protection, CORS, and webhooks.

Read the Docs
npm install @forge/react

Robust Webhooks

HMAC-signed payloads, automatic retries with exponential backoff for up to 7 days, and a dedicated Dead Letter Queue for failed events you can replay manually.

Framework Agnostic

Works natively with Next.js Server Actions, React Hook Form, Vue, Svelte, or vanilla HTML forms. Zero vendor lock-in — you own the UI.

Secure Data Layer

End-to-end encryption at rest with AES-256. GDPR compliant infrastructure. Instant CSV/JSON/XLSX export from dashboard or API.

CORS Handled

Configure allowed origins per form. No more preflight debugging. Works from localhost, staging, and production domains simultaneously on paid plans.

Full TypeScript Types

The @forge/react SDK ships with complete TypeScript definitions for every API response, error type, and hook option. Zero any types.

Server Actions Native

Submit forms server-side with Next.js Server Actions. Your API keys never touch the client bundle. Full tutorial in our docs.

Production-ready in minutes

Real, working code. Copy and paste to get started.

React Hook Form Integration
import { useForgeForm } from "@forge/react";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";

const schema = z.object({
  email: z.string().email(),
  name: z.string().min(1),
});

export function ContactForm() {
  const { register, handleSubmit, formState } =
    useForgeForm({
      formId: process.env.NEXT_PUBLIC_FORM_ID!,
      resolver: zodResolver(schema),
    });

  return (
    <form onSubmit={handleSubmit}>
      <input {...register("email")} />
      <input {...register("name")} />
      <button disabled={formState.isSubmitting}>
        Submit
      </button>
    </form>
  );
}
Next.js Server Action (zero client-side API key)
// app/actions/submit.ts
"use server";

export async function submitForm(fd: FormData) {
  const res = await fetch(
    `https://api.useforge.cloud/f/${
      process.env.FORGE_FORM_ID
    }/submit`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${
          process.env.FORGE_API_KEY
        }`,
      },
      body: JSON.stringify({
        email: fd.get("email"),
        name: fd.get("name"),
      }),
    }
  );
  if (!res.ok) return { error: "Failed" };
  return { success: true };
}

Core API Endpoints

MethodEndpointDescription
POST/api/formsCreate a new form schema
GET/api/forms/{id}Read form schema and settings
POST/api/forms/{id}/submitSubmit form data (public endpoint)
GET/api/forms/{id}/submissionsRead all submissions (authenticated)
POST/api/forms/{id}/webhooksConfigure webhook endpoint

Plan Limits for Developers

PlanPriceAPI RateWebhook RetryDLQ EventsCORS
StartFree100 req/min3 attempts50Default
Standard$9/mo500 req/min7 attempts (3 days)500Custom
Plus$29/mo2,000 req/min7 attempts (3 days)2,000Custom
Max$79/mo10,000 req/min10 attempts (7 days)UnlimitedCustom + Wildcard

All plans include HMAC-signed webhooks and TypeScript SDK. View full pricing →

What engineers are saying

I replaced 800 lines of custom form infrastructure with 40 lines of Forge integration. The DLQ alone saved us during a 6-hour AWS outage — every submission was replayed automatically.

MW

Marcus Webb

Senior Platform Engineer · Meridian Health

The HMAC webhook verification is exactly right. Every payload is signed, our receiver validates the signature before processing, and suspicious requests get logged to the audit trail automatically.

PN

Priya Nataraj

Lead Backend Engineer · Sprout Analytics

We migrated from a hand-rolled form backend in a weekend. The TypeScript types are excellent. Zero runtime errors in production since the migration.

DV

Dmitri Volkov

CTO · Stacklane

Start building today

Free tier includes 4 forms, 100 submissions/month, full API access, and TypeScript SDK. No credit card required.