For: Admins
Send e-signs and read signatures with a hub key
Raise an e-sign on a case from a template, choose who signs each field, publish it for signing, and download the locked copy once everyone has signed.
In this article9 sections
Before you start
This page covers sending e-signsE-sign A document sent for electronic signature, signed in the browser. and following their signatures with a hub key. Paths are under https://prd-api-app.caseactive.com/v1/<hub id>/<case id>.
Calls
| Call | What it does |
|---|---|
GET /signs/templates | Lists your e-sign templates |
POST /signs | Creates an e-sign on the case, unpublished |
PUT /signs/<sign_id>/schema | Chooses who signs each field |
PUT /signs/<sign_id> | Changes its name, due date or reminders, before publishing |
PUT /signs/<sign_id>/publish | Publishes it, which sends it to its signers |
GET /signs?filter=all | Lists the case's e-signs |
GET /signs/<sign_id> | Reads one e-sign, with its status |
DELETE /signs/<sign_id> | Deletes it, with its signatures |
GET /signs/<sign_id>/responses | Lists its signatures |
GET /signs/<sign_id>/responses/<response_id> | Reads one signature |
An e-sign goes out in steps: create it, check who signs each field, then publish it. Until it's published, its signers don't see it and nobody is told. Once it's published, nothing about it can change.
Creating an e-sign
GET /signs/templates lists your published e-sign 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), notifications, and role_field_participants, the roles that sign each field.
POST /signs takes:
| Field | What it does | Required | Default |
|---|---|---|---|
name | The e-sign's title. Letters, numbers, spaces and & ' - _ ( ) . /; no commas or colons. | Yes | — |
duration | {"due_date": "2026-10-09T17:00:00-04:00"}, with its time zone offset. E-signs don't repeat: a repeat rule is refused. | Yes | — |
template | {"owner": "host", "template_id": "<asset_id>"} to use a template's document and signers | No | None |
description | A note shown with the e-sign | No | The template's |
notifications | Reminders: {"names": ["days"], "values": [-1440]}, 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 |
curl -X POST https://prd-api-app.caseactive.com/v1/ca-7e6d5c4b3a2f10/cc-1a2b3c4d5e6f70/signs \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Retainer Agreement", "duration": {"due_date": "2026-10-09T17:00:00-04:00"}, "template": {"owner": "host", "template_id": "sign::20260915101500_7a6b5c4d3e2f10"}}'
It answers 201 with the sign_id. The template's document is copied in the background: read the e-sign until it has no copying.
To send your own PDF instead, create the e-sign without template, upload the PDF as its document and wait until it's ready, then assign its fields; see Upload and attach files with a hub key.
Choosing who signs
From a template, each field goes to the people on the case who hold its roles when the e-sign is created, so put the client on the case first. The e-sign's field_participants shows the result: each field's name, with the user IDs who sign it.
To change it, send the whole map to PUT /signs/<sign_id>/schema:
{"field_participants": {"Client Signature": ["cu-4f1c2a9e8b7d60"], "Attorney Signature": ["cu-9d8c7b6a5f4e30"]}}
- Every ID must be someone on the case. The Virtual Assistant can't sign.
- Field names are the ones in the document.
- The map replaces the old one: a field you leave out has no signer.
Publishing
PUT /signs/<sign_id>/publish takes no body and answers 200. At least one field must have a signer; a field with none stays empty.
- Each signer is emailed a request to sign, 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, until they've signed. - Someone removed from the case stops holding it up.
Following the signatures
The e-sign's status reads completed once everyone has signed, and completed_on says when, in UTC, such as 2026-10-06T21:42:10.123456+00:00. Until then it has neither, and responses maps each signer who has signed to their response_id.
GET /signs/<sign_id>/responses lists each signer's signature, oldest first, all on one page. Each holds the signer's user_id, when they signed, the fields they filled under response.formFieldValues, their signature under response.annotations and response.attachments, and the ip address they signed from.
The staff on the case are told each time someone signs, and again when the signed copy is ready, as they would be if they'd sent it themselves. Every signer is told when the signed copy is ready, too.
The locked copy
Once everyone has signed, a locked copy with every signature is made. The document's entry under media.schemas.items gains flat, the copy's path, and flat_status, SUCCEEDED or FAILED. Download it as any file; see Upload and attach files with a hub key.
Listing and deleting
GET /signs needs filter: all lists every e-sign on the case, unpublished ones included, newest first; self lists those the Virtual Assistant sent, by any of your keys or by automations. completed and uncompleted list the caller's own, so they're always empty for a key: check each e-sign's status and completed_on instead.
DELETE /signs/<sign_id> deletes an e-sign at any time, with its signatures, 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 repeat rule, or a signer 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, so it can't change |
| 403 | PublishAlreadyAnsweredException | Someone has already signed it |
| 403 | PublishParticipantsMissingException | No field has a signer |
| 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 | PublishDocumentUnreadableException | Its document can't be read: delete the e-sign and create it again |
| 403 | PublishDueTimePassedException | Its due date has passed |
| 403 | BotNotAllowedException | A key tried to sign it, or to remove someone's signature |
| 403 | CaseClosedException | The case is closed |
| 404 | ItemNotFoundException | The e-sign or signature doesn't exist |
For the error body and the rest of the codes, see Handle API errors and status codes.