--- title: "Completion Report" slug: "completion-report" updated: 2025-07-31T14:05:03Z published: 2025-07-31T14:05:03Z canonical: "docs.onespan.com/completion-report" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.onespan.com/llms.txt > Use this file to discover all available pages before exploring further. # Completion Report [Java SDK](/v1/docs/completion-report#java-sdk) [.NET SDK](/v1/docs/completion-report#net-sdk) [REST API](/v1/docs/completion-report#rest-api) [APEX SDK](/v1/docs/completion-report#apex-sdk) ## Java SDK To download the full code sample see our [Code Share](https://community.onespan.com/documentation/onespan-sign/codeshare/completion-report-example-java-sdk/) site. It is strongly recommended that you use a [Callback Listener](/v1/docs/creating-a-callback-notification-listener) instead of polling for transaction statuses. The use of polling may consume unnecessary resources on both your end, and on the OneSpan Sign service. A Completion Report contains information about your senders, their associated packages, and their package status. The maximum number of records that will be returned is 100. ### Retrieving a Completion Report You can retrieve the completion report using the OneSpan Sign ReportService. You will need the package status and the date range you want to retrieve. ```java // Download the completion report for all senders CompletionReport sdkCompletionReport = eslClient.getReportService().downloadCompletionReport(PackageStatus.DRAFT, from, to); if (sdkCompletionReport == null) {    System.out.println("\nNo packages in DRAFT folder"); } else {    // Display package id and name of packages in DRAFT from sender    System.out.println();    for (SenderCompletionReport senderCompletionReport : sdkCompletionReport.getSenders()) {        System.out.print("Sender: " + senderCompletionReport.getSender().getEmail());        System.out.println(" has " + senderCompletionReport.getPackages().size() + " packages in DRAFT");        for (PackageCompletionReport packageCompletionReport : senderCompletionReport.getPackages()) {            System.out.println(packageCompletionReport.getId() + " , " + packageCompletionReport.getName() + " , Sender : " + eslClient.getPackage(new PackageId(packageCompletionReport.getId())).getSenderInfo().getEmail());        }    } } ``` This sample code will search through each sender completion report and return the following: - the sender email - the number of packages in a DRAFT status - the package id and the name of every package in a DRAFT status. You can also download this report in CSV format, by using the following code: ```java // Download the completion report as a CSV for all senders String sdkCompletionReportCSV = eslClient.getReportService().downloadCompletionReportAsCSV(PackageStatus.DRAFT, from, to); ``` ### Results Here is an example of what you can expect to see once you have run your code. ![](https://cdn.document360.io/038f59a7-abd0-4c14-9de7-3434d28b49fd/Images/Documentation/completionreport-1(1).png?sv=2026-02-06&spr=https&st=2026-11-04T08%3A24%3A39Z&se=2026-11-04T09%3A24%3A39Z&sr=c&sp=r&sig=ZKau1VAxLy4Ya1FSltO%2FJ7DMsoNXYdMo%2FSmhjRBCW%2B0%3D) ## .NET SDK To download the full code sample see our [Code Share](https://community.onespan.com/documentation/onespan-sign/codeshare/completion-report-example-net-sdk/) site. It is strongly recommended that you use a [Callback Listener](/v1/docs/creating-a-callback-notification-listener) instead of polling for transaction statuses. The use of polling may consume unnecessary resources on both your end, and on the OneSpan Sign service. A Completion Report contains information about your senders, their associated packages, and their package status. The maximum number of records that will be returned is 100. ### Retrieving a Completion Report You can retrieve the completion report using the OneSpan Sign ReportService. You will need the package status and the date range you want to retrieve. ```csharp // Download the completion report for all senders CompletionReport sdkCompletionReport = eslClient.ReportService.DownloadCompletionReport(PackageStatus.DRAFT, from, to); if (sdkCompletionReport == null) {    Debug.WriteLine("\nNo packages in DRAFT folder"); } else {    // Display package id and name of packages in DRAFT from sender    Debug.WriteLine("");    foreach (SenderCompletionReport senderCompletionReport in sdkCompletionReport.Senders) {        Debug.WriteLine("Sender: " + senderCompletionReport.Sender.Email);        Debug.WriteLine(" has " + senderCompletionReport.Packages.Count + " packages in DRAFT");        foreach (PackageCompletionReport packageCompletionReport in senderCompletionReport.Packages) {            Debug.WriteLine(packageCompletionReport.Id + " , " + packageCompletionReport.Name + " , Sender : " + eslClient.GetPackage(new PackageId(packageCompletionReport.Id)).SenderInfo.Email);        }    } } ``` This sample code will search through each sender completion report and return the following: - the sender email - the number of packages in a DRAFT status - the package id and the name of every package in a DRAFT status. You can also download this report in CSV format, by using the following code: ```csharp // Download the completion report as a CSV for all senders String sdkCompletionReportCSV = eslClient.ReportService.DownloadCompletionReportAsCSV(PackageStatus.DRAFT, from, to); ``` ### Results Here is an example of what you can expect to see once you have run your code. ![](https://cdn.document360.io/038f59a7-abd0-4c14-9de7-3434d28b49fd/Images/Documentation/completionreport-1(1).png?sv=2026-02-06&spr=https&st=2026-11-04T08%3A24%3A39Z&se=2026-11-04T09%3A24%3A39Z&sr=c&sp=r&sig=ZKau1VAxLy4Ya1FSltO%2FJ7DMsoNXYdMo%2FSmhjRBCW%2B0%3D) ## REST API To download the full code sample see our [Code Share](https://community.onespan.com/documentation/onespan-sign/codeshare/completion-report-example-rest-api/) site. It is strongly recommended that you use a [Callback Listener](/v1/docs/creating-a-callback-notification-listener) instead of polling for transaction statuses. The use of polling may consume unnecessary resources on both your end, and on the OneSpan Sign service. A Completion Report contains information about your senders, their associated packages, and their package status. The maximum number of records that will be returned is 100. ### Retrieving a Completion Report You can retrieve the completion report using the OneSpan Sign ReportService. You will need the package status and the date range you want to retrieve. When running a query to return completed transactions within a specific timeframe, note that transactions which were updated outside of that timeframe (for example, trashed and reinstated) will not be included in the results. For example, if you run an API completion report for transactions completed on January 30th, but a transaction was completed on that date and updated on February 12th, it will not appear in the original query. To include such transactions, you would need to re-run the query with an updated time range that encompasses the date of the update #### HTTP Request ```http GET /api/reports/completion?status={status}&from={date}&to={date} ``` #### HTTP Headers ```http Accept: application/json   Content-Type: application/json Authorization: Basic api_key ``` #### Response Payload ```json {  "from": "2017-11-15T00:00:00Z",  "senders": [    {      "sender": {        "status": "ACTIVE",        "language": "en",        "signature": {          "handdrawn": "AQAAADJI+a4cnf0t3Dlf0GqWJceCA+4AAwADAN8BAAADAAAAggPuAOgAAAACfyxAUkAlQCdAOUA6QDtAHEAtQBtACkAJQBVAFBIyfkA0QBVABkAYQCpAHEAtQC9ALkAtQDxAO0A6QEhAN0AlQCQyTjZAgEBwQIBAoFDSUOFQ8lDiUNJQ0lCiQHBAUCIXGVBSUCVQN1BJUDpQXVA9UE5QLlAuUDpQOVAkm1BhQLZAd0B7QFpAXUBPQTBAHkAdQAtAB2AmYBRgQmCAcJVwmHC5Mh42QFBAkECAQKBAsEDAQNBQ8VDyUPJQ81DTULRQg1ByUEGeIgQ6QDhAJ0AmQCZAFItwbHBtMhdBUCafUGJQcVCSUJFQoUDAQKBAsECBQHNAdEBEQDRABkAFYCdgR2BXYHhgd2CIYIVgdmBDYEJAUUBwQIFAkECwQLBA0EDAQLBAoEBwQGASG0xAc0BnQEhASkArQBxADEAKQAlABkAFMkVKUENQUVBBUGFQYVCRUKJQsVDCUNJQsUDQQKBAkEBwQFJAREAlIllVUHFQUVByUKFQslDSUNJQ9VDlUPZQ1lDWUKVQZVBEUCQyCxivr2BjYGRgdGB1YHZgZmBWYEdgRkAFQClAREBjQJNAk0CzQKNAs0CjQJNAQo9gRWBjYJNgs2DCYNRg1GCkYKRgY2Bkrg==",          "textual": null        },        "id": "ZQI8k6faVoM8",        "data": {          "serviceCredentials": "{}",          "showIntro": false        },        "account": null,        "title": null,        "external": null,        "updated": "2016-05-05T19:30:13Z",        "memberships": [],        "phone": "+1 201-555-5555",        "professionalIdentityFields": [],        "userCustomFields": [          {            "id": "policy_number_id",            "data": null,            "translations": [              {                "description": "Car Insurance Policy Number.",                "language": "en",                "id": "",                "data": null,                "name": "Policy Number"              }            ],            "value": "",            "name": ""          }        ],        "locked": null,        "activated": null,        "company": "eSignLive",        "email": "harishaidary@example.com",        "firstName": "Haris",        "lastName": "Haidary",        "type": "MANAGER",        "name": "",        "address": null,        "created": "2016-05-05T19:30:13Z",        "specialTypes": [],        "hasDelegates": false      },      "packages": [        {          "status": "DRAFT",          "id": "J5Hk-r1nLXx7HIHGcmAGdQGdNI0=","data": {            "origin": "api"          },          "documents": [            {              "id": "contract",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "name": "Sample Contract"            }          ],          "trashed": false,          "updated": "2017-11-16T16:53:01Z",          "created": "2017-11-16T15:38:34Z",          "name": "PHP Application Example",          "signers": [            {              "id": "Signer1",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Smith",              "email": "mail72@example.com",              "firstName": "John"            },            {              "id": "ZQI8k6faVoM8",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Haidary",              "email": "harishaidary@example.com",              "firstName": "Haris"            },            {              "id": "Sender1",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Smith",              "email": "mail71@example.com",              "firstName": "Mike"            },            {              "id": "Signer5",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Smith",              "email": "mail32@example.com",              "firstName": "John"            }          ]        },        {          "status": "DRAFT",          "id": "aJK-4tCe5YQN6K2VDAOQk94jnLA=","data": {            "senderVisible": false          },          "documents": [],          "trashed": false,          "updated": "2017-11-16T15:16:04Z",          "created": "2017-11-16T15:15:42Z",          "name": "test",          "signers": [            {              "id": "ZQI8k6faVoM8",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Haidary",              "email": "harishaidary@example.com",              "firstName": "Haris"            }          ]        },        {          "status": "OPTED_OUT",          "id": "r1KxVEVhWgnKVZMYkjJR9I6fqjY=","data": {            "sdk": "Java v11.8",            "origin": "api"          },          "documents": [            {              "id": "aee1629e700a37ded7d4e6a9e32335447f8db6fd79bf74e6",              "firstSigned": null,              "lastSigned": null,              "completed": false,              "name": "test doc"            }          ],          "trashed": false,          "updated": "2017-11-15T17:49:37Z",          "created": "2017-11-15T16:13:52Z",          "name": "Package with Initials and Fullname",          "signers": [            {              "id": "Signer1",              "firstSigned": null,              "lastSigned": null,              "completed": false,              "lastName": "Smith",              "email": "mail32@example.com",              "firstName": "John"            },            {              "id": "ZQI8k6faVoM8",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Haidary",              "email": "harishaidary@example.com",              "firstName": "Haris"            }          ]        },        {          "status": "DRAFT",          "id": "wkfRigOpypHA2q1HLpHiaTLjoMc=","data": {            "sdk": "Java v11.8",            "origin": "api"          },          "documents": [            {              "id": "5e7c8c233a647df3e61a9d4864f7ebca5fe0f8feeb9b7a72",              "firstSigned": null,              "lastSigned": null,              "completed": false,              "name": "test doc"            }          ],          "trashed": false,          "updated": "2017-11-15T16:21:23Z",          "created": "2017-11-15T16:21:21Z",          "name": "Package with Initials and Fullname",          "signers": [            {              "id": "ZQI8k6faVoM8",              "firstSigned": null,              "lastSigned": null,              "completed": null,              "lastName": "Haidary",              "email": "harishaidary@example.com",              "firstName": "Haris"            },            {              "id": "Signer1",              "firstSigned": null,              "lastSigned": null,              "completed": false, ``` You can also download the completion report in CSV format, by setting the Accept header to text/csv: ```json GET https://sandbox.esignlive.com/api/reports/completion ``` ### Results Here is an example of what you can expect to see once you have run your code. ![](https://cdn.document360.io/038f59a7-abd0-4c14-9de7-3434d28b49fd/Images/Documentation/completionreport-1(1).png?sv=2026-02-06&spr=https&st=2026-11-04T08%3A24%3A39Z&se=2026-11-04T09%3A24%3A39Z&sr=c&sp=r&sig=ZKau1VAxLy4Ya1FSltO%2FJ7DMsoNXYdMo%2FSmhjRBCW%2B0%3D) ## APEX SDK To download the full code sample see our [Code Share](https://community.onespan.com/documentation/onespan-sign/codeshare/completion-report-example-apex-sdk/) site. It is strongly recommended that you use a [Callback Listener](/v1/docs/creating-a-callback-notification-listener) instead of polling for transaction statuses. The use of polling may consume unnecessary resources on both your end, and on the OneSpan Sign service. A Completion Report contains information about your senders, their associated packages, and their package status. The maximum number of records that will be returned is 100. ### Retrieving a Completion Report You can retrieve the completion report using the OneSpan SignReportService. You will need the package status, the date range you want to retrieve (yyyy-mm-dd), and the sender ID. This will associate the completion report with a specific sender. To retrieve a completion report for all senders, set the sender ID to null. The function allowing you to retrieve the completion report is encapsulated like below: ```plaintext // Method to download the completion report public TestCompletionReport.CompletionReport downloadCompletionReport(    ESignLiveAPIObjects.PackageStatus packageStatus,    String from_x,    String to,    String senderId ) {    // Your implementation here } ``` ```plaintext // Download the completion report for sent packages TestCompletionReport.CompletionReport completionReport = downloadCompletionReport(    ESignLiveAPIObjects.PackageStatus.SENT, '2018-10-01', null, null ); // Iterate through the sender completion reports for (TestCompletionReport.SenderCompletionReport senderCompletionReport : completionReport.senders) {    System.debug('Sender: ' + senderCompletionReport.sender.email + ' has ' + senderCompletionReport.packages.size() + ' packages in SENT');        // Iterate through the package completion reports for each sender    for (TestCompletionReport.PackageCompletionReport packageCompletionReport : senderCompletionReport.packages) {        System.debug('package id: ' + packageCompletionReport.id + ' , package name: ' + packageCompletionReport.name);    } } ``` This sample code will search through each sender completion report and return the following: - the sender email - the number of packages in a SENT status - the package id and the name of every package in a SENT status. You can also download this report in CSV format, by using the following code: ```plaintext // Method to download the completion report as a CSV public Blob downloadCompletionReportAsCSV(    ESignLiveAPIObjects.PackageStatus packageStatus,    String from_x,    String to,    String senderId ) {    // Your implementation here } ``` ### Results Here is an example of what you can expect to see once you have run your code. ![](https://cdn.document360.io/038f59a7-abd0-4c14-9de7-3434d28b49fd/Images/Documentation/completion-report.png?sv=2026-02-06&spr=https&st=2026-11-04T08%3A24%3A39Z&se=2026-11-04T09%3A24%3A39Z&sr=c&sp=r&sig=ZKau1VAxLy4Ya1FSltO%2FJ7DMsoNXYdMo%2FSmhjRBCW%2B0%3D)