Create a form template
Creates a template from a name and its ordered list of blocks. Building templates via the API/MCP is the expected primary path.
Creates a template from a name and its ordered list of blocks. Building templates via the API/MCP is the expected primary path.
The per-tenant API key, copied from Settings → API & integrations.
Sent as the x-api-key request header. The key is tenant-scoped and acts
with Admin-equivalent, tenant-wide access.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/form-templates" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "blocks": [ { "id": "string", "kind": "heading", "label": "string" } ] }'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "projectRequired": true, "fillableBy": "all_crew", "status": "active", "blocks": [ { "id": "string", "kind": "heading", "label": "string", "required": true, "options": [ "string" ], "items": [ "string" ], "lockToToday": true } ], "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z"}{ "error": { "code": "unauthorized", "message": "Missing or invalid API key." }}{ "error": { "code": "read_only", "message": "Your subscription is inactive. This action is read-only." }}{ "error": { "code": "validation", "message": "One or more inputs are invalid.", "fields": { "fieldName": "A message explaining what's wrong with this field." } }}List form submissions GET
Lists submissions, most-recent-first, paginated, with filters. An API key is **Admin-equivalent and tenant-wide**, so this returns every submission in the tenant, including personal / "Other" forms that carry no `projectId`. The narrower per-role visibility introduced by SUP-449 applies to signed-in users of the web app; there is no crew-scoped API credential.
Delete a form template DELETE
Hard-deletes the template — allowed only when it has zero submissions. With submissions present the API returns `409`; archive it instead so audit records are never orphaned.