For Developers
Build complex, logic-driven forms without code
Ship embeddable forms in hours, not weeks. FormFlow's REST API, real-time webhooks, and lightweight SDKs give you full programmatic control over form creation, submission, and validation — while our visual builder handles the heavy lifting.
A developer-first API that scales with you
Every feature in the FormFlow visual builder is exposed through our versioned REST API. Create forms, manage fields, configure conditional logic, and retrieve submissions — all via predictable JSON endpoints.
Create & Manage Forms
Define forms programmatically with nested sections, field types, validation rules, and branching logic. Updates are immediately reflected in the visual builder.
POST /v1/forms
{
"name": "Enterprise Onboarding",
"sections": [
{
"title": "Company Details",
"fields": [
{
"type": "text",
"key": "company_name",
"required": true,
"validation": {
"pattern": "^[A-Za-z0-9\\s&.-]+$"
}
},
{
"type": "select",
"key": "tier",
"options": ["starter", "growth", "enterprise"]
}
]
}
]
}
Real-Time Webhooks
Get instant notifications on every form lifecycle event. Webhooks include signatures for verification, automatic retries with exponential backoff, and idempotency keys to prevent duplicate processing.
POST https://your-app.com/formflow/webhook
Headers:
X-FormFlow-Signature: sha256=a1b2c3...
X-FormFlow-Event: form.submitted
X-FormFlow-Idempotency-Key: 7f8e9d...
{
"event": "form.submitted",
"form_id": "frm_9k3m2x",
"submission_id": "sub_4a7b1c",
"submitted_at": "2025-06-18T14:32:09Z",
"data": {
"company_name": "Meridian Labs",
"tier": "enterprise",
"employee_count": 240
}
}
Embed Forms Anywhere
Drop a form into any frontend with a single script tag or SDK call. Forms inherit your domain's styling, support custom CSS overrides, and fire lifecycle events you can hook into from JavaScript.
<script src="https://cdn.formflow.app/sdk/v2/embed.js"></script>
<div id="formflow-container"></div>
<script>
FormFlow.embed({
formId: 'frm_9k3m2x',
container: '#formflow-container',
theme: 'dark',
onSuccess: (submission) => {
console.log('Submitted:', submission.id);
analytics.track('form_completed', {
form: submission.form_id,
tier: submission.data.tier
});
}
});
</script>
SDKs for your stack
Official, actively maintained SDKs for the most popular languages and frameworks. All SDKs are open-source, typed, and published to public package registries.
JavaScript / TypeScript
Full type definitions, ESM and CommonJS support, and a React component library. Handles authentication, form rendering, and submission in a single package.
npm install @formflow/sdk
import { FormFlow } from '@formflow/sdk';
const ff = new FormFlow({ apiKey: process.env.FF_API_KEY });
const form = await ff.forms.create({
name: 'Q3 Feedback Survey',
fields: [
{ type: 'rating', key: 'satisfaction', min: 1, max: 5 }
]
});
Python
Async-first client built on aiohttp with support for streaming large submission exports. Integrates cleanly with Django, FastAPI, and Celery workflows.
pip install formflow
from formflow import Client
client = Client(api_key="ff_live_8x3k9m...")
submissions = client.forms.submissions.list(
form_id="frm_9k3m2x",
status="completed",
after="2025-01-01"
)
for sub in submissions:
print(sub.data["company_name"])
Node.js
Native Node.js client with a webhook handler that automatically verifies signatures, deserializes payloads, and manages retry logic. Drop it into Express, Fastify, or Next.js.
npm install @formflow/node
const { Webhook } = require('@formflow/node');
const webhook = new Webhook({
signingSecret: process.env.FF_WEBHOOK_SECRET
});
app.post('/webhook', webhook.handler((event) => {
if (event.type === 'form.submitted') {
const { data } = event.payload;
createCustomerInCRM(data);
}
}));
React Components
Pre-built, accessible React components that render FormFlow forms with full control over styling, field overrides, and submission handling. Supports React 18+ and Next.js App Router.
npm install @formflow/react
import { FormFlowForm } from '@formflow/react';
function OnboardingPage() {
return (
<FormFlowForm
formId="frm_9k3m2x"
onSuccess={(data) => router.push('/dashboard')}
onError={(err) => toast.error(err.message)}
fieldOverrides={{
company_name: { placeholder: 'e.g., Acme Corp' }
}}
/>
);
}
Start building today
Get a free API key with 10,000 submissions per month. No credit card required. Rate-limited at 1,000 requests per minute on the free tier — upgrade to Production for unlimited throughput and dedicated support.