REST API
API reference
Every endpoint, with a request you can copy and a sample response. Paths are relative to https://api.enform.co/api/v1, and every request needs your API key.
curl "https://api.enform.co/api/v1/me" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/me", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/me",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "account",
"data": {
"workspace": {
"id": "Hq7cT2vLm9xR4bWn",
"name": "Acme"
}
}
}List forms
GET/forms
Lists the workspace's forms, newest first. Forms without a title are left out.
Query
limitinteger- 1 to 100. Defaults to 25.
cursorstring- The
nextCursorfrom the previous page.
curl "https://api.enform.co/api/v1/forms?limit=25" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/forms?limit=25", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/forms?limit=25",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "list",
"data": [
{
"id": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"title": "Customer feedback",
"published": true,
"createdAt": "2026-10-28T14:02:11.000Z",
"updatedAt": "2026-11-02T08:40:53.000Z"
}
],
"hasMore": true,
"nextCursor": "eyJ0IjoiMjAyNi0xMC0yOFQxNDowMjoxMS4wMDBaIiwiaWQiOiJjM2ExIn0"
}Get a form
GET/forms/{formId}
Returns one form and its questions in order. Use each question's key to read answers.
Path
formIdstringrequired- The form's ID.
curl "https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "form",
"data": {
"id": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"title": "Customer feedback",
"published": true,
"createdAt": "2026-10-28T14:02:11.000Z",
"updatedAt": "2026-11-02T08:40:53.000Z",
"fields": [
{
"id": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"key": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"label": "Your name",
"type": "short_text"
},
{
"id": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"key": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"label": "How likely are you to recommend us?",
"type": "opinion_scale"
},
{
"id": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"key": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"label": "What should we build next?",
"type": "checkbox"
},
{
"id": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"key": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"label": "email",
"type": "hidden"
}
]
}
}List responses
GET/forms/{formId}/submissions
Lists a form's completed responses, newest first by the time they were submitted.
Path
formIdstringrequired- The form's ID.
Query
limitinteger- 1 to 100. Defaults to 25.
cursorstring- The
nextCursorfrom the previous page. sinceISO 8601- Only responses completed after this time.
curl "https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10/submissions?since=2026-11-01T00:00:00Z" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10/submissions?since=2026-11-01T00:00:00Z", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/forms/c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10/submissions?since=2026-11-01T00:00:00Z",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "list",
"data": [
{
"id": "5b0e4c1a-7d2f-4f0e-9a51-2f6c8d0b9e13",
"formId": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"createdAt": "2026-11-03T09:14:02.511Z",
"completedAt": "2026-11-03T09:16:40.020Z",
"answers": {
"bba1826f-56fc-4e44-a0fa-bac06310da49": "Ada Lovelace",
"4dfa4a9e-85e3-4187-b38e-ae1d4675f99b": "9",
"a2d90fd0-3942-45c8-ade3-773ed5f9733e": "Weekly reports, Slack alerts",
"e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01": "ada@example.com"
},
"hidden": {
"email": "ada@example.com"
},
"fields": [
{
"id": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"key": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"label": "Your name",
"type": "short_text",
"value": "Ada Lovelace",
"text": "Ada Lovelace"
},
{
"id": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"key": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"label": "How likely are you to recommend us?",
"type": "opinion_scale",
"value": 9,
"text": "9"
},
{
"id": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"key": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"label": "What should we build next?",
"type": "checkbox",
"value": [
"Weekly reports",
"Slack alerts"
],
"text": "Weekly reports, Slack alerts"
},
{
"id": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"key": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"label": "email",
"type": "hidden",
"value": "ada@example.com",
"text": "ada@example.com"
}
]
}
],
"hasMore": false,
"nextCursor": null
}Get a response
GET/submissions/{submissionId}
Returns one completed response. See how answers read.
Path
submissionIdstringrequired- The response's ID.
curl "https://api.enform.co/api/v1/submissions/5b0e4c1a-7d2f-4f0e-9a51-2f6c8d0b9e13" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/submissions/5b0e4c1a-7d2f-4f0e-9a51-2f6c8d0b9e13", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/submissions/5b0e4c1a-7d2f-4f0e-9a51-2f6c8d0b9e13",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "submission",
"data": {
"id": "5b0e4c1a-7d2f-4f0e-9a51-2f6c8d0b9e13",
"formId": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"createdAt": "2026-11-03T09:14:02.511Z",
"completedAt": "2026-11-03T09:16:40.020Z",
"answers": {
"bba1826f-56fc-4e44-a0fa-bac06310da49": "Ada Lovelace",
"4dfa4a9e-85e3-4187-b38e-ae1d4675f99b": "9",
"a2d90fd0-3942-45c8-ade3-773ed5f9733e": "Weekly reports, Slack alerts",
"e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01": "ada@example.com"
},
"hidden": {
"email": "ada@example.com"
},
"fields": [
{
"id": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"key": "bba1826f-56fc-4e44-a0fa-bac06310da49",
"label": "Your name",
"type": "short_text",
"value": "Ada Lovelace",
"text": "Ada Lovelace"
},
{
"id": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"key": "4dfa4a9e-85e3-4187-b38e-ae1d4675f99b",
"label": "How likely are you to recommend us?",
"type": "opinion_scale",
"value": 9,
"text": "9"
},
{
"id": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"key": "a2d90fd0-3942-45c8-ade3-773ed5f9733e",
"label": "What should we build next?",
"type": "checkbox",
"value": [
"Weekly reports",
"Slack alerts"
],
"text": "Weekly reports, Slack alerts"
},
{
"id": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"key": "e7c2a9d4-0b3f-4c1e-9a8d-5f6b7c8d9e01",
"label": "email",
"type": "hidden",
"value": "ada@example.com",
"text": "ada@example.com"
}
]
}
}List webhooks
GET/webhooks
Lists the workspace's webhook subscriptions, newest first.
Query
formIdstring- Only webhooks for this form.
curl "https://api.enform.co/api/v1/webhooks?formId=c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/webhooks?formId=c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10", {
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.get(
"https://api.enform.co/api/v1/webhooks?formId=c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "list",
"data": [
{
"id": "9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d",
"formId": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"url": "https://example.com/enform/webhook",
"event": "submission.created",
"createdAt": "2026-11-03T10:00:00.000Z"
}
],
"hasMore": false,
"nextCursor": null
}Create a webhook
POST/webhooks
Sends every new completed response on one form to your URL. The secret comes back only here, so save it. A form can have up to 25 webhooks. See Webhooks.
JSON body
formIdstringrequired- The form's ID.
urlstringrequired- A public https URL that receives each delivery.
eventstring- Always
submission.created, the default.
curl -X POST "https://api.enform.co/api/v1/webhooks" \
-H "Authorization: Bearer $ENFORM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"formId":"c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10","url":"https://example.com/enform/webhook","event":"submission.created"}'const res = await fetch("https://api.enform.co/api/v1/webhooks", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({"formId":"c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10","url":"https://example.com/enform/webhook","event":"submission.created"}),
});
const json = await res.json();import os, requests
res = requests.post(
"https://api.enform.co/api/v1/webhooks",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
json={"formId":"c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10","url":"https://example.com/enform/webhook","event":"submission.created"},
)
data = res.json(){
"type": "webhook",
"data": {
"id": "9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d",
"formId": "c3a1f7e2-1b4d-4e8a-9c2f-6d5e4b3a2f10",
"url": "https://example.com/enform/webhook",
"event": "submission.created",
"createdAt": "2026-11-03T10:00:00.000Z",
"secret": "whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}Delete a webhook
DELETE/webhooks/{webhookId}
Stops deliveries to that URL right away.
Path
webhookIdstringrequired- The webhook's ID.
curl -X DELETE "https://api.enform.co/api/v1/webhooks/9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d" \
-H "Authorization: Bearer $ENFORM_API_KEY"const res = await fetch("https://api.enform.co/api/v1/webhooks/9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d", {
method: "DELETE",
headers: {
Authorization: "Bearer " + process.env.ENFORM_API_KEY,
},
});
const json = await res.json();import os, requests
res = requests.delete(
"https://api.enform.co/api/v1/webhooks/9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d",
headers={"Authorization": f"Bearer {os.environ['ENFORM_API_KEY']}"},
)
data = res.json(){
"type": "webhook",
"data": {
"id": "9d4e2b7a-3c1f-4a6e-8b0d-1f2e3a4b5c6d",
"deleted": true
}
}