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.
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"
}
}
Run 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
Endpoint
What it does
GET /submissions
?form_id&limit&cursor returns {data[], has_more, next_cursor}. Pro
GET /submissions/:id
Includes deliveries[]. Pro
POST /submissions
{form_id, fields{}, subject?, from_name?, replyto?, cc?, metadata?} returns 201. Pro