FormThunder isn't open yet. This site describes the service as it will run at launch. Find out more

FormThunder
Menu

AI and tools, updated

REST API reference

The FormThunder REST API lives at https://formthunder.com/api/v1 and authenticates with a bearer key starting with ft_live_. It covers everything you can do in the dashboard. Errors always have the same shape, with a hint that says what to do next. The MCP server and CLI are built on this API, and /openapi.json describes it for tools.

Authentication

bash
curl https://formthunder.com/api/v1/me -H "Authorization: Bearer ft_live_..."

Create keys in the dashboard or with npx formthunder keys create. A key is shown once. It's a secret, unlike a form's access key, which is public.

Agency keys can act on a client by adding a header.

text
X-FormThunder-Account: <client account id>

Errors

json
{
  "error": {
    "code": "feature_requires_pro",
    "message": "Webhooks need the Pro plan.",
    "hint": "Upgrade at https://formthunder.com/app/billing or run `formthunder billing upgrade`.",
    "docs": "https://formthunder.com/docs/webhooks"
  }
}

Account

EndpointWhat it does
GET /meAccount, plan, limits, usage, role and kind
GET /usageSubmissions used this month
GET /auditWhat changed, and which person or key changed it

Forms

EndpointWhat it does
GET /formsList forms. ?include_deleted=false
POST /formsCreate: {name, recipients[], subject?, from_name?, redirect_url?, ...}
GET /forms/:idGet a form
PATCH /forms/:idChange any form setting
DELETE /forms/:idDelete a form
GET /forms/:id/snippet?framework=html|react|nextjs|vue|svelte|astro returns {framework, code, notes}
POST /forms/:id/testRun a real test. Returns {submission_id, deliveries[]}
POST /forms/:id/check{url}: fetch the live page and return {ok, checks:[{id, ok, message, fix}]}

Form settings include subject, from_name, reply_to, redirect_url, cc, intro_text, theme, template_id, allowed_domains, spam, autoresponder, integrations, attachments_enabled, status, name and recipients.

Submissions

EndpointWhat it does
GET /submissions?form_id&limit&cursor returns {data[], has_more, next_cursor}. Pro
GET /submissions/:idIncludes deliveries[]. Pro
POST /submissions{form_id, fields{}, subject?, from_name?, replyto?, cc?, metadata?} returns 201. Pro
POST /submissions/:id/resendRe-queue failed deliveries

Brand and themes

EndpointWhat it does
GET /brandThe account's brand kit
PUT /brand{name, logo_url, colors{...}, font_family, heading_font_family, border_radius, footer_text, website_url}
POST /brand/extract{url, apply?} returns {brand, confidence, notes[], applied}
GET /themesBuilt-in themes

Templates

EndpointWhat it does
GET /templatesList templates
POST /templates{name, kind, subject, html, text?}. kind is notification or autoresponder. Custom HTML needs Pro
GET /templates/:idGet a template
PATCH /templates/:idChange a template
DELETE /templates/:idDelete a template
POST /templates/preview{html?, template_id?, theme?, subject?, kind?, sample?} returns {subject, html, text, warnings[]}
POST /templates/test{to, html?, template_id?, theme?, subject?, kind?} returns {sent:true}
POST /templates/generate{url?, instructions?, kind?, save?, name?}. The generator field says claude or theme
GET /variablesEvery template variable

Linked emails

EndpointWhat it does
GET /emailsLinked emails and whether each is verified
POST /emails{email} sends a verification link
DELETE /emails/:emailRemove a linked email

Clients (Agency)

EndpointWhat it does
GET /clientsList client accounts
POST /clients{name, contact_email?, invite?}
GET /clients/:idGet a client
PATCH /clients/:id{name, contact_email}
DELETE /clients/:idDelete a client and its forms
POST /clients/:id/upgradeUpgrade to Pro. Adds a $5/mo line to your subscription
POST /clients/:id/downgradeMove back to Free
POST /clients/:id/invite{email, role?}
GET /clients/:id/billingRetainer state
POST /clients/:id/billing{amount_cents, currency, interval, description, auto_upgrade?} returns {checkout_url, ...}
DELETE /clients/:id/billingCancel the retainer

API keys

EndpointWhat it does
GET /api-keysList keys. Secrets aren't shown
POST /api-keys{name, scopes?}. The key is shown once
DELETE /api-keys/:idRevoke a key

Other endpoints

EndpointWhat it does
POST /submitPublic form ingest
POST /api/uploads/signSigned upload URL
POST /api/mcpHosted MCP server
POST /api/quick-key{email, name?} creates an account and first form, then emails the key
POST /api/cli/deviceStart a CLI device login
POST /api/cli/token{device_code} returns {status}, plus the key once approved
GET /api/healthHealth check
GET /openapi.jsonOpenAPI description