0
votes

Another company we partner with sends us new client information via DocuSign envelopes completed by those clients. I am attempting to extract the form data from the document, either via the PDF or via the DocuSign API. The PDF only appears to have the Envelope ID embedded in it. When I add my account as a CC recipient and try to view the form data in the DocuSign console, I receive an error message:

Cannot access form data. You do not have the necessary permission to access this data.

Additionally, I'm unable to view the form data via the DocuSign API.

{
  errorCode: "USER_LACKS_PERMISSIONS",
  message: "This user lacks sufficient permissions to access this resource."
}

I've tried accessing via the API at:

  • /v2/accounts/{accountId}/envelopes/{envelopeId}/recipients/{recipientId}/tabs
  • /v2/accounts/{accountId}/envelopes/{envelopeId}/documents/{documentId}/fields

Questions:

  1. Is there a way for a user who is not in the sender's tenant to be able to view the envelope form data?
  2. Is there a way for DocuSign to embed the tab data into the PDF for extraction?
  3. Is there another approach I'm not considering?
2
Hi @charis, Check out this support blog post to resolve: support.docusign.com/en/articles/…sssurii
Hi @sssurii - at the time the user did have the appropriate permissions. If something changed on the DocuSign API side to allow this now with that permission, that would be good. As this issue is long past, I'm not currently set up to check it again, and I was able to work around it with the SOAP API. Thanks!Chris Romp

2 Answers

0
votes

If the user is cc to the envelope using the same userId and email combination that is on their account, then that user also can use the API to gain account information. (account is what you call "tenant.")

If the user is not on the envelope and you just receive the PDF some other way, then you cannot use the API to obtain information about the envelope because that is limited only to recipients of the envelope.

0
votes

@Inbar-Gazit was kind enough to do some digging internally at DocuSign, and after a bit of back-and-forth, discovered that this is possible using the SOAP API with the RequestEnvelope and RequestEnvelopeV2 methods. I'm unsure if there's any advantage to using one method over the other. Both also have async methods.

https://developers.docusign.com/docs/esign-soap-api/reference/Status-and-Managing-Group/RequestEnvelope

Some quick-and-dirty C# validated that this will indeed work. I validated this both as the sending account (which also works via REST) and the CC recipient account (which did not work via REST).

var authString = $"<DocuSignCredentials><Username>{_userName}</Username><Password>{_password}</Password><IntegratorKey>{_apiKey}</IntegratorKey></DocuSignCredentials>";

var client = new DSAPIServiceSoapClient();

using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
    HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
    httpRequestProperty.Headers.Add("X-DocuSign-Authentication", authString);
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;

    EnvelopeStatus status = client.RequestStatusEx(_envelopeId);
    Console.Out.WriteLine("Subject: " + status.Subject);

    // RequestEnvelope Method
    var envelope = client.RequestEnvelope(_envelopeId, false);
    var testTab = envelope.Tabs.FirstOrDefault(t => t.TabLabel.Contains("Test"));
    if (testTab != null)
    {
        Console.WriteLine($"Tab {testTab.TabLabel}: {testTab.Value}");
    } else
    {
        Console.WriteLine("Tab not found.");
    }

    // RequestEnvelopeV2 Method
    var requestOptions = new RequestEnvelopeV2Options() {
        IncludeAC = false,
        IncludeAnchorTabLocations = true,
        IncludeDocumentBytes = false
    };
    var envelopeV2 = client.RequestEnvelopeV2(_envelopeId, requestOptions);
    var testTabV2 = envelopeV2.Tabs.FirstOrDefault(t => t.TabLabel.Contains("Test"));
    if (testTabV2 != null)
    {
        Console.WriteLine($"Tab(v2) {testTabV2.TabLabel}: {testTabV2.Value}");
    } else
    {
        Console.WriteLine("Tab(v2) not found.");
    }

    Console.WriteLine("\r\nDone.");
    Console.ReadKey();
}

Output:

Subject: Please DocuSign: Test Envelope
Tab txtDataLabelTest1: Some Data Here
Tab(v2) txtDataLabelTest1: Some Data Here

Done.