For: Admins
Send forms and read answers with a hub key
Raise a form on a case from a template, publish it to the people who should fill it in, and read their answers.
In this article7 sections
Before you start
This page covers sending forms and reading their answers with a hub key. Paths are under https://prd-api-app.caseactive.com/v1/<hub id>/<case id>.
Calls
| Call | What it does |
|---|---|
GET /forms/templates | Lists your form templates |
POST /forms | Creates a form on the case, unpublished |
PUT /forms/<form_id>/publish | Publishes it, which sends it to its recipients |
GET /forms?filter=all | Lists the case's forms |
GET /forms/<form_id> | Reads one form |
PUT /forms/<form_id> | Changes its name, due date, reminders or recipients |
DELETE /forms/<form_id> | Deletes it, with its answers |
GET /forms/<form_id>/responses | Lists its answers |
GET /forms/<form_id>/responses/<response_id> | Reads one answer |
DELETE /forms/<form_id>/responses/<response_id> | Deletes one person's answer, so they can fill it in again |
A form goes out in two steps: create it, then publish it. Until it's published, its recipients don't see it and nobody is told.
Creating a form
GET /forms/templates lists your published form templatesTemplate A reusable feed post, form, e-sign, note or task kept in the Library and copied onto cases., oldest first, with each one's asset_id, title, description, due_mins (how many minutes after it's sent it's due), rrule (its repeat), notifications and instant_notify.
POST /forms takes:
| Field | What it does | Required | Default |
|---|---|---|---|
name | The form's title. Letters, numbers, spaces and & ' - _ ( ) . /; no commas or colons. | Yes | — |
duration | {"due_date": "2026-10-09T17:00:00-04:00", "rrule": "FREQ=MONTHLY"}. The due date needs its time zone offset. rrule, a repeat rule, is optional. zoneinfo, the time zone its repeat keeps, such as America/New_York, is optional: without it a repeat keeps your hub's time zone, at its time and on its day when the clocks change. | Yes | — |
participants_ids | The people who fill it in: user IDs of people on the case, from GET /team | No, but needed to publish | Nobody |
template | {"owner": "host", "template_id": "<asset_id>"} to use a template's document | No | None |
description | A note shown with the form | No | The template's |
notifications | Reminders: {"names": ["days", "hours"], "values": [-1440, -60]}, each value in minutes before the due date | No | The template's, or none |
instant_notify | false to send no request at publishing, only the reminders | No | The template's, or true |
A template brings its document, description, reminders and instant_notify, but not its due time or repeat: work out due_date from due_mins, and send its rrule if it has one.
curl -X POST https://prd-api-app.caseactive.com/v1/ca-7e6d5c4b3a2f10/cc-1a2b3c4d5e6f70/forms \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Case intake form", "duration": {"due_date": "2026-10-09T17:00:00-04:00"}, "participants_ids": ["cu-4f1c2a9e8b7d60"], "template": {"owner": "host", "template_id": "form::20260915101500_3c2b1a0f9e8d70"}}'
It answers 201 with the form_id. The template's document is copied in the background: read the form until it has no copying, then publish it.
To send your own document instead, create the form without template, upload a PDF as its document, and wait until it's ready; see Upload and attach files with a hub key.
Publishing
PUT /forms/<form_id>/publish takes no body and answers 200.
- Each recipient is emailed a request to fill it in, or texted if they have no confirmed email, at once, unless
instant_notifyisfalse. It appears on their To DoTo Do The list on a case of things waiting for you, such as forms to fill in, documents to sign or events to confirm. and in their portal notifications. - Reminders go out at each time in
notificationsstill ahead. Nothing is sent at the due time, and answers are accepted after it. - A repeating form moves to its next due date at each one, its answers clear, and everyone on it is asked again at once, unless
instant_notifyisfalse. - Someone removed from the case is dropped from the form.
The document can't change once the form is published. Its name, due date, reminders, recipients and description can, with PUT /forms/<form_id>; a repeat sent without zoneinfo keeps the time zone it already has. Changing the due date, repeat or reminders sends the request again, at once, to everyone who hasn't answered, and people you add are sent it at once; with instant_notify false, neither goes until the reminders.
Reading answers
GET /forms/<form_id>/responses lists each person's answer, oldest first, all on one page. A repeating form lists only the current date's; an earlier date's answer is still read by its response_id.
{
"data": {
"items": [
{
"response_id": "response::20261003153012_9f8e7d6c5b4a30",
"parent_id": "form::20261002150000_1a2b3c4d5e6f70",
"user_id": "cu-4f1c2a9e8b7d60",
"created_on": "2026-10-03T15:30:12+00:00",
"response": {
"format": "https://pspdfkit.com/instant-json/v1",
"formFieldValues": [
{"v": 1, "type": "pspdfkit/form-field-value", "name": "client_name", "value": "Jane Sample"},
{"v": 1, "type": "pspdfkit/form-field-value", "name": "accident_date", "value": "2026-09-14"}
]
}
}
],
"currentItemCount": 1,
"selfLink": "https://prd-api-app.caseactive.com/v1/ca-7e6d5c4b3a2f10/cc-1a2b3c4d5e6f70/forms/form::20261002150000_1a2b3c4d5e6f70/responses"
}
}
formFieldValuesholds each field the person filled in, by the field'sname. A signature or drawing comes underannotationsandattachments.- The form's own read shows who has answered:
responsesmaps each person's user ID to theirresponse_id. - When someone submits, the staff on the case are told, as they would be if they'd sent the form themselves.
Deleting one person's answer, with {"user_id": "<their ID>"} as the body, puts the form back on their To Do. Nobody is told. A key can't fill in a form itself.
Listing forms
GET /forms needs filter:
filter | What it lists |
|---|---|
all | Every form on the case, unpublished ones included, newest first |
self | Forms the Virtual Assistant sent: by any of your keys, or by automations |
completed, uncompleted | The forms the caller was asked to fill in. They're always empty for a key. |
Each form holds its form_id, name, participants_ids, due_date, published (1 once published), responses, responses_ct and its document under media.
DELETE /forms/<form_id> deletes a form at any time, with its answers, and takes it off everyone's To Do. Nobody is told.
If a call is refused
| Status | message | Why |
|---|---|---|
| 400 | SchemaFieldsException | A field is missing or invalid, such as a comma in name, a due date with no offset, or someone who isn't on the case; errors names it |
| 400 | SchemaFieldsException, with ItemCopyNotAllowedException at template | The template isn't published, isn't open to the Bots role, or its files are still being processed |
| 403 | PublishAlreadyPublishedException | It's already published |
| 403 | PublishAlreadyAnsweredException | Someone has already answered it |
| 403 | PublishMediaMissingException | It has no document yet |
| 403 | PublishMediaNotReadyException | Its document is still being copied or converted |
| 403 | PublishMediaFailedException | Its document failed to convert |
| 403 | PublishDueTimePassedException | Its due date has passed |
| 403 | PublishRecipientsMissingException | It has nobody to send it to |
| 403 | BotNotAllowedException | A key tried to fill it in |
| 403 | CaseClosedException | The case is closed |
| 404 | ItemNotFoundException | The form or answer doesn't exist |
For the error body and the rest of the codes, see Handle API errors and status codes.