Document packs
Overview
The document_packs API allows you to create multiple child documents and merge them into a single document_pack. This enables you to:
- Merge templates, syntax documents, or form field documents into a single pack.
- Assign fields and signers to each document.
- Customise email notifications and the signer experience.
- Manage all child documents in a single API request.
This allows templates, syntax documents, and form field documents to be combined into a single request while controlling how the document pack behaves during the signing process and after completion.
Migration ReminderFor migrating from v0 to v1, see: Migrating from V0 to V1
🎥 Demo Watch the walkthrough: Creating a Document Pack Using an Existing Template
Document Pack Structure
A document_pack consists of several sections. Each section manages a different part of the document workflow including recipients, signers, documents, and signing behaviour.
CC Recipients
Optional. Specifies recipients who should receive a final completed copy of the document pack.
Multiple CC recipients can be configured.
Properties
| Property | Description |
|---|---|
| Email address that will receive the completed document | |
| mobile_number | Mobile number that will receive the completed document |
| name | Name of the CC recipient |
| can_track_progress | Allows the recipient to receive email updates when document status changes and provides a link to track signing progress |
Example
"cc_recipients": [
{
"email": "[email protected]",
"mobile_number": "+27000000000",
"name": "Joe Soaps Brother",
"can_track_progress": false
}
]Document Pack Name
Sets the name for the document pack. Each child document will retain its own name but will belong to this pack.
Example
"document_pack_name": "my first document_pack"Signatories
Defines the users who will sign documents in the pack.
Properties
| Property | Description |
|---|---|
| name | Signer’s name used in notifications |
| Default communication channel for signing notifications | |
| mobile_number | Used for OTP verification or SMS/WhatsApp notifications |
| primary_communication_channel | Determines how notifications and OTPs are sent (email, SMS, or whatsapp) |
| role | Matches the signer role configured in a template (not required for syntax or form field documents) |
| uuid | Optional identifier used to link a signer to fields within data_fields |
If the uuid is not specified, the system will generate one automatically.
Note: Mobile numbers must be in international format and include the dialing code (e.g. +27XXXXXXXXX). Numbers without a country code may fail for SMS or WhatsApp delivery.
Communication Channel Permissions
The primary_communication_channel field supports email, sms, and whatsapp.
Access to sms and whatsapp must be enabled on your account before use.
If you would like to send signing requests via SMS or WhatsApp, please contact [email protected] to have these channels enabled.
Example
"signatories": [
{
"name": "Joe Soap",
"email": "[email protected]",
"mobile_number": "+27000000000",
"role": "signer-1",
"primary_communication_channel": "whatsapp"
},
{
"name": "Joe Soaps Brother",
"email": "[email protected]",
"role": "signer-2"
}
]Note: If primary_communication_channel is not specified, it will default to email. You only need to include this field when using sms or whatsapp.
Mail Settings
Optional. Controls how emails are sent to signers.
Properties
| Property | Description |
|---|---|
| exclude_created_by_from_final_mail | Prevents the creator of the document pack from receiving the final signed document |
| include_attachments_in_final_mail | Includes the completed document as an attachment in the final email |
| message | Custom email body message |
| subject | Email subject line |
| reply_email | Reply-to email address for signatories to use |
| sender_name | Sender name displayed in notification emails |
Note The default wording of system-generated emails cannot be modified. Only the subject, custom message, sender name, and reply email can be configured.
Example
"mail_settings": {
"exclude_created_by_from_final_mail": false,
"include_attachments_in_final_mail": false,
"message": "Custom email body message",
"subject": "My First Document Pack",
"reply_email": "[email protected]",
"sender_name": "Example Name"
}Documents
This is where the child documents are added to the document pack.
Each document can be created using a template, a syntax document, or a form field PDF.
Properties
| Property | Description |
|---|---|
| document_creation_settings | Specifies the document type and required flags |
| document_name | Name of the child document |
| data_fields | Optional fields used to pre-populate or assign fields to signers |
Document Creation Settings
Template Document
"create_from_template_key": "<template_key>"Syntax Document (Base64)
The document must be supplied as a Base64 encoded file.
Required flag:
"extract_fields_by_tag": trueForm Field Document
The document can be supplied using either:
base_64_documentdocument_url
Required flags:
"extract_fields_from_form_fields_with_metadata": true,
"apply_extracted_fields": trueThese flags instruct the API to extract and apply fields from the PDF.
Data Fields
The data_fields section allows fields within documents to be:
- Pre-filled with data
- Assigned to specific signers
Properties
| Property | Description |
|---|---|
| custom_id | Matches the field identifier defined in a template, syntax document, or form field PDF |
| data | Value used to populate the field |
| signatory_uuid | Assigns the field to a specific signer |
For example, if a document contains a field with custom_id first_name, you can pre-populate it using:
{
"custom_id": "first_name",
"data": "Joe"
}Example
"documents": [
{
"document_creation_settings": {
"base_64_document": "<base_64_string>",
"extract_fields_by_tag": true
},
"document_name": "my base_64 syntax child document",
"data_fields": [
{"custom_id": "first_name", "data": "Joe", "signatory_uuid": "signer_1"},
{"custom_id": "last_name", "data": "Soap", "signatory_uuid": "signer_1"},
{"custom_id": "employee_signature", "signatory_uuid": "signer_1"}
]
},
{
"document_creation_settings": {
"document_url": "https://www.quicklysign.com/s/example_form_field.pdf",
"extract_fields_from_form_fields_with_metadata": true,
"apply_extracted_fields": true
},
"document_name": "my hosted form field child document",
"data_fields": [
{"custom_id": "company_name", "data": "QuicklySign", "signatory_uuid": "signer_2"},
{"custom_id": "registration_number", "signatory_uuid": "signer_2"},
{"custom_id": "employer_signature", "signatory_uuid": "signer_2"}
]
},
{
"document_creation_settings": {
"create_from_template_key": "<template_key>"
},
"document_name": "my template child document"
}
]Signing Settings
Controls the behaviour of the signing process.
Properties
| Property | Description |
|---|---|
| attachments_visible_to_all_signers | Determines whether all signers can view attachments |
| branding_key | Applies custom branding (see Branding API documentation) |
| can_use_drawn_signature | Allows signers to draw their signature |
| can_use_one_click_initial | Allows existing users to apply saved initials |
| can_use_one_click_signature | Allows existing users to apply saved signatures |
| can_use_typed_signature | Allows signers to type their signature |
| can_use_uploaded_signature | Allows uploading an image of a signature |
| post_signing_url | Redirect URL after signing is completed |
| sequential_signing | Controls whether signers sign one after another or simultaneously |
| use_signing_wizard | Guides users through required fields |
| use_two_factor_authentication | Requires OTP verification via email, SMS, or WhatsApp |
Example
"signing_settings": {
"attachments_visible_to_all_signers": true,
"branding_key": null,
"can_use_drawn_signature": true,
"can_use_one_click_initial": true,
"can_use_one_click_signature": true,
"can_use_typed_signature": true,
"can_use_uploaded_signature": true,
"post_signing_url": "",
"sequential_signing": true,
"use_signing_wizard": true,
"use_two_factor_authentication": true
}Retrieve Document Packs
All retrieval requests require a valid access_token.
Get All Document Packs
GET /v1/document_packsExample:
https://sandboxapi.quicklysign.com/v1/document_packs
Get a Specific Document Pack
GET /v1/document_packs/<document_pack_key>Get Document Packs for a Team / Workspace
GET /v1/document_packs?team_key=<team_key>Download Completed Document
Once a document pack has been fully signed, the completed PDF can be downloaded using the serve_pdf_url.
Method 1 - Retrieve from Creation Response
After creating and sending a document pack, the API response will include serve_pdf_url.
Once signing is complete, this URL can be used to download the document.
Method 2 - Retrieve via Document Pack Endpoint
GET /v1/document_packs/<document_pack_key>The response will include serve_pdf_url once the document has been finalized.
Delete Document Pack
To delete a document pack you must provide the document_pack_key.
Important: The API requires the DOCUMENT_PACK_KEY, not the child document key.
DELETE /v1/document_packs/<document_pack_key>Example:
https://sandboxapi.quicklysign.com/v1/document_packs/<document_pack_key>
Advanced Signing Settings
If the first signer needs permission to edit document data (for example an advisor or preparer role), enable:
"signing_settings": {
"first_signer_has_multi_edit_role": true
}This allows the first signer to:
- Edit multiple fields
- Correct information before the client signs the document
Advanced Data Field Placement
Optional. Used when fields need to be positioned manually.
Field positioning uses pixel coordinates relative to the top-left corner of the document (page 0).
If each page is 800px high and the document has 10 pages, the final page fields will have y values between 7200 and 8000 pixels.
Fields can be positioned by:
- manually specifying coordinates, or
- extracting fields from another document with the same layout.
(See image below)

Data field positioning.
Updated 3 days ago
