0 votes
1 view
in Salesforce by (11.3k points)

I am using Docusign API Integration to Salesforce. I have a requirement to update the data field tag in a document by calling the Docusign API from Salesforce after it has been sent for signature.

Let's say the routing order of signers is from signer 1 to signer 4. Initially, the value of that data field tag will be null. After signer 3 "completed" his signature, I have to trigger the API call from Salesforce and update the tag with the value which is retrieved from custom field value of an object in Salesforce. Then Signer 4 will be able to see the value in the data field tag before he signs the document.

I used Merge fields for DocuSign to import the Salesforce data into that tag. But as I said before, initial value will be null (because the salesforce data of that merge field will also be null at that time) and I have to "halt" the signing process, update the tag and then continue to remaining signer.

Is there any way that I could "refresh" the envelope so that the value in the data field tag gets updated?

Will DocuSign allow to update the tag values in the document with Salesforce data through API callouts after the envelope is sent?

Note that I have read the Modify tabs (tags) for Recipient article in Docusign RestAPI guide Version2. Is that for modifying tag types or tag values?

1 Answer

0 votes
by (28.6k points)

It is possible with Salesforce and DS but not the way you are going at it. I answered your question about background correct on the other question at Send (Load) a URL to web browser and run it in background in APEX

Merge fields are part of the question, but they are only shown as the value when "SENT" and update Salesforce only when the envelope is COMPLETED successfully, so really this is only a half solution for your scenario.

So here is what I have done for another DocuSign Client as a sample of how to do this, but please reach out to your DocuSign Account Manager as I think if you are doing these types of advanced workflows you could benifit from DocuSign's Profession Services Group which I am apart of.

1. Components added: 

    DocuSign Connect Object - dseRecipientConnectUpdate

    custom Object - dseRecipientConnectUpdate__c​

    Trigger - dseRCU_AfterUpdate​

    Class - desController (in Sandbox and code below as well)

    Class - CheckRecursive (in sandbox and code below as well)

    DS Template Example -Agreement with ContractID  960BD14E-6A09-4A9E-89E6-77B1D8444B72

2. What you need yet to do

    Replace Send on Behalf user with Sender of envelope via code (hard Coded as [email protected] in code) lookup using envelopeID in DocuSign Status and get sender, then lookup in user that sender's email

    Classify any stringified body's you want

    Error Condition handling

    Test Classes

    Testing, Testing, testing

How I tested:

    0. Turn on debugging for API user and Myself

    a. Sent Envelope from Template

    b. Signed the first three recipients 

    c. Code updated the dseRecipientConnectUpdate__c​ record (a36) that was the autoresponse blocking user aka just changed record by editing but no real change, then save.

    d. It would then fire trigger again (as mentioned you will need to change the send on behalf of user to automatically for final code to be sending user, but you can make it your email you send envelope by) and it will read recipients, get the contract id recipient and tab, add new recipient and tab with value, delete old reciepents (tag recipient and blocking)

Salesforce Custom Object:

<?xml version="1.0" encoding="UTF-8"?>
    <!--actionoverrides removed for sake of SO answer size/>
    <compactLayoutAssignment>SYSTEM</compactLayoutAssignment>
    <deploymentStatus>Deployed</deploymentStatus>
    <description>DocuSign Recipient Connect Update</description>
    <enableActivities>true</enableActivities>
    <enableFeeds>false</enableFeeds>
    <enableHistory>true</enableHistory>
    <enableReports>true</enableReports>
    <fields>
        <fullName>RecipStatus__c</fullName>
        <externalId>false</externalId>
        <label>RecipStatus</label>
        <length>50</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>RecipientEmail__c</fullName>
        <description>Recipient Email</description>
        <externalId>false</externalId>
        <label>RecipientEmail</label>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Email</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>RecipientID__c</fullName>
        <externalId>false</externalId>
        <label>RecipientID</label>
        <length>50</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <fields>
        <fullName>dsEnvelopeID__c</fullName>
        <description>dsfs__DocuSign_Envelope_ID__c</description>
        <externalId>false</externalId>
        <label>dsEnvelopeID</label>
        <length>56</length>
        <required>false</required>
        <trackHistory>false</trackHistory>
        <trackTrending>false</trackTrending>
        <type>Text</type>
        <unique>false</unique>
    </fields>
    <label>dseRecipientConnectUpdate</label>
    <listViews>
        <fullName>All</fullName>
        <filterScope>Everything</filterScope>
        <label>All</label>
    </listViews>
    <nameField>
        <displayFormat>dseRCU-{0000000000}</displayFormat>
        <label>dseRecipientConnectUpdate Name</label>
        <trackHistory>false</trackHistory>
        <type>AutoNumber</type>
    </nameField>
    <pluralLabel>dseRecipientConnectUpdates</pluralLabel>
    <recordTypeTrackHistory>false</recordTypeTrackHistory>
    <recordTypes>
        <fullName>dseRecipientConnectUpdate</fullName>
        <active>true</active>
        <description>dseRecipientConnectUpdate</description>
        <label>dseRecipientConnectUpdate</label>
    </recordTypes>
    <searchLayouts/>
    <sharingModel>ReadWrite</sharingModel>
</CustomObject>

Trigger ==========

trigger dseRCU_AfterUpdate on dseRecipientConnectUpdate__c (after update) {
    try
    {
        if (CheckRecursive.runOnce())
        {   
            List<dseRecipientConnectUpdate__c> myConnectUpdates = [Select d.dsEnvelopeID__c, d.RecipientID__c, d.RecipientEmail__c, d.RecipStatus__c, d.Id From dseRecipientConnectUpdate__c d WHERE Id IN:Trigger.newMap.keySet()];
            for(dseRecipientConnectUpdate__c myConnectCompleted :myConnectUpdates)
            {
                system.debug(myConnectCompleted.Id);
                if(myConnectCompleted.RecipStatus__c.indexOf('AutoResponded') != -1)
                {
                    system.debug(myConnectCompleted.RecipStatus__c);
                        //Looking for bounce back user via status AutoResponded  and  @accelrys.com emails/recipients
                        if(myConnectCompleted.RecipientEmail__c.indexOf('[email protected]') != -1)
                        {
                          //do modification to envelope here
                          dseController.updateEnvelope(myConnectCompleted.dsEnvelopeID__c, myConnectCompleted.RecipientID__c);
                        }
                }
            }
        }
    }
    catch(Exception ex)
    {
        system.debug(ex);
    }
    finally
    {
    }  
}

Class ==========

public with sharing class dseController {
    public dseController()
    {
    }
    public dseController(ApexPages.StandardController controller)
    {
    } 
    @future (callout=true)
    public static void updateEnvelope( string envelopeID, string recipientID )
    {
    RecipientResponse RecipientResponseDeserialized = new RecipientResponse();
    RecipientTabResponse RecipientTabResponseDeserialized = new RecipientTabResponse();
    string rResponse = '{}';
    string recipientGuidwithContractTab;
    string recipientGuidForBlockingRecipient;
    string rTabResponse = '{}';
    string rSetRecipientResponse = '{}';
    string rSetTabForRecipientResponse = '{}';
    string rTabRecipientDeleteResponse = '{}';
    string rBlockingRecipientDeleteResponse = '{}';
    try
    {
//Call to get envelope recipients
rResponse = getEnvelopeRecipients(envelopeID);
system.debug(rResponse);
RecipientResponseDeserialized = parseRecipentResponse(rResponse);
system.debug(RecipientResponseDeserialized);
recipientGuidwithContractTab = getRecipientwithContractTab(RecipientResponseDeserialized);
system.debug(recipientGuidwithContractTab);
//Call to get recipient tab
rTabResponse = getRecipientTab(envelopeID, recipientGuidwithContractTab);
system.debug(rTabResponse);
RecipientTabResponseDeserialized = parseRecipientTabResponse(rTabResponse);
system.debug(RecipientTabResponseDeserialized);
//Call to add recipient with new id
rSetRecipientResponse = setRecipientForNewTab(envelopeID,RecipientResponseDeserialized);
system.debug(rSetRecipientResponse);
//Call to add tab to new recipient with new id
rSetTabForRecipientResponse = setNewTabforNewRecipient(envelopeID,RecipientTabResponseDeserialized);
system.debug(rSetTabForRecipientResponse);
//Call to delete old clone recipient
rTabRecipientDeleteResponse = deleteRecipientTab(envelopeID, recipientGuidwithContractTab);
system.debug(rTabRecipientDeleteResponse);
//Call to delete blocking user
recipientGuidForBlockingRecipient = getBlockingRecipient(RecipientResponseDeserialized);
rBlockingRecipientDeleteResponse = deleteBlockingRecipient(envelopeID, recipientGuidForBlockingRecipient);
system.debug(rBlockingRecipientDeleteResponse);
    }
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }    
    }
    public static string getRecipientwithContractTab(RecipientResponse rResponse)
    {
    string rContractTabID = 'Not Found';
    try{
    List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'ContractIDApprover')
    {
    rContractTabID = mySigner.recipientIdGuid;
    }
    }
    }
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        } 
        return rContractTabID;
    }
    public static string getBlockingRecipient(RecipientResponse rResponse)
    {
    string rContractTabID = 'Not Found';
    try{
    List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'BlockingUser')
    {
    rContractTabID = mySigner.recipientIdGuid;
    }
    }
    }
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        } 
        return rContractTabID;
    }
    public static string getEnvelopeRecipients(string envelopeID)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients');
request.setMethod('GET');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    }
    public static string getRecipientTab(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid+'/tabs/');
request.setMethod('GET');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>[email protected]</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    }
    public static string setRecipientForNewTab(string envelopeID, RecipientResponse rResponse)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
Signer mySignerToAdd = new Signer();
List<Signer> mySigners = rResponse.signers;
    for(Signer mySigner : mySigners)
    {
    if(mySigner.roleName == 'ContractIDApprover')
    {
    mySignerToAdd = mySigner;
    }
    }
    String myBody;
    myBody = '{"signers": [{"signInEachLocation": "false","name": "'+mySignerToAdd.name +'Added 1","email": "'+mySignerToAdd.email+'","recipientId": "7","requireIdLookup": "false","routingOrder": "19","roleName": "'+mySignerToAdd.roleName+'1"}]}';
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>[email protected]</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
request.setBody(myBody);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='201')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    }
     public static string setNewTabforNewRecipient(string envelopeID, RecipientTabResponse rTabResponse)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
TextTabs myTextTabToAdd = new TextTabs();
List<TextTabs> myTextTabs = rTabResponse.textTabs;
    for(TextTabs myTextTab : myTextTabs)
    {
    if(myTextTab.tabLabel == 'ContractID')
    {
    myTextTabToAdd = myTextTab;
    }
    }
    String myBody;
    myBody = '{"textTabs": [{"height": '+myTextTabToAdd.height+',"shared": "'+myTextTabToAdd.shared+'","requireInitialOnSharedChange": "'+myTextTabToAdd.requireInitialOnSharedChange+'","name": "'+myTextTabToAdd.name+'1","value": "ContractID12345","width": '+myTextTabToAdd.width+',"required": "'+myTextTabToAdd.required+'","locked": "'+myTextTabToAdd.locked+'","concealValueOnDocument": "'+myTextTabToAdd.concealValueOnDocument+'","disableAutoSize": "'+myTextTabToAdd.disableAutoSize+'","tabLabel": "'+myTextTabToAdd.tabLabel+'","documentId": "'+myTextTabToAdd.documentId+'","recipientId": "7","pageNumber": "'+myTextTabToAdd.pageNumber+'","xPosition": "'+myTextTabToAdd.xPosition+'","yPosition": "'+myTextTabToAdd.yPosition+'"}]}';
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/7/tabs');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>[email protected]</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
request.setBody(myBody);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='201')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    }
    public static string deleteRecipientTab(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid);
request.setMethod('DELETE');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>[email protected]</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    } 
        public static string deleteBlockingRecipient(string envelopeID, string recipientGuid)
    {
    string response = '{}';
    string DSEndpoint = 'https://demo.docusign.net/restapi/v2/';
    string DSUserId = 'yourdsUserid';
    string DSPassword = 'yourdspassword';
    string DSAccountID = 'yourdsaccountID';
    string DSIntegratorKey = 'yourdsintegratorkey';
    try
{
//FORCES that the DocuSign member has to be in the DocuSign account DSFS is configured for
List<dsfs__DocuSignAccountConfiguration__c> dsAccountConfig = [Select d.dsfs__UseSendOnBehalfOf__c, d.dsfs__DocuSignBaseURL__c, d.dsfs__DSProSFUsername__c, d.dsfs__DSProSFPassword__c, d.dsfs__AccountId__c From dsfs__DocuSignAccountConfiguration__c d limit 1];
for(dsfs__DocuSignAccountConfiguration__c myConfig : dsAccountConfig)
{
DSEndpoint = myConfig.dsfs__DocuSignBaseURL__c + 'restapi/v2/';
DSUserId = myConfig.dsfs__DSProSFUsername__c;
DSPassword = myConfig.dsfs__DSProSFPassword__c;
}
HttpRequest request = new HttpRequest();
request.setEndpoint(DSEndpoint + 'accounts/'+DSAccountID+'/envelopes/'+envelopeID+'/recipients/'+recipientGuid);
request.setMethod('DELETE');
request.setHeader('Content-Type', 'application/json');
request.setHeader('X-DocuSign-Authentication', '<DocuSignCredentials><Username>'+DSUserId+'</Username><Password>'+DSPassword+'</Password><SendOnBehalfOf>[email protected]</SendOnBehalfOf><IntegratorKey>'+DSIntegratorKey+'</IntegratorKey></DocuSignCredentials>');
request.setHeader('Accept', 'application/json');
request.setTimeout(120000);
system.debug(request.getHeader('X-DocuSign-Authentication'));
HttpResponse myResponse = (new Http()).send(request);
system.debug(myResponse.getBody());
if(myResponse.getStatusCode().format()=='200')
{  
response = myResponse.getBody();
system.debug(response);
}
}
catch(Exception ex)
        {
            system.debug(ex);
        }
        finally
        {
        }
        return response;
    }    
public static RecipientResponse parseRecipentResponse(String json) {
return (RecipientResponse) System.JSON.deserialize(json, RecipientResponse.class);
}
public static RecipientTabResponse parseRecipientTabResponse(String json) {
return (RecipientTabResponse) System.JSON.deserialize(json, RecipientTabResponse.class);
}
    public class Signer
    {
    public string name;
    public string email;
    public string recipientId;
    public string recipientIdGuid;
    public string requireIdLookup;
    public string userId;
    public string routingOrder;
    public string roleName;
    public string status;
    public string signedDateTime;
    public string deliveredDateTime;
    public string templateLocked;
    public string templateRequired;
    }
    public class RecipientResponse
    {
    public List<Signer> signers;
    public List<Signer> agents;
    public List<Signer> editors;
    public List<Signer> intermediaries;
    public List<Signer> carbonCopies;
    public List<Signer> certifiedDeliveries;
    public List<Signer> inPersonSigners;
    public String recipientCount;
    public String currentRoutingOrder;
    }
public class TextTabs {
public Integer height;
public String validationPattern;
public String validationMessage;
public String shared;
public String requireInitialOnSharedChange;
public String name;
public String value;
public Integer width;
public String required;
public String locked;
public String concealValueOnDocument;
public String disableAutoSize;
public String tabLabel;
public String documentId;
public String recipientId;
public String pageNumber;
public String xPosition;
public String yPosition;
public String tabId;
}
public class RecipientTabResponse 
{
public List<TextTabs> textTabs;
}
}
...