Skip to main content
A form is an embeddable form bound to one of your verified domains. Forms are the only resource with full create/update/archive support in v1.

The form object

{
  "id": 123,
  "name": "Contact form",
  "type": "standard",
  "domain": { "id": 5, "domain": "example.com" },
  "submissionCount": 42,
  "fields": [ { "id": "f1", "type": "text", "label": "Name" } ],
  "createdAt": "2026-05-01T12:00:00.000Z",
  "updatedAt": "2026-05-20T09:30:00.000Z"
}
fields is returned on the single-form view only; list responses omit it for payload size and include submissionCount instead. domain is null for legacy unbound forms. type is standard or multi-step.

List forms

GET /v1/forms — scope read:forms. Supports page, limit, and domainId (narrow to one registered domain).
curl "https://formitto.com/v1/forms?domainId=5" \
  -H "Authorization: Bearer fmt_live_xxxxxxxx"
const result = await formitto.forms.listForms({ domainId: 5 });

Get a form

GET /v1/forms/{id} — scope read:forms. Returns the full object including fields.
curl https://formitto.com/v1/forms/123 \
  -H "Authorization: Bearer fmt_live_xxxxxxxx"
const form = await formitto.forms.getForm({ id: 123 });

Create a form

POST /v1/forms — scope write:forms. Requires name and a non-empty fields array. domainId is optional: if your account has exactly one verified domain it’s auto-selected; with multiple domains, omitting it returns 400 domain_required with the candidate list.
curl -X POST https://formitto.com/v1/forms \
  -H "Authorization: Bearer fmt_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Lead form",
    "fields": [{ "id": "f1", "type": "email", "label": "Email" }],
    "domainId": 5
  }'
const form = await formitto.forms.createForm({
  name: "Lead form",
  fields: [{ id: "f1", type: "email", label: "Email" }],
  domainId: 5,
});

Update a form

PATCH /v1/forms/{id} — scope write:forms. Only name, fields, webhookUrl, and archived are mutable. Sending userId, orgId, domainId, createdAt, or id returns 400 forbidden_field.
curl -X PATCH https://formitto.com/v1/forms/123 \
  -H "Authorization: Bearer fmt_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Renamed form" }'
const form = await formitto.forms.updateForm({
  id: 123,
  requestBody: { name: "Renamed form" },
});

Archive a form

DELETE /v1/forms/{id} — scope write:forms. Soft-deletes (archives) the form; returns 204 No Content. Archived forms stop serving but their submissions are preserved.
curl -X DELETE https://formitto.com/v1/forms/123 \
  -H "Authorization: Bearer fmt_live_xxxxxxxx"
await formitto.forms.archiveForm({ id: 123 });
See Submissions for reading and ingesting a form’s entries.