Sending & Signing¶
This covers the full document flow: upload → add recipients → place fields → send → each recipient signs → done. In the app this spans several full-screen steps (Upload, Add Recipients, Prepare Document, the signing Editor) rather than one page, but it's one continuous API sequence — documented here as a single flow with the field-by-field reference for each step.
There is no separate 'multisign' API
A single-recipient envelope and a multi-recipient envelope are the same thing — "multi" just means more than one recipient added to the same workflow. What really varies is the sequence: ORDERED (one recipient acts at a time, in turn) or UNORDERED (every recipient can act in parallel, as soon as it's sent).
Overview¶
sequenceDiagram
participant Owner
participant API
participant R1 as Recipient 1
participant R2 as Recipient 2
Owner->>API: POST /document/v1 (upload PDF)
API-->>Owner: { id, workflowId } (draft)
Owner->>API: POST /workflow/v1/{workflowId}/recipients ([R1, R2])
Owner->>API: POST /workflow/v1/{documentId}/fields (place signature fields)
Owner->>API: POST /workflow/v1/{workflowId}/commence
alt Ordered
API->>R1: Commence email (R1's turn)
R1->>API: fields/save + /sign
API-->>API: Advance sequence
API->>R2: Commence email (R2's turn)
R2->>API: fields/save + /sign
API-->>API: Last recipient done -> seal + completed
else Unordered
API->>R1: Commence email
API->>R2: Commence email
par Both act independently
R1->>API: fields/save + /sign
and
R2->>API: fields/save + /sign
end
API-->>API: Last recipient done -> seal + completed
end
1. Upload¶
Covered in Documents → Upload. Omitting workflowId creates a new draft workflow; the response gives you both the document id and the workflow id you'll use for every following step.
2. Recipients¶
Endpoint summary¶
| Method | Path | Summary |
|---|---|---|
| GET | /workflow/v1/{workflowId}/recipients |
List recipients |
| GET | /workflow/v1/{workflowId}/recipients/{recipientId} |
Get one |
| POST | /workflow/v1/{workflowId}/recipients |
Add recipients (draft only) |
| PUT | /workflow/v1/{workflowId}/recipients |
Update recipients (draft only) |
| DELETE | /workflow/v1/{workflowId}/recipients/{recipientId} |
Remove (draft only) |
| POST | /workflow/v1/{workflowId}/recipients/{recipientId}/delegate |
Delegate a turn to someone else |
Adding recipients¶
POST /workflow/v1/887/recipients
Content-Type: application/json
[
{ "name": "Jane Doe", "emailAddress": "jane@example.com", "useDigitalCert": false, "recipientOrder": "1", "recipientColor": "#4F46E5", "recipientRole": "SIGNER" },
{ "name": "Legal Team", "emailAddress": "legal@example.com", "useDigitalCert": false, "recipientOrder": "2", "recipientColor": "#059669", "recipientRole": "APPROVER" }
]
| Field | Type | Validation |
|---|---|---|
name |
string | required, 2–50 chars, letters + single interior spaces |
emailAddress |
string | required, valid email, ≤255 chars |
recipientPassword |
string | optional — a per-recipient access password, separate from account credentials |
useDigitalCert |
boolean | required |
recipientOrder |
string | required only when the workflow's sequence is ORDERED |
recipientColor |
string | required — hex color for that recipient's field highlighting |
recipientRole |
string | SIGNER, APPROVER, or CC (blank defaults to SIGNER) |
enforceIdentity |
boolean | optional — gates signing behind OTP identity verification |
If an email doesn't match an existing platform user, a guest account is created for them automatically — no separate invite step is needed.
Errors: workflow isn't in draft or isn't owned by the caller; recipients aren't allowed on a self-sign workflow; a Power Survey workflow only accepts SIGNER-role recipients; duplicate order/email under an ordered sequence.
PUT /workflow/v1/{workflowId}/recipients edits existing recipients before sending (same shape + required id). POST .../delegate (below) hands a turn to someone else, usable even after the workflow is sent.
Delegating¶
POST /workflow/v1/887/recipients/5501/delegate
Content-Type: application/json
{ "name": "Backup Signer", "emailAddress": "backup@example.com" }
Usable by the workflow owner or the recipient themself. The delegate inherits the original recipient's order/role/fields.
3. Place fields¶
Endpoint summary¶
| Method | Path | Summary |
|---|---|---|
| POST | /workflow/v1/{documentId}/fields |
Add a field |
| POST | /workflow/v1/fields/list |
Add multiple fields at once |
| PUT | /workflow/v1/{documentId}/fields/{fieldId} |
Update a field |
| PATCH | /workflow/v1/{documentId}/fields/{fieldId}/required |
Toggle required/styling only |
| GET | /workflow/v1/{workflowId}/fields, /all-fields, /fields/{fieldId} |
Read fields |
| DELETE | /workflow/v1/{workflowId}/fields/{fieldId} |
Delete a field |
POST /workflow/v1/1200/fields
Content-Type: application/json
{ "pageNo": 1, "fieldType": "SIGNATURE", "box": { "x": 100, "y": 200, "width": 150, "height": 40 }, "recipientId": 5501, "fieldRequired": true }
| Field | Validation |
|---|---|
pageNo |
required, ≥1 |
box |
required — {x, y, width, height} |
fieldType |
one of SIGNATURE, TEXT, CHECKBOX, NAME, EMAIL, NUMBER, DROPDOWN, NOTE, TEXTAREA, DIGITAL_SIGNATURE, INITIALS, IMAGE, DATE |
recipientId |
which recipient this field belongs to |
PUT .../fields/{fieldId} additionally supports styling (textColor, fontFamily, bold, italic, underline, strikethrough, textAlign, backgroundColor, fontSize, placeholder, dateLang, useAsLabel).
4. Send¶
POST /workflow/v1/887/commence
Content-Type: application/json
{ "title": "Please review and sign", "message": "See attached NDA for your signature." }
What happens next depends entirely on the sequence:
| Sequence | Behavior |
|---|---|
ORDERED |
Dispatches only the first action-required recipient (leading CC rows are auto-processed first); the next recipient is dispatched only once the prior one finishes. |
UNORDERED |
Dispatches every non-CC recipient at once — true parallel signing. |
SURVEY (Power Survey) |
Triggers async bulk fan-out — see Power Survey. Returns 202 Accepted instead of 200. |
Responses: 200 OK (normal send completed), 202 Accepted (Power Survey dispatch started), 400 (no recipients, wrong status/owner, or your plan disallows document sharing).
5. Recipient views and signs¶
Each recipient reaches the signing UI via the guest signing flow (or, if already logged in, just their normal session), then:
POST /workflow/v1/1200/fields/save
Content-Type: application/json
[ { "id": 5501, "value": "Jane Doe", "type": "TEXT" } ]
...for each field, followed by:
POST /workflow/v1/887/sign
Content-Type: application/json
{ "id": 5502, "image": "data:image/png;base64,..." }
id is the field id, image the rendered signature/initials image. If the recipient is signing with a digital certificate (useDigitalCert: true) and a password is included in the fields/save call, this is where their signing password is verified — first use provisions their key material, later uses just verify it. This can only happen interactively (never as a background job), since the private key itself is password-protected at the point it was created.
If instead this recipient is an APPROVER: POST /workflow/v1/887/approve with a comment. To reject: POST /workflow/v1/887/decline with a reason — GET /workflow/v1/887/reject-details returns the structured reason afterward.
6. Sequence advances automatically¶
Under ORDERED, the moment one recipient finishes, the next non-CC recipient in order is automatically dispatched — there's no separate "advance" call to make. CC-role recipients are skipped over and simply notified once the sequence reaches their position.
7. Completion¶
Once the last action-required recipient signs or approves, completion happens automatically:
- The invisible sealing/certification signature is applied.
- The workflow's status becomes
COMPLETED. - The evidence report becomes available:
GET /workflow/v1/evidence-report/{workflowId}— an HTML audit trail of who signed what, when, from what IP, with what consent record. This is what the app's Audit Report screen renders.
No client-callable 'finish' step
A finish endpoint exists in the API but does nothing — completion is entirely automatic, driven by the last required recipient's action. Don't build integration logic around calling it.
Voided workflows¶
A workflow that's been declined or otherwise voided is read-only from then on — the app's Void screen just displays its final state; there's no separate "void" API action beyond decline (see step 5) or a Power Survey parent cascading a void to its children (see Power Survey).
Two mechanics worth knowing about¶
- Hidden assistant pre-review. If a recipient has Assistant delegation enabled, their turn is transparently routed through their assistant first. This never appears in anyone else's recipient list — from every other participant's perspective, nothing looks different.
- Auto-delegation ("away") swaps. If a recipient has an active auto-delegation window, the platform can silently substitute their stand-in delegate at the moment their turn starts, rather than waiting on someone who's away.
Neither requires any special handling from an integrating client — both are resolved server-side before a commence email is ever sent.
Remote/CSC signing bridge¶
For signers using a remote qualified-signature provider (the CSC protocol) instead of a locally-drawn signature:
POST /workflow/v1/1200/sign/csc
Content-Type: application/json
{ "id": 5501, "connectorName": "CSC_2", "qualifier": "QES" }
Returns a hash to be signed by the remote provider's own authorization flow; the resulting signature is then submitted:
POST /workflow/v1/1200/signature/csc
Content-Type: application/json
{ "hash": "...", "code": "...", "connectorName": "CSC_2", "qualifier": "QES", "credentialID": "..." }
POST /workflow/v1/signature/csc/batch performs the same exchange across multiple documents in a single authorization step — useful when a signer needs to qualified-sign several documents at once. GET /workflow/v1/check-user-credits/{workflowId}?qualifier=QES and GET /workflow/v1/service-plan-qualifier let the UI pre-check credit/plan eligibility before starting this flow.