DEV Community

Cover image for BoldSign Collaborative Fields for Accurate Multi‑Signer API Workflows
Vijay Amalan for BoldSign

Posted on • Originally published at boldsign.com

BoldSign Collaborative Fields for Accurate Multi‑Signer API Workflows

Collecting accurate input from multiple signers becomes challenging when the same terms must be agreed upon by more than one party. In API-driven eSignature workflows, this often leads to duplicated fields, manual reconciliation, or custom validation logic, adding complexity and increasing the risk of errors.

Collaborative fields in BoldSign, available through the API, solve this. They make it easier to collect agreed-upon values for budgets, addresses, comments, or project details in multiparty signing workflows.

What are collaborative fields in BoldSign and how do they work via API

Collaborative fields in BoldSign allow multiple signers to edit the same form field during a signing workflow. Instead of each signer only completing their assigned fields, collaborative fields let authorized participants change shared information before a document is fully executed.

When used through the API, collaborative fields are configured within the field definition using the collaborationSettings object. These settings control:

  • Who can edit a field.
  • Whether previous signers must re-sign if the field changes.
  • Whether signers must approve updates.
  • How changes appear in audit logs.

What are the benefits of collaborative fields

The key advantages of using collaborative fields in document workflows.

  • Improved accuracy: When multiple signers can contribute to a single field, it reduces the need for back-and-forth communication and manual data merging.
  • Enhanced transparency: Everyone involved can see what others have contributed, fostering better collaboration and accountability.
  • Faster completion times: By enabling real-time contributions, collaborative fields minimize delays, reduce back‑and‑forth messaging, and help documents get completed more quickly.
  • Better collaboration experience: Collaborators feel more connected and aligned because activities happen within a shared, interactive environment rather than isolated inputs.

Which field types support collaboration

BoldSign enables real‑time collaboration across the following field types, allowing multiple signers to contribute with ease:

  • Text box
  • Radio button
  • Checkbox
  • Editable date
  • Dropdown

How do you configure collaborationSettings via API

To enable collaboration, include a collaborationSettings object inside the field payload when making an API call.

Example:

    "FormFields": [ 
     { 
        "FieldType": "TextBox", 
        "PageNumber": 1, 
        "Bounds": {  
          "X": 50,  
          "Y": 100,  
          "Width": 400,  
          "Height": 25  
        }, 
        "CollaborationSettings": { 
          "IsRequired": true, 
          "RequireSignerApproval": true, 
          "RequireInitial": true, 
          "AllowedSigners": ["string"] 
        } 
     } 
    ] 
Enter fullscreen mode Exit fullscreen mode

Properties 

In the collaborativeSettings, set these properties:

  • "isRequired" (Boolean): This property is used to specify whether collaborative fields are mandatory for signers collaborating on the document.
  • "requireSignerApproval" (Boolean): This property is used to specify whether signers need to verify and approve the document after collaborators have made changes to the collaborative fields.
  • "requireInitial" (Boolean): This property is used to specify whether the collaborators must fill in their initials when editing collaborative fields.
  • "allowedSigners" Array: This property is used to specify the list of role indexes or signer IDs (role index for the create and send template APIs, signer ID for document sending) who are allowed to collaborate on editing this field.

Which API endpoints support collaborative fields

API endpoint Guidelines for use
POST /v1/document/send Assign a unique signer ID (e.g., 3ba7b810-9dad-11d1-50b4-00c04fd430c9) to the allowedSigners property.
POST /v1/template/send Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
POST /v1/template/create Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
POST /v1/template/mergeAndSend Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
POST /v1/document/createEmbeddedRequestUrl Assign a unique signer ID (e.g., 3ba7b810-9dad-11d1-50b4-00c04fd430c9) to the allowedSigners property.
POST /v1/template/createEmbeddedRequestUrl Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
POST /v1/template/mergeCreateEmbeddedRequestUrl Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
POST /v1/template/createEmbeddedTemplateUrl Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.
PUT /v1/template/edit Use the template role index (e.g., “1”, “2”) as the unique identifier for signers in the allowedSigners property.

How do you control who can edit a collaborative field

Control is handled through the field’s allowedSigners property. Each value should be a recipient’s unique ID or role index defined in your signer list.

Example:

 

    “AllowedSigners": ["signer ID" OR " role index 1,2..."] 
Enter fullscreen mode Exit fullscreen mode

This ensures only the selected signers can modify the shared field. You can restrict collaboration to a pair of signers or open it to all signers.

Following are example code snippets of how to set up collaborative fields in an eSignature request via API.

cURL

    curl -X 'POST' \ 
      'https://api.boldsign.com/v1/document/send' \ 
      -H 'accept: application/json' \ 
      -H 'X-API-KEY: {your API key}' \ 
      -H 'Content-Type: application/json' \ 
      -d '{ 
        "DisableExpiryAlert": false, 
        "ReminderSettings": { 
          "ReminderDays": 5, 
          "ReminderCount": 3, 
          "EnableAutoReminder": true 
        }, 
        "Message": "", 
        "Signers": [ 
          { 
            "Name": "David", 
            "Id": "4ba7b810-3dad-11d1-80b4-00c04fd430c8", 
            "EmailAddress": "david@cubeflakes.com", 
            "SignerType": "Signer", 
            "FormFields": [ 
              { 
                "FieldType": "Signature", 
                "PageNumber": 1, 
                "Bounds": { "X": 50, "Y": 50, "Width": 200, "Height": 25 } 
              }, 
              { 
                "FieldType": "DateSigned", 
                "PageNumber": 1, 
                "Bounds": { "X": 50, "Y": 150, "Width": 200, "Height": 25 }, 
                "IsRequired": true 
              }, 
              { 
                "FieldType": "TextBox", 
                "PageNumber": 1, 
                "Bounds": { "X": 50, "Y": 100, "Width": 400, "Height": 25 }, 
                "CollaborationSettings": { 
                  "IsRequired": true, 
                  "RequireSignerApproval": true, 
                  "RequireInitial": true, 
                  "AllowedSigners": ["550e8400-e29b-41d4-a716-446655440000"] 
                } 
              } 
            ] 
          }, 
          { 
            "Name": "Alice", 
            "Id": "550e8400-e29b-41d4-a716-446655440000", 
            "EmailAddress": " alice@cubeflakes.com", 
            "SignerType": "Signer", 
            "FormFields": [ 
              { 
                "FieldType": "Signature", 
                "PageNumber": 1, 
                "Bounds": { "X": 50, "Y": 200, "Width": 200, "Height": 25 } 
              }, 
              { 
                "FieldType": "DateSigned", 
                "PageNumber": 1, 
                "Bounds": { "X": 50, "Y": 250, "Width": 200, "Height": 25 }, 
                "IsRequired": true 
              } 
            ] 
          } 
        ], 
        "ExpiryDays": 30, 
        "Files": [ 
          "data:application/pdf;base64,JVBERi0xLjcKJcfs..." 
        ], 
        "Title": "Sampledocument", 
        "ExpiryDateType": "Days", 
        "ExpiryValue": 60, 
        "DisableEmails": false, 
        }
Enter fullscreen mode Exit fullscreen mode

C#

    var apiClient = new ApiClient("https://api.boldsign.com", "Your API Key"); 
    var documentClient = new DocumentClient(apiClient); 
      
    // ----- David's fields ----- 
    var davidSignatureField = new FormField( 
        type: FieldType.Signature, 
        pageNumber: 1, 
        bounds: new Rectangle(x: 166, y: 645, width: 200, height: 25) 
    ); 
      
    var davidDateField = new FormField( 
        id: "date", 
        type: FieldType.DateSigned,  
        pageNumber: 1, 
        bounds: new Rectangle(x: 134, y: 713, width: 200, height: 25), 
        isRequired: true 
    ); 
      
    // Text box with collaboration settings limited to Alice (by signer ID) 
    var davidTextBoxField = new FormField( 
        id: "david_textbox", 
        type: FieldType.TextBox, 
        pageNumber: 1, 
        bounds: new Rectangle(x: 202, y: 446, width: 400, height: 25) 
    ); 
    davidTextBoxField.CollaborationSettings = new CollaborationSettings 
    { 
        IsRequired = true, 
        RequireSignerApproval = true, 
        RequireInitial = true, 
        AllowedSigners = new List 
        { 
            "550e8400-e29b-41d4-a716-446655440000",  //Alice ID 
        } 
    }; 
      
    // ----- Alice's fields ----- 
    var aliceSignatureField = new FormField( 
        id: "signature", 
        type: FieldType.Signature, 
        pageNumber: 1, 
        bounds: new Rectangle(x: 553, y: 644, width: 200, height: 25) 
    ); 
      
    var aliceDateField = new FormField( 
        id: "date", 
        type: FieldType.DateSigned,  
        pageNumber: 1, 
        bounds: new Rectangle(x: 527, y: 713, width: 200, height: 25), 
        isRequired: true 
    ); 
      
    // ----- Signers (with explicit IDs so fields can target them) ----- 
    var documentSignerDavid = new DocumentSigner( 
        signerName: "David", 
        signerEmail: " david@cubeflakes.com ", 
        signerType: SignerType.Signer, 
        formFields: new List { davidSignatureField, davidDateField, davidTextBoxField } 
    ); 
    documentSignerDavid.Id="6ba7b810-9dad-11d1-80b4-00c04fd430c8"; 
      
    var documentSignerAlice = new DocumentSigner( 
        signerName: "Alice", 
        signerEmail: " alice@cubeflakes.com ", 
        signerType: SignerType.Signer, 
        formFields: new List { aliceSignatureField, aliceDateField } 
    ); 
    documentSignerAlice.Id = "550e8400-e29b-41d4-a716-446655440000"; // Ensure this ID is correct based on your BoldSign account 
      
    // ----- Document details ----- 
    var documentDetails = new SendForSign 
    { 
        Title = "Agreement", 
        Signers = new List< > 
        { 
            // You can control signing order by list order if needed 
            documentSignerDavid, 
            documentSignerAlice 
        }, 
        Files = new List 
        { 
            new DocumentFilePath 
            { 
                ContentType = "application/pdf", 
                FilePath = "You file path.pdf", 
            } 
        }, 
        // Optional: set additional options like Message, EnableSigningOrder, Reminders, etc. 
        // EnableSigningOrder = true, 
    }; 
      
    // Send 
    var documentCreated = documentClient.SendDocument(documentDetails); 
    Console.WriteLine($"Document ID: {documentCreated.DocumentId}"); 
Enter fullscreen mode Exit fullscreen mode

Python

    import boldsign 

    configuration = boldsign.Configuration(api_key="YOUR API KEY ") 

    with boldsign.ApiClient(configuration) as api_client: 

        document_api = boldsign.DocumentApi(api_client) 

        # David's fields 
        signature_field = boldsign.FormField( 
            fieldType="Signature", 
            pageNumber=1, 
            bounds=boldsign.Rectangle(x=166.6, y=645.1, width=200, height=25) 
        ) 

        date_field = boldsign.FormField( 
            fieldType="DateSigned", 
            pageNumber=1, 
            bounds=boldsign.Rectangle(x=134.7, y=713.4, width=200, height=25), 
            isRequired=True, 
        ) 

        textbox_field = boldsign.FormField( 
            fieldType="TextBox", 
            pageNumber=1, 
            bounds=boldsign.Rectangle(x=202, y=446.4, width=400, height=25), 
            collaborationSettings=boldsign.CollaborationSettings( 
                isRequired=True, 
                requireSignerApproval=True, 
                requireInitial=True, 
                allowedSigners=[ 
                    "450e8400-e29b-41d4-a416-446655440000"  # Alice's ID 
                ] 
            ) 
        ) 

        document_signer_david = boldsign.DocumentSigner( 
            id="4ba7b810-3dad-11d1-80b4-00c04fd430c8", 
            name="David", 
            emailAddress="david@cubeflakes.com", 
            signerType="Signer", 
            formFields=[signature_field, date_field,textbox_field] 
        ) 

        # Alice's fields 
        signature_field_alice = boldsign.FormField( 
            fieldType="Signature", 
            pageNumber=1, 
            bounds=boldsign.Rectangle(x=553.2, y=644, width=200, height=25) 
        ) 

        date_field_alice = boldsign.FormField( 
            fieldType="DateSigned", 
            pageNumber=1, 
            bounds=boldsign.Rectangle(x=527.5, y=713.4, width=200, height=25), 
            isRequired=True, 
        ) 

        document_signer_alice = boldsign.DocumentSigner( 
            id="450e8400-e29b-41d4-a416-446655440000", 
            name="Alice", 
            emailAddress="alice@cubeflakes.com", 
            signerType="Signer", 
            formFields=[signature_field_alice, date_field_alice] 
        ) 

        send_for_sign = boldsign.SendForSign(  
            title="Non Disclosure Agreement", 
            files=["Your File Path.pdf"],  # Replace with actual file path 
            signers=[document_signer_david, document_signer_alice] 
        ) 

        document_created = document_api.send_document(send_for_sign) 
        print("Document sent successfully:", document_created) 
Enter fullscreen mode Exit fullscreen mode

PHP

    <?php 
    require_once "vendor/autoload.php"; 

    use BoldSign\Configuration; 
    use BoldSign\Api\DocumentApi; 
    use BoldSign\Model\{ 
        FormField, 
        Rectangle, 
        DocumentSigner, 
        SendForSign, 
        FileInfo, 
        EditableDateFieldSettings, 
        CollaborationSettings 
    }; 

    $config = new Configuration(); 
    $config->setApiKey(' Your API Key '); 

    $document_api = new DocumentApi($config);    

    // David's fields 
    $signature_field_david = new FormField(); 
    $signature_field_david->setFieldType('Signature'); 
    $signature_field_david->setPageNumber(1); 
    $signature_field_david->setBounds(new Rectangle(['x' => 50, 'y' => 50, 'width' => 200, 'height' => 25])); 

    $date_field_david = new FormField(); 
    $date_field_david->setFieldType('DateSigned'); 
    $date_field_david->setPageNumber(1); 
    $date_field_david->setBounds(new Rectangle(['x' => 50, 'y' => 150, 'width' => 200, 'height' => 25])); 

    $textbox_field_david = new FormField(); 
    $textbox_field_david->setFieldType('TextBox'); 
    $textbox_field_david->setPageNumber(1); 
    $textbox_field_david->setBounds(new Rectangle(['x' => 50, 'y' => 100, 'width' => 400, 'height' => 25])); 

    $textbox_field_david->setCollaborationSettings(new CollaborationSettings([ 
        'is_required' => true, 
        'require_signer_approval' => true, 
        'require_initial' => true, 
        'allowed_signers' => ['550e8400-e29b-41d4-a716-446655440000'] // Alice's ID 
    ])); 

    $document_signer_david = new DocumentSigner(); 
    $document_signer_david->setName("David"); 
    $document_signer_david->setId("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); 
    $document_signer_david->setEmailAddress("david@cubeflakes.com"); 
    $document_signer_david->setSignerType("Signer"); 
    $document_signer_david->setFormFields([$signature_field_david, $date_field_david, $textbox_field_david]); 

    // Alice's fields 
    $signature_field_alice = new FormField(); 
    $signature_field_alice->setFieldType('Signature'); 
    $signature_field_alice->setPageNumber(1); 
    $signature_field_alice->setBounds(new Rectangle(['x' => 50, 'y' => 200, 'width' => 200, 'height' => 25])); 

    $date_field_alice = new FormField(); 
    $date_field_alice->setFieldType('DateSigned'); 
    $date_field_alice->setPageNumber(1); 
    $date_field_alice->setBounds(new Rectangle(['x' => 50, 'y' => 250, 'width' => 200, 'height' => 25])); 
    $date_field_alice->setIsRequired(true); 

    $document_signer_alice = new DocumentSigner(); 
    $document_signer_alice->setName("Alice"); 
    $document_signer_alice->setId("550e8400-e29b-41d4-a716-446655440000"); 
    $document_signer_alice->setEmailAddress("alice@cubeflakes.com "); 
    $document_signer_alice->setSignerType("Signer"); 
    $document_signer_alice->setFormFields([$signature_field_alice, $date_field_alice]); 

    // Prepare document 
    $send_for_sign = new SendForSign(); 
    $files = new FileInfo(); 
    $files = 'Your File path .pdf'; 
    $send_for_sign->setFiles([$files]); 
    $send_for_sign->setSigners([$document_signer_david, $document_signer_alice]); 
    $send_for_sign->setTitle('Document SDK API'); 

    $document_created = $document_api->sendDocument($send_for_sign); 
    print_r($document_createdid); 
Enter fullscreen mode Exit fullscreen mode

Java

    ApiClient client = Configuration.getDefaultApiClient(); 
    client.setApiKey("Your API Key "); 

    DocumentApi documentApi = new DocumentApi(client); 

    // ── David's fields  
    FormField signatureFieldDavid = new FormField(); 
    signatureFieldDavid.setFieldType(FormField.FieldTypeEnum.SIGNATURE); 
    signatureFieldDavid.setPageNumber(1); 
    Rectangle boundsDavidSig = new Rectangle().x(166.6f).y(645.1f).width(200f).height(25f); 
    signatureFieldDavid.setBounds(boundsDavidSig); 

    FormField dateFieldDavid = new FormField(); 
    dateFieldDavid.setFieldType(FormField.FieldTypeEnum.DATE_SIGNED); 
    dateFieldDavid.setPageNumber(1); 
    Rectangle boundsDavidDate = new Rectangle().x(134.7f).y(713.4f).width(200f).height(25f); 
    dateFieldDavid.setBounds(boundsDavidDate); 
    dateFieldDavid.setIsRequired(true); 

    FormField textBoxField = new FormField(); 
    textBoxField.setFieldType(FormField.FieldTypeEnum.TEXT_BOX); 
    textBoxField.setPageNumber(1); 
    Rectangle boundsText = new Rectangle().x(202f).y(446.4f).width(400f).height(25f); 
    textBoxField.setBounds(boundsText); 
    textBoxField.setIsRequired(true); 


    textBoxField = new FormField(); 
    textBoxField.setFieldType(FormField.FieldTypeEnum.TEXT_BOX); 
    textBoxField.setPageNumber(1); 
    textBoxField.setIsRequired(true); 
    textBoxField.setBounds(new Rectangle().x(202f).y(446.4f).width(400f).height(25f)); 

    CollaborationSettings collabSettings = new CollaborationSettings(); 

    // Make it required for collaborators (not just the assignee). 
    collabSettings.setIsRequired(true); 

    // If someone edits after another signer has signed, trigger reapproval. 
    collabSettings.setRequireSignerApproval(true); 

    // Require collaborators to initial when they change the value. 
    collabSettings.setRequireInitial(true); 

    // Add *other* signer IDs who can collaborate (assignee is auto-included). 
    collabSettings.setAllowedSigners(Arrays.asList( 
        "550e8400-e29b-41d4-a716-446655440000" // Alice's signer ID 
    )); 

    //  Attach the collaboration settings to the field. 
    textBoxField.setCollaborationSettings(collabSettings); 
           // Alice's signer ID 

    DocumentSigner signerDavid = new DocumentSigner(); 
    signerDavid.setId("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); 
    signerDavid.setName("David"); 
    signerDavid.setEmailAddress("david@cubeflakes.com "); 
    signerDavid.setSignerType(DocumentSigner.SignerTypeEnum.SIGNER); 
    signerDavid.setFormFields(Arrays.asList(signatureFieldDavid, dateFieldDavid, textBoxField)); 

    // ── Alice's fields  
    FormField signatureFieldAlice = new FormField(); 
    signatureFieldAlice.setFieldType(FormField.FieldTypeEnum.SIGNATURE); 
    signatureFieldAlice.setPageNumber(1); 
    Rectangle boundsAliceSig = new Rectangle().x(553.2f).y(644f).width(200f).height(25f); 
    signatureFieldAlice.setBounds(boundsAliceSig); 

    FormField dateFieldAlice = new FormField(); 
    dateFieldAlice.setFieldType(FormField.FieldTypeEnum.DATE_SIGNED); 
    dateFieldAlice.setPageNumber(1); 
    Rectangle boundsAliceDate = new Rectangle().x(527.5f).y(713.4f).width(200f).height(25f); 
    dateFieldAlice.setBounds(boundsAliceDate); 
    dateFieldAlice.setIsRequired(true); 

    DocumentSigner signerAlice = new DocumentSigner(); 
    signerAlice.setId("550e8400-e29b-41d4-a716-446655440000"); 
    signerAlice.setName("Alice"); 
    signerAlice.setEmailAddress("alice@cubeflakes.com "); 
    signerAlice.setSignerType(DocumentSigner.SignerTypeEnum.SIGNER); 
    signerAlice.setFormFields(Arrays.asList(signatureFieldAlice, dateFieldAlice)); 

    // ── Prepare and send the document. 
    SendForSign sendForSign = new SendForSign(); 
    File file = new File("Your file path.pdf");// Replace with actual path, e.g. "C:\\docs\\nda.pdf" 
    sendForSign.setFiles(Arrays.asList(file)); 
    sendForSign.setSigners(Arrays.asList(signerDavid, signerAlice)); 
    sendForSign.setTitle("Non Disclosure Agreement"); 

    DocumentCreated documentCreated = documentApi.sendDocument(sendForSign); 

    // Optional: Print success info. 
    System.out.println("Document sent successfully: " + documentCreated); 
        } 
    } 
Enter fullscreen mode Exit fullscreen mode

Node js

    import { DocumentApi, DocumentSigner, FormField, Rectangle, SendForSign, CollaborationSettings } from "boldsign"; 
    import * as fs from "fs"; 

    async function sendDocument() { 
      const documentApi = new DocumentApi(); 
      documentApi.setApiKey("YOUR API KEY"); 


      // Signature field (David) 
      const davidSignatureBounds = new Rectangle(); 
      davidSignatureBounds.x = 166.6; 
      davidSignatureBounds.y = 645.1; 
      davidSignatureBounds.width = 200; 
      davidSignatureBounds.height = 25; 

      const davidSignatureField = new FormField(); 
      davidSignatureField.fieldType = FormField.FieldTypeEnum.Signature; 
      davidSignatureField.pageNumber = 1; 
      davidSignatureField.bounds = davidSignatureBounds; 

      // Date signed field (David)  
      const davidDateBounds = new Rectangle(); 
      davidDateBounds.x = 134.7; 
      davidDateBounds.y = 713.4; 
      davidDateBounds.width = 200; 
      davidDateBounds.height = 25; 

      const davidDateField = new FormField(); 
      davidDateField.fieldType = FormField.FieldTypeEnum.DateSigned; 
      davidDateField.pageNumber = 1; 
      davidDateField.bounds = davidDateBounds; 
      davidDateField.isRequired = true; 

      // TextBox field (David) - editable with collaboration settings 
      const davidTextboxBounds = new Rectangle(); 
      davidTextboxBounds.x = 202; 
      davidTextboxBounds.y = 446.4; 
      davidTextboxBounds.width = 400; 
      davidTextboxBounds.height = 25; 

      const davidTextboxField = new FormField(); 
      davidTextboxField.fieldType = FormField.FieldTypeEnum.TextBox; 
      davidTextboxField.pageNumber = 1; 
      davidTextboxField.bounds = davidTextboxBounds; 
      davidTextboxField.isEditable = true; 

      // Collaboration settings for David's text box. 
      const collab = new CollaborationSettings(); 
      collab.isRequired = true; 
      collab.requireSignerApproval = true; 
      collab.requireInitial = true; 
      collab.allowedSigners = ["450e8400-e29b-41d4-a416-446655440000"]; // Alice Id 

      davidTextboxField.collaborationSettings = collab; 

      // David signer 
      const documentSignerDavid = new DocumentSigner(); 
      documentSignerDavid.id ="4ba7b810-3dad-11d1-80b4-00c04fd430c8";; 
      documentSignerDavid.name = "David"; 
      documentSignerDavid.emailAddress = "david@cubeflakes.com"; 
      documentSignerDavid.signerType = DocumentSigner.SignerTypeEnum.Signer; 
      documentSignerDavid.formFields = [ 
        davidSignatureField, 
        davidDateField, 
        davidTextboxField, 
      ]; 

      // Signature field (Alice) 
      const aliceSignatureBounds = new Rectangle(); 
      aliceSignatureBounds.x = 553.2; 
      aliceSignatureBounds.y = 644; 
      aliceSignatureBounds.width = 200; 
      aliceSignatureBounds.height = 25; 

      const aliceSignatureField = new FormField(); 
      aliceSignatureField.fieldType = FormField.FieldTypeEnum.Signature; 
      aliceSignatureField.pageNumber = 1; 
      aliceSignatureField.bounds = aliceSignatureBounds; 

      // Date signed field (Alice)  
      const aliceDateBounds = new Rectangle(); 
      aliceDateBounds.x = 527.5; 
      aliceDateBounds.y = 713.4; 
      aliceDateBounds.width = 200; 
      aliceDateBounds.height = 25; 

      const aliceDateField = new FormField(); 
      aliceDateField.fieldType = FormField.FieldTypeEnum.DateSigned; 
      aliceDateField.pageNumber = 1; 
      aliceDateField.bounds = aliceDateBounds; 
      aliceDateField.isRequired = true; 

      // Alice signer 
      const documentSignerAlice = new DocumentSigner(); 
      documentSignerAlice.id ="450e8400-e29b-41d4-a416-446655440000"; 
      documentSignerAlice.name = "Alice"; 
      documentSignerAlice.emailAddress = "alice@cubeflakes.com"; 
      documentSignerAlice.signerType = DocumentSigner.SignerTypeEnum.Signer; 
      documentSignerAlice.formFields = [ 
        aliceSignatureField, 
        aliceDateField, 
      ]; 


      const files = fs.createReadStream("./Your File Path.pdf"); 

      const sendForSign = new SendForSign(); 
      sendForSign.title = "Agreement"; 
      sendForSign.signers = [documentSignerDavid, documentSignerAlice]; 
      sendForSign.files = [files]; 

      try { 
        const documentCreated = await documentApi.sendDocument(sendForSign); 
        console.log("Document sent successfully:", documentCreated); 
      } catch (error) { 
        console.error("Error sending document:", error); 
      } 
    } 

    sendDocument(); 
Enter fullscreen mode Exit fullscreen mode

In the previous code examples, the TextBox is set as a collaborative field for both signers. When they open the document and click on the field, a tooltip appears indicating that they are assigned as collaborators for that field.

Tooltip Content
Tooltip Content

Any changes made to the field are visible to both parties while re-signing the document.

Field change history
Field change history

What happens when a collaborative field changes after a signer has signed

What happens next depends on the CollaborationSettings you configure. For example, when both RequireSignerApproval and RequireInitial are enabled, the workflow behaves as follows:

  1. The signer must re‑approve (re‑sign) the document. Any modification to a collaborative field after a signer has completed their step triggers a new approval cycle.
  2. The signer must add their initials to validate the modification.
  3. The document returns to an “In Progress” state.
  4. All changes are recorded in the audit trail and document history.
  5. Notifications are sent to affected signers. Signers who previously signed are notified that changes were made and their re‑approval is required.

How are collaborative field changes tracked

BoldSign maintains a complete history of all collaborative activities through audit trails and document histories.

Audit trails 

The audit trail provides a summary of key events. It captures:

  • Field changes: Which field was modified, who made the change, and the exact time stamp.
  • Re-approval events: When the require-approval option triggers a re-sign, it logs who initiated the process and which recipients were asked to re-sign.

Audit Trail
Audit Trail

Document history

The document history offers a detailed breakdown of every change, including:

  • Which field was modified, who changed it, and when.
  • The original and changed values of the field.
  • Full details of the re-signing process, including who was asked to re-sign and when the request was sent.

Document history style
Document history

Field changes
Field changes

What notifications do signers receive when collaborative fields are updated

General notifications 

When approvals are required, any signer who has already completed the document will receive an email notification prompting them to re-sign after a collaborator makes a change.

Email notification
Email notification

Signing order notifications

If a signing order is enabled, the re-signing process follows the original sequence. After a change triggers re-approval, the re-sign request is sent to the first signer. Subsequent signers are notified that re-signing is pending, but they cannot access the document until the previous signer completes their re-signing.

Signing order notification
Signing order notification

What constraints and limitations apply to collaborative fields

Collaborative fields cannot be used under the following conditions:

Recipient

  • The document must have more than one recipient. Collaborative fields are not supported for single-signer or self-signed documents.
  • Collaborators cannot be in-person signers, group signers, or reviewers.

Feature

  • Collaborative settings are not compatible with:
  • Documents using print-and-sign.
  • Fields with data sync tags.
  • Fields with conditional logic.
  • Formula fields (collaborative fields cannot be part of a formula).

When should you use collaborative fields in multisigner API workflows

Here’s when to use collaborative fields effectively.

Use them when:

  • Multiple parties contribute to the same section.
  • Information evolves during negotiations.
  • One signer fills the details, another validates them.
  • Data depends on inputs from multiple departments.

Examples:

  • Contract scope descriptions.
  • Pricing or quote details.
  • Loan or application data.
  • Joint agreement clauses.

Conclusion

The collaborative field feature is a powerful tool for teams that rely on shared input and collective decision-making. By enabling multiple signers to contribute to a single field, BoldSign helps ensure that documents are not only signed but also accurate.

Ready to simplify your eSignature workflows? Try collaborative fields in BoldSign. Sign up for a free sandbox account and explore our developer documentation to learn more about our APIs.

We’d love to hear your thoughts—share your comments below! If you need any assistance, visit our support portal to connect with our team.

Related blogs

Note: This blog was originally published at boldsign.com 

Top comments (0)