To download the full code sample see our Code Share site.

Templates and Layouts fulfill the same goal of automating the e-signature process by shortening the time it takes to send documents that include several signature blocks and data fields. Templates are ideal to use at the transaction level – you can pre-define your signers, documents, signature locations and e-signature workflows to streamline the e-signature process. A Layout on the other hand, is a type of template that allows you to create pre-defined locations for your signature blocks and data fields within a document. It acts like a ‘marker’ where signature blocks and data fields will sit in the document. Layouts are helpful for users who frequently send forms that may be slightly different per recipient but signature blocks and data fields remain in the same location throughout the document. What’s more, you can use multiple Layouts per document, and apply them to individual pages within your transaction.

Finding your Layouts in the UI

When editing documents, you will find all of your saved layouts under the toolbar, as shown below. Note that layouts can only be applied when transaction are in a Draft status.

Capture

Creating a New Layout

In this example, document extraction is used to extract the fields and save them as a layout. For more information, see Document Extraction.

After creating your transaction, use the OneSpan Sign LayoutService to create a layout from your transaction. It is important to note that the Layout ID is required to apply layouts to documents. The following code will do this:

 String layoutId = eslClient.getLayoutService().createLayout(myPackage);   System.out.println(layoutId); 

Retrieving a Layout

The following code will retrieve a layout. The first step is to retrieve the layouts from the first page. In this example, five layouts are retrieved, but you can set this to any number.

 List<DocumentPackage> layouts = eslClient.getLayoutService().getLayouts(Direction.DESCENDING, new PageRequest(i, 5));   while (!layouts.isEmpty()) {   // 

Next, you will create your iterator object. This will enable you to iterate through your list of layouts.

Iterator<DocumentPackage> index = layouts.iterator();   while (index.hasNext()) {   

Then, retrieve your layout name and id.

DocumentPackage myLayout = index.next();   System.out.println(myLayout.getName() + " " + myLayout.getId());   i++;   }   //    

Use the following code to retrieve layouts from each page in the transaction, repeating for every page:

layouts = eslClient.getLayoutService().getLayouts(Direction.DESCENDING, new PageRequest(i, 5));   } 

Applying Layouts

Use the OneSpan Sign LayoutService to apply layouts, by either Layout ID, or by name.

eslClient.getLayoutService().applyLayout(packageId, "documentId", "layoutId");   
eslClient.getLayoutService().applyLayoutByName(packageId, "documentId", "layoutName");  

Deleting a Layout

To delete a layout, use the PackageService(). The following code will do this:

 eslClient.getPackageService().deletePackage(new PackageId("layoutId")); 

Results

After running your code, you will see a list of all your layouts under the toolbar. Once your layout is saved, you can then apply it on subsequent documents.

To download the full code sample see our Code Share site.

Templates and Layouts fulfill the same goal of automating the e-signature process by shortening the time it takes to send documents that include several signature blocks and data fields. Templates are ideal to use at the transaction level – you can pre-define your signers, documents, signature locations and e-signature workflows to streamline the e-signature process. A Layout on the other hand, is a type of template that allows you to create pre-defined locations for your signature blocks and data fields within a document. It acts like a ‘marker’ where signature blocks and data fields will sit in the document. Layouts are helpful for users who frequently send forms that may be slightly different per recipient but signature blocks and data fields remain in the same location throughout the document. What’s more, you can use multiple Layouts per document, and apply them to individual pages within your transaction.

Finding your Layouts in the UI

When editing documents, you will find all of your saved layouts under the toolbar, as shown below. Note that layouts can only be applied when transaction are in a Draft status.

Capture

Creating a New Layout

In this example, document extraction is used to extract the fields and save them as a layout. For more information, see Document Extraction.

After creating your transaction, use the OneSpan Sign LayoutService to create a layout from your transaction. It is important to note that the Layout ID is required to apply layouts to documents. The following code will do this:

 string layoutId = eslClient.LayoutService.CreateLayout(packageFromLayout);   Debug.WriteLine(layoutId); 

Retrieving a Layout

The following code will retrieve a layout. The first step is to retrieve the layouts from the first page. In this example, five layouts are retrieved, but you can set this to any number.

 List<DocumentPackage> layouts = eslClient.getLayoutService().getLayouts(Direction.DESCENDING, new PageRequest(i, 5));   while (!layouts.isEmpty()) {   // 

Next, you will create your iterator object. This will enable you to iterate through your list of layouts.

Iterator<DocumentPackage> index = layouts.iterator();   while (index.hasNext()) {   

Then, retrieve your layout name and id.

DocumentPackage myLayout = index.next();   System.out.println(myLayout.getName() + " " + myLayout.getId());   i++;   }   //    

Use the following code to retrieve layouts from each page in the transaction, repeating for every page:

Applying Layouts

Use the OneSpan Sign LayoutService to apply layouts, by either Layout ID, or by name.

eslClient.getLayoutService().applyLayout(packageId, "documentId", "layoutId");   
eslClient.getLayoutService().applyLayoutByName(packageId, "documentId", "layoutName");  

Deleting a Layout

To delete a layout, use the PackageService(). The following code will do this:

 eslClient.PackageService.DeletePackage(new PackageId("layoutId")); 

Results

After running your code, you will see a list of all your layouts under the toolbar. Once your layout is saved, you can then apply it on subsequent documents.

To download the full code sample see our Code Share site.

Templates and Layouts fulfill the same goal of automating the e-signature process by shortening the time it takes to send documents that include several signature blocks and data fields. Templates are ideal to use at the transaction level – you can pre-define your signers, documents, signature locations and e-signature workflows to streamline the e-signature process. A Layout on the other hand, is a type of template that allows you to create pre-defined locations for your signature blocks and data fields within a document. It acts like a ‘marker’ where signature blocks and data fields will sit in the document. Layouts are helpful for users who frequently send forms that may be slightly different per recipient but signature blocks and data fields remain in the same location throughout the document. What’s more, you can use multiple Layouts per document, and apply them to individual pages within your transaction.

Finding your Layouts in the UI

When editing documents, you will find all of your saved layouts under the toolbar, as shown below. Note that layouts can only be applied when transaction are in a Draft status.

Capture

Creating a New Layout

In this example, document extraction is used to extract the fields and save them as a layout. For more information, see Document Extraction.

Use the following code to create a layout from a document:

HTTP Request

POST /api/layouts

HTTP Headers

Accept: application/json   
Content-Type: application/json   
Authorization: Basic api_key 

Request Payload

 {   "name":"Layout 02",   "type":"LAYOUT",   "id":"packageId",   "visibility":"SENDER",   "documents":[   {   "id":"documentId"   }   ]   } 

For a complete description of each field, see the Request Payload table below.

Response Payload

 {   "roles": [   {   "id": "bjyxbrypiHw6",   "data": null,   "emailMessage": null,   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SENDER",   "index": 0,   "signers": [   {   "group": null,   "language": "en",   "signature": {   "handdrawn": "AQAAADJI+a4cnf0t3Dlf0GqWJceCA+4AAwADAN8BAAADAAAAggPuAOgAAAACfyxAUkAlQCdAOUA6QDtAHEAtQBtACkAJQBVAFBIyfkA0QBVABkAYQCpAHEAtQC9ALkAtQDxAO0A6QEhAN0AlQCQyTjZAgEBwQIBAoFDSUOFQ8lDiUNJQ0lCiQHBAUCIXGVBSUCVQN1BJUDpQXVA9UE5QLlAuUDpQOVAkm1BhQLZAd0B7QFpAXUBPQTBAHkAdQAtAB2AmYBRgQmCAcJVwmHC5Mh42QFBAkECAQKBAsEDAQNBQ8VDyUPJQ81DTULRQg1ByUEGeIgQ6QDhAJ0AmQCZAFItwbHBtMhdBUCafUGJQcVCSUJFQoUDAQKBAsECBQHNAdEBEQDRABkAFYCdgR2BXYHhgd2CIYIVgdmBDYEJAUUBwQIFAkECwQLBA0EDAQLBAoEBwQGASG0xAc0BnQEhASkArQBxADEAKQAlABkAFMkVKUENQUVBBUGFQYVCRUKJQsVDCUNJQsUDQQKBAkEBwQFJAREAlIllVUHFQUVByUKFQslDSUNJQ9VDlUPZQ1lDWUKVQZVBEUCQyCxivr2BjYGRgdGB1YHZgZmBWYEdgRkAFQClAREBjQJNAk0CzQKNAs0CjQJNAQo9gRWBjYJNgs2DCYNRg1GCkYKRgY2Bkrg==",   "textual": null   },   "id": "8ceWLxUo1Gg1",   "delivery": {   "provider": false,   "email": true,   "download": true   },   "knowledgeBasedAuthentication": null,   "auth": {   "scheme": "NONE",   "challenges": []   },   "data": null,   "title": "Silanis",   "external": null,   "updated": "2017-11-14T20:31:34Z",   "phone": "",   "professionalIdentityFields": [],   "userCustomFields": [],   "company": "Silanis",   "email": "[email protected]",   "firstName": "Haris",   "lastName": "Haidary",   "name": "",   "address": null,   "created": "2017-11-14T20:31:34Z",   "specialTypes": []   }   ],   "name": "Owner"   },   {   "id": "a3bfe56c-da0a-4ff0-bfef-efe55fd28a0c",   "data": null,   "emailMessage": {   "content": ""   },   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SIGNER",   "index": 0,   "signers": [],   "name": "Signer1"   },   {   "id": "564fd009-7673-4a5f-9314-5c5b3d5f3869",   "data": null,   "emailMessage": {   "content": ""   },   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SIGNER",   "index": 0,   "signers": [],   "name": "Signer2"   }   ],   "status": "DRAFT",   "description": "",   "language": "en",   "id": "rr8lE3YwF-LaCNxSjntn2udM8hc=",   "data": {   "origin": "api"   },   "autocomplete": true,   "documents": [   {   "status": "",   "description": "",   "id": "dfe8ac46006b31f6",   "signedHash": null,   "extractionTypes": [],   "signerVerificationToken": null,   "data": {   "ese_document_texttag_extract_needed": "false"   },   "approvals": [   {   "id": "akmT717La0YP",   "role": "a3bfe56c-da0a-4ff0-bfef-efe55fd28a0c",   "data": null,   "signed": null,   "accepted": null,   "fields": [   {   "binding": null,   "validation": null,   "id": "AooaSEwkp0oG",   "page": 0,   "data": null,   "subtype": "FULLNAME",   "height": 40,   "extract": false,   "width": 200,   "extractAnchor": null,   "left": 94,   "top": 752,   "type": "SIGNATURE",   "value": "",   "name": "AooaSEwkp0oG"   }   ],   "name": "AooaSEwkp0oG"   },   {   "id": "anR9R3fLlQYE",   "role": "564fd009-7673-4a5f-9314-5c5b3d5f3869",   "data": null,   "signed": null,   "accepted": null,   "fields": [   {   "binding": null,   "validation": null,   "id": "AvqDbyKBeIoX",   "page": 0,   "data": null,   "subtype": "FULLNAME",   "height": 40,   "extract": false,   "width": 200,   "extractAnchor": null,   "left": 94,   "top": 833,   "type": "SIGNATURE",   "value": "",   "name": "AvqDbyKBeIoX"   }   ],   "name": "AvqDbyKBeIoX"   }   ],   "pages": [   {   "id": "",   "height": 1030,   "width": 796,   "left": 0,   "top": 0,   "version": 0,   "index": 0   }   ],   "external": null,   "extract": false,   "fields": [],   "index": 0,   "name": "cleaning_contract",   "size": 197171   }   ],   "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": "[email protected]",   "firstName": "Haris",   "lastName": "Haidary",   "type": "MANAGER",   "name": "",   "address": null,   "created": "2016-05-05T19:30:13Z",   "specialTypes": [],   "hasDelegates": false   },   "emailMessage": "",   "limits": null,   "notarized": false,   "notaryRoleId": null,   "settings": {   "ceremony": {   "layout": {   "header": {   "feedback": true,   "titleBar": null,   "breadcrumbs": true,   "globalActions": {   "confirm": true,   "download": true,   "hideEvidenceSummary": true,   "saveAsLayout": true   },   "globalNavigation": true,   "sessionBar": true   },   "footer": null,   "brandingBar": {   "logo": {   "link": "",   "src": "branding"   }   },   "iframe": false,   "navigator": true   },   "style": null,   "enforceCaptureSignature": false,   "events": {   "complete": {   "redirect": null,   "dialog": true   }   },   "extractAcroFields": true,   "extractTextTags": true,   "inPerson": false,   "declineButton": true,   "declineReasons": [],   "disableDeclineOther": false,   "disableDownloadForUncompletedPackage": false,   "disableFirstInPersonAffidavit": false,   "disableInPersonAffidavit": false,   "disableOptOutOther": false,   "disableSecondInPersonAffidavit": false,   "documentToolbarOptions": null,   "handOver": null,   "hideCaptureText": false,   "hideLanguageDropdown": false,   "hidePackageOwnerInPerson": false,   "hideWatermark": false,   "maxAuthFailsAllowed": 3,   "optOutButton": true,   "optOutReasons": []   }   },   "signedDocumentDelivery": null,   "trashed": false,   "updated": "2017-11-14T20:31:34Z",   "completed": null,   "consent": null,   "due": null,   "visibility": "SENDER",   "type": "LAYOUT",   "messages": [],   "name": "cleaning_contract",   "created": "2017-11-14T20:31:34Z",   "bulkSendable": true   } 

It is important to note that theLayout ID is required to apply layouts to documents.

Retrieving a Layout

You can also retrieve all of your saved layouts. The following code will do this:

HTTP Request

GET /api/layouts?from={fromPage}&to={toPage}

HTTP Headers

Accept: application/json   
Content-Type: application/json   
Authorization: Basic api_key 

Response Payload

 {   "results": [   {   "roles": [   {   "id": "564fd009-7673-4a5f-9314-5c5b3d5f3869",   "data": null,   "emailMessage": {   "content": ""   },   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SIGNER",   "index": 0,   "signers": [],   "name": "Signer2"   },   {   "id": "a3bfe56c-da0a-4ff0-bfef-efe55fd28a0c",   "data": null,   "emailMessage": {   "content": ""   },   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SIGNER",   "index": 0,   "signers": [],   "name": "Signer1"   },   {   "id": "bjyxbrypiHw6",   "data": null,   "emailMessage": null,   "attachmentRequirements": [],   "locked": false,   "reassign": false,   "specialTypes": [],   "type": "SENDER",   "index": 0,   "signers": [   {   "group": null,   "language": "en",   "signature": {   "handdrawn": "AQAAADJI+a4cnf0t3Dlf0GqWJceCA+4AAwADAN8BAAADAAAAggPuAOgAAAACfyxAUkAlQCdAOUA6QDtAHEAtQBtACkAJQBVAFBIyfkA0QBVABkAYQCpAHEAtQC9ALkAtQDxAO0A6QEhAN0AlQCQyTjZAgEBwQIBAoFDSUOFQ8lDiUNJQ0lCiQHBAUCIXGVBSUCVQN1BJUDpQXVA9UE5QLlAuUDpQOVAkm1BhQLZAd0B7QFpAXUBPQTBAHkAdQAtAB2AmYBRgQmCAcJVwmHC5Mh42QFBAkECAQKBAsEDAQNBQ8VDyUPJQ81DTULRQg1ByUEGeIgQ6QDhAJ0AmQCZAFItwbHBtMhdBUCafUGJQcVCSUJFQoUDAQKBAsECBQHNAdEBEQDRABkAFYCdgR2BXYHhgd2CIYIVgdmBDYEJAUUBwQIFAkECwQLBA0EDAQLBAoEBwQGASG0xAc0BnQEhASkArQBxADEAKQAlABkAFMkVKUENQUVBBUGFQYVCRUKJQsVDCUNJQsUDQQKBAkEBwQFJAREAlIllVUHFQUVByUKFQslDSUNJQ9VDlUPZQ1lDWUKVQZVBEUCQyCxivr2BjYGRgdGB1YHZgZmBWYEdgRkAFQClAREBjQJNAk0CzQKNAs0CjQJNAQo9gRWBjYJNgs2DCYNRg1GCkYKRgY2Bkrg==",   "textual": null   },   "id": "8ceWLxUo1Gg1",   "delivery": {   "provider": false,   "email": true,   "download": true   },   "knowledgeBasedAuthentication": null,   "auth": {   "scheme": "NONE",   "challenges": []   },   "data": null,   "title": "Silanis",   "external": null,   "updated": "2017-11-14T20:31:34Z",   "phone": "",   "professionalIdentityFields": [],   "userCustomFields": [],   "company": "Silanis",   "email": "[email protected]",   "firstName": "Haris",   "lastName": "Haidary",   "name": "",   "address": null,   "created": "2017-11-14T20:31:34Z",   "specialTypes": []   }   ],   "name": "Owner"   }   ],   "status": "DRAFT",   "description": "",   "language": "en",   "id": "rr8lE3YwF-LaCNxSjntn2udM8hc=",   "data": {   "origin": "api"   },   "autocomplete": true,   "documents": [   {   "status": "",   "description": "",   "id": "dfe8ac46006b31f6",   "signedHash": null,   "extractionTypes": [],   "signerVerificationToken": null,   "data": {},   "approvals": [   {   "id": "akmT717La0YP",   "role": "a3bfe56c-da0a-4ff0-bfef-efe55fd28a0c",   "data": null,   "signed": null,   "accepted": null,   "fields": [   {   "binding": null,   "validation": null,   "id": "AooaSEwkp0oG",   "page": 0,   "data": null,   "subtype": "FULLNAME",   "height": 39.99995853281021,   "extract": false,   "width": 199.99979266405106,   "extractAnchor": null,   "left": 94.00000655210017,   "top": 752.0005724167823,   "type": "SIGNATURE",   "value": "",   "name": "AooaSEwkp0oG"   }   ],   "name": ""   },   {   "id": "anR9R3fLlQYE",   "role": "564fd009-7673-4a5f-9314-5c5b3d5f3869",   "data": null,   "signed": null,   "accepted": null,   "fields": [   {   "binding": null,   "validation": null,   "id": "AvqDbyKBeIoX",   "page": 0,   "data": null,   "subtype": "FULLNAME",   "height": 39.99995853281021,   "extract": false,   "width": 199.99979266405106,   "extractAnchor": null,   "left": 94.00000655210017,   "top": 832.999669445753,   "type": "SIGNATURE",   "value": "",   "name": "AvqDbyKBeIoX"   }   ],   "name": ""   }   ],   "pages": [   {   "id": "dfe8ac46006b31f6_0_-1_1.png",   "height": 1030,   "width": 796,   "left": 0,   "top": 0,   "version": 0,   "index": 0   }   ],   "external": null,   "extract": false,   "fields": [],   "index": 0,   "name": "cleaning_contract",   "size": 197171   }   ],   "sender": {   "status": "ACTIVE",   "language": "en",   "signature": {   "handdrawn": "AQAAADJI+a4cnf0t3Dlf0GqWJceCA+4AAwADAN8BAAADAAAAggPuAOgAAAACfyxAUkAlQCdAOUA6QDtAHEAtQBtACkAJQBVAFBIyfkA0QBVABkAYQCpAHEAtQC9ALkAtQDxAO0A6QEhAN0AlQCQyTjZAgEBwQIBAoFDSUOFQ8lDiUNJQ0lCiQHBAUCIXGVBSUCVQN1BJUDpQXVA9UE5QLlAuUDpQOVAkm1BhQLZAd0B7QFpAXUBPQTBAHkAdQAtAB2AmYBRgQmCAcJVwmHC5Mh42QFBAkECAQKBAsEDAQNBQ8VDyUPJQ81DTULRQg1ByUEGeIgQ6QDhAJ0AmQCZAFItwbHBtMhdBUCafUGJQcVCSUJFQoUDAQKBAsECBQHNAdEBEQDRABkAFYCdgR2BXYHhgd2CIYIVgdmBDYEJAUUBwQIFAkECwQLBA0EDAQLBAoEBwQGASG0xAc0BnQEhASkArQBxADEAKQAlABkAFMkVKUENQUVBBUGFQYVCRUKJQsVDCUNJQsUDQQKBAkEBwQFJAREAlIllVUHFQUVByUKFQslDSUNJQ9VDlUPZQ1lDWUKVQZVBEUCQyCxivr2BjYGRgdGB1YHZgZmBWYEdgRkAFQClAREBjQJNAk0CzQKNAs0CjQJNAQo9gRWBjYJNgs2DCYNRg1GCkYKRgY2Bkrg==",   "textual": null   },   "id": "ZQI8k6faVoM8",   "data": {   "serviceCredentials": "{}",   "showIntro": false   },   "account": {   "id": "3vD0Dc9Fh7wQ",   "data": null,   "updated": "2016-05-05T19:30:13Z",   "company": {   "id": "jVWmyg4cyis8",   "data": null,   "address": {   "address1": null,   "address2": null,   "city": null,   "country": null,   "zipcode": null,   "state": null   },   "name": "eSignLive"   },   "licenses": [   {   "status": "ACTIVE",   "paidUntil": "2020-05-05T00:00:00Z",   "plan": {   "group": "",   "description": "E-Sign Hundreds of Documents with Unlimited Signers",   "id": "sandbox",   "features": null,   "price": {   "amount": 0,   "currency": {   "id": "USD",   "data": null,   "name": "US Dollar"   }   },   "original": null,   "cycle": "YEAR",   "contract": "YEAR",   "freeCycles": null,   "quotas": [   {   "cycle": null,   "scope": "ACCOUNT",   "limit": 100,   "target": "SENDER"   },   {   "cycle": null,   "scope": "SENDER",   "limit": 500,   "target": "DOCUMENT"   },   {   "cycle": null,   "scope": "SENDER",   "limit": 500,   "target": "STORAGE"   }   ],   "data": null,   "name": "Sandbox"   },   "transactions": [],   "created": "2016-05-05T19:30:13Z"   }   ],   "logoUrl": "",   "providers": null,   "customFields": [   {   "required": false,   "id": "policy_number_id",   "data": null,   "translations": [   {   "description": "Car Insurance Policy Number.",   "language": "en",   "id": "",   "data": null,   "name": "Policy Number"   }   ],   "value": "123-456-789-0",   "name": ""   }   ],   "created": "2016-05-05T19:30:13Z",   "owner": "ZQI8k6faVoM8",   "name": "Haris Haidary"   },   "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": "[email protected]",   "firstName": "Haris",   "lastName": "Haidary",   "type": "MANAGER",   "name": "",   "address": {   "address1": "",   "address2": "",   "city": "",   "country": "",   "zipcode": "",   "state": ""   },   "created": "2016-05-05T19:30:13Z",   "specialTypes": [],   "hasDelegates": false   },   "emailMessage": "",   "limits": null,   "notarized": false,   "settings": {   "ceremony": {   "layout": {   "header": {   "feedback": true,   "titleBar": null,   "breadcrumbs": true,   "globalActions": {   "confirm": true,   "download": true,   "hideEvidenceSummary": true,   "saveAsLayout": true   },   "globalNavigation": true,   "sessionBar": true   },   "footer": null,   "brandingBar": {   "logo": {   "link": "",   "src": "branding"   }   },   "iframe": false,   "navigator": true   },   "style": null,   "enforceCaptureSignature": false,   "events": {   "complete": {   "redirect": null,   "dialog": true   }   },   "extractAcroFields": true,   "extractTextTags": true,   "inPerson": false,   "declineButton": true,   "declineReasons": [],   "disableDeclineOther": false,   "disableDownloadForUncompletedPackage": false,   "disableFirstInPersonAffidavit": false,   "disableInPersonAffidavit": false,   "disableOptOutOther": false,   "disableSecondInPersonAffidavit": false,   "documentToolbarOptions": null,   "handOver": null,   "hideCaptureText": false,   "hideLanguageDropdown": false,   "hidePackageOwnerInPerson": false,   "hideWatermark": false,   "maxAuthFailsAllowed": 3,   "optOutButton": true,   "optOutReasons": []   }   },   "signedDocumentDelivery": null,   "updated": "2017-11-14T20:31:34Z",   "consent": null,   "due": null,   "visibility": "SENDER",   "type": "LAYOUT",   "messages": [],   "name": "cleaning_contract",   "created": "2017-11-14T20:31:34Z",   "notaryRoleId": null,   "bulkSendable": false   }   ],   "count": 5   } 

Similarly, to apply a layout, you will need the packageId, documentId, and layoutId/layoutName, to make your request:

If using LayoutID:

HTTP Request

POST /api/packages/{packageId}/documents/{documentId}/layout?layoutId={layoutId}

HTTP Headers

Accept: application/json   
Content-Type: application/json   
Authorization: Basic api_key 

If using layout name:

HTTP Request

POST /api/packages/{packageId}/documents/{documentId}/layout?layoutName={layoutName}

HTTP Headers

Accept: application/json   
Content-Type: application/json   
Authorization: Basic api_key 

Deleting a Layout

To delete a layout use the following code:

HTTP Request

DELETE /api/packages/{layoutId}

HTTP Headers

Accept: application/json   
Content-Type: application/json   
Authorization: Basic api_key 

Results

After running your code, you will see a list of all your layouts under the toolbar. Once your layout is saved, you can then apply it on subsequent documents.

Request Payload Table

Property Type Editable Required Default Sample Values
type string Yes No PACKAGE PACKAGE / TEMPLATE / LAYOUT
name string Yes Yes n/a Layout Example
id string Yes No n/a rr8lE3YwF-LaCNxSjntn2udM8hc=
visibility string Yes No ACCOUNT ACCOUNT / SENDER
documents
id string Yes No n/a sample-contract

To download the full code sample see our Code Share site.

Templates and Layouts fulfill the same goal of automating the e-signature process by shortening the time it takes to send documents that include several signature blocks and data fields. Templates are ideal to use at the transaction level – you can pre-define your signers, documents, signature locations and e-signature workflows to streamline the e-signature process. A Layout on the other hand, is a type of template that allows you to create pre-defined locations for your signature blocks and data fields within a document. It acts like a ‘marker’ where signature blocks and data fields will sit in the document. Layouts are helpful for users who frequently send forms that may be slightly different per recipient but signature blocks and data fields remain in the same location throughout the document. What’s more, you can use multiple Layouts per document, and apply them to individual pages within your transaction.

Finding your Layouts in the UI

When editing documents, you will find all of your saved layouts under the toolbar, as shown below. Note that layouts can only be applied when transaction are in a Draft status.

Capture

Creating a New Layout

In this example, document extraction is used to extract the fields and save them as a layout. For more information, see Document Extraction.

After creating your package, use the following encapsulated function to create your layout from an existing package.

 public ESignLiveAPIObjects.package_x createLayout(string packageId, string documentId, string layoutName, TestLayout.Visibility visibility) 

It is important to note that the Layout ID is required to apply layouts to documents. The following code will do this:

  ESignLiveAPIObjects.package_x createLayout = createLayout(pkgId,'Sample_Document_Extraction','Layout Created from Apex SDK', TestLayout.Visibility.ACCOUNT);   String layoutId = createLayout.id; 

Retrieving a Layout

The following code will retrieve a layout.

  //retrieve all layouts   integer totalCount = getLayoutCount();   integer index = 0;   System.debug('Total layout count: ' + totalCount);   while(index < totalCount){   List<ESignLiveAPIObjects.package_x> layouts = getLayouts(index,index+49);   for(ESignLiveAPIObjects.package_x layout: layouts){   System.debug('Layout name: ' + layout.name + ' with id: ' + layout.id);   }   index += 50;   } 

Similarly to creating layouts, use the following encapsulated functions to apply a layout to your document. This code will pass in your layout ID, target package ID and target Document ID.

  public void applyLayout(String packageId, String documentId, String layoutId) 

Deleting a Layout

To delete a layout, use the following code:

  //delete layout   ESignLiveSDK sdk = new ESignLiveSDK();   sdk.deletePackage(layoutId); 

Results

After running your code, you will see a list of all your layouts under the toolbar. Once your layout is saved, you can then apply it on subsequent documents.