# Leegality Knowledge Base — Complete Content > Source: https://knowledge.leegality.com > Generated: 2026-06-15 > Contains every page as plain markdown. For the page index see https://knowledge.leegality.com/llms.txt. --- URL: https://knowledge.leegality.com/document-execution/getting-started/create-an-account # Create an account 1. Go to [dashboard.leegality.com/sign-up](https://dashboard.leegality.com/sign-up) 2. Provide either an **email address** or **phone number** and click **Send OTP**. > **Warning — Important: Please Use a Permanent Contact** > > You **cannot** change the email address or phone number after creating your account. Please ensure you have long-term access to it. > **Why can't I change it?** > > > For security and legal reasons, your email or phone number acts as your unique identifier. It is permanently linked to the audit trail of every document to ensure the signature is always verifiable and legally binding. Changing it would break this critical link. 3. Enter OTP and the **Name** of the user and click **Sign Up**. > **Info — Note** > > This is not a username and cannot be used to log in to the Leegality account. 4. Create a **password** and click **Update**. Your Leegality account has been created and is ready to use. ## FAQs **Can one user log in on multiple devices at the same time?** > No. A Leegality account can only be actively signed in on **one device at a time**. If you try to log in on a second device while you're already signed in elsewhere, you'll see a prompt with two choices: > - **Keep the existing session** — cancels the new login attempt; your original device stays signed in. > - **Continue here** — automatically logs you out of the other device and signs you in on the current one. > > You can't have both sessions active simultaneously. **Will my session expire if I'm inactive?** > Yes. If your dashboard tab is inactive for **15 minutes**, your session ends automatically and you'll need to sign in again. --- URL: https://knowledge.leegality.com/document-execution/getting-started/dashboard-overview # Get to Know Leegality Dashboard This guide will introduce you to Leegality’s main interface and its key features, helping you navigate through the platform with ease. ## Top Bar At the top of the screen, you’ll find the navigation bar, giving you quick access to core features: ![Leegality Dashboard](https://knowledge.leegality.com/img/get-to-know-leegality-dashboard.png) 1. **Dashboard**: Access and manage templates, workflows, contact book, and activity logs. 2. **Documents**: Manage your documents, from drafts to completed ones. 3. **Stamps**: Access and manage your stamp series and groups. 4. **\+ Create Button**: Allows you to create: - [New document](https://knowledge.leegality.com/document-execution/getting-started/sending-journey) - [Stamp series](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series) and [Stamp group](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups) - [Template](https://knowledge.leegality.com/document-execution/template/) - [User](https://knowledge.leegality.com/document-execution/settings/Admin/user-management#create-a-new-user) - [Contact](https://knowledge.leegality.com/document-execution/contact-book) - [Run Workflow](https://knowledge.leegality.com/document-execution/workflows/run-workflow) - [Purchase eSign credits and stamps](https://knowledge.leegality.com/document-execution/getting-started/buy-eSign-credits) 5. **eSign Credits Indicator**: Shows how many credits you have left. 6. **Support Links**: Access resources like Knowledge Base, API Documentation, and Product Updates. 7. **Settings**: Customize your account preferences. More details on Settings. 8. **Profile**: View your profile, switch users, switch to the legacy UI, or log out. --- ## Exploring the Dashboard The Dashboard is divided into five key sections, accessible from the left-side panel: | Section | Description | |-------------------------------------|---------------------------------------------------------------------------------------------------------------------------| | **Home** | **Transactions Overview**: Displays a graph summarizing key transaction data: Invitations sent, signed documents, and completed documents. You can also download these transactions. **Recent eSigning Activity**: Shows the five most recently sent documents, including invitee details and activity type. | | [**Activity Logs**](https://knowledge.leegality.com/document-execution/activity-log) | Comprehensive logs recording all account activities, including invitations, payments, stamps, workflows, and more. | | [**Templates**](https://knowledge.leegality.com/document-execution/template/template) | Stores all your templates. You can create, edit, and manage templates. | | [**Workflows**](https://knowledge.leegality.com/document-execution/workflows/overview) | Provides access to all saved workflows. You can run, download API payload, and edit workflows. | | [**Contact Book**](https://knowledge.leegality.com/document-execution/contact-book) | Stores invitee contact information. You can add contacts using the Create button or import contacts in bulk using an Excel file. | --- ## Documents Section The Documents section provides a centralised view of all your documents and their current status. Learn more about in [Manage Document](https://knowledge.leegality.com/document-execution/manage-documents/overview). ![Documents Section](https://knowledge.leegality.com/img/getting-started-guide-documents.png) ### Documents - **Sent:** Documents you have sent for signing or review but are not fully executed. - **Received:** Documents you have received for signing or review. These remain in the Received folder until all invitees have completed their actions. - **CC:** Documents where you are marked as a CC invitee. - **Drafts:** Documents that were initiated via a new document or workflow run but were not sent. > **Note:** Invitee and document-level configurations made during the sending journey are not retained. - **Completed:** Documents where all invitees have signed. - **Expired:** Documents where the signing or review invitation has expired. ### Quick Access - **Action Required:** Documents awaiting your action, such as signing, reviewing and/or drafts waiting to be sent for signing. - **Waiting for Others:** Documents you sent that are pending signatures or reviews from others. - **Expiring Soon:** Documents that will expire in a few days and may require action from you or other invitees. - **Failed:** Documents that expired due to reasons like invitation timeout, retry attempt exhaustion, or certificate details mismatch. - **Rejected:** Documents you sent but were rejected by the reviewer. --- ## Stamps Section ![Stamps Section](https://knowledge.leegality.com/img/getting-started-guide-stamps.png) The Stamps section provides an overview of your stamp series and groups. From here, you can: - View denomination values for stamps - Track stamp status (unused, reserved, used, blocked) - Purchase more stamps - View consumption history - Extend stamp expiry For more information, check out [Stamps](https://knowledge.leegality.com/document-execution/stamps/stamps). --- URL: https://knowledge.leegality.com/document-execution/getting-started/buy-eSign-credits # Buying eSign Credits The article guides you through the step-by-step instructions for setting up a billing profile and purchasing eSign credits and stamps. > **Info — Note** > > Only admin and billing users can purchase eSign credits and stamps. ## Create a Billing Profile 1. Click on the Setting icon ⚙️. 2. In the left navigation panel, go to **Wallet > Billing Profiles**. 3. Click **+ Create Billing Profile** and a pop-up will open to add a billing profile. 4. Fill in the required information. 5. Click **Create**. > **Info — Note** > > Billing Profile information will be displayed in the invoice. ## Purchase eSign Credits or Stamps 1. Click on the Setting icon ⚙️ and go to **Wallet > Purchase**. 2. In Transaction Items, click **+ Add Items** to add desired products like eSign and Stamps. > **Info — Stamps Prerequisite** > > Before purchasing Stamps, create a related Stamp Series. Learn [**how to create a Stamp Series**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series). 3. **Add quantity** for each product as needed. 4. Click **Proceed** on the bottom right. You will see the total base cost here. 5. Review the selected items and quantities in the Confirm Order screen. Click **Edit** to make changes otherwise **Confirm** to proceed. 6. Click **Pay** and choose payment methods like UPI, Credit/Debit Card, Net Banking, and Wallet. 7. Alternatively, you can pay directly into our bank account using NEFT, RTGS, or IMPS. Click **View Bank Details** for more information. Depending on your chosen payment method, processing may take a few hours. Once payment is successful, eSign credits will be added to your account. If you've purchased stamp papers, we'll initiate the stamp procurement process which usually takes 7-10 business days. > **Warning** > > eSign credit expires after 365 days of purchase. You ***cannot*** extend the expiry of eSign credits. --- ## How Leegality eSign Credits Work To understand your eSign credit balance and consumption, it's best to think of the system in two distinct phases: **purchasing** credits and **consuming** credits. The system works like a flexible prepaid wallet: you purchase credits, and then you spend those credits based on the services you use. ### Phase 1: Purchasing Your eSign Credits This phase is straightforward. When you add funds to your Leegality account, they are converted into eSign credits at a simple, fixed rate. **₹1 (INR) \= 1 eSign Credit** For example, if you purchase **₹10,000** worth of credits, you will have **10,000 eSign credits** added to your account wallet. This is the amount you have available to spend on getting documents signed using any eSign type. > **Note:** Minimum eSign credit purchase value should be 100 INR #### **Understanding the Purchase Page: Your Credits are Flexible** When you purchase credits from the Leegality Dashboard, you may be presented with options to add specific eSign types to your cart (for example, "10 Aadhaar eSigns"). The dashboard uses this selection to help you calculate the **total number of credits** you might need. > **Tip — Example** > > Adding "10 Aadhaar eSigns" to your cart at a rate of 25 credits/sign will calculate a total purchase of **250 eSign credits**. However, it's crucial to understand that you are **not** buying "Aadhaar-only" credits. Once the payment is complete, your account is credited with a universal pool of **250 eSign credits**. These credits can be used to pay for **any type of eSign transaction**, whether it's an Aadhaar eSign, a Virtual Sign, or any other type offered. ### Phase 2: Consuming Credits for Signatures This is the most important phase to understand. When you send a document for signing, you consume credits from your wallet. However, the number of credits consumed is **variable** and depends entirely on the **type of eSign** used by the signer. Different eSign types (like Aadhaar eSign, Virtual Sign, Doc Signer, etc.) have different underlying costs. This is reflected in the number of credits they consume. For instance, the cost might be: * **Aadhaar eSign:** 25 eSign credits per signature * **Virtual Sign:** 15 eSign credits per signature ### Putting It All Together: An Example Imagine you need to get a single document signed by three different people (Invitees A, B, and C). You've configured the document so that all three will use the **Aadhaar eSign** method. Here’s how the credits would be consumed: | Invitee | eSign Type | eSign Credit Cost per Signature | | :---- | :---- | :---- | | Invitee A | Aadhaar eSign | 25 credits | | Invitee B | Aadhaar eSign | 25 credits | | Invitee C | Virtual Sign | 15 credits | | **Total Consumption** | | **65 eSign credits** | Therefore, getting this **one document** signed by **three people** will consume a total of **65 eSign credits** from your account. > **Warning — Disclaimer** > > The actual consumption rates for different signature types are based on your agreed-upon commercials with Leegality. Now the eSign credits are in your account, you are all set to [**send your first document for eSign**](https://knowledge.leegality.com/document-execution/getting-started/sending-journey). --- URL: https://knowledge.leegality.com/document-execution/getting-started/sending-journey # Sending a Document for eSignature ## Step 1: Prepare Your Document 1. Click **+ Create** > **New Document**. This will direct you to the *Create* page. 2. Choose how to prepare Your document: #### Option 1: Upload a PDF 1. Click **Upload** to add document(s) from your computer. > **Info — Note** > > - **Supported file type:** PDF > - **Upload Limit:** 10 files > - **Maximum total size:** 30 MB (15 MB recommended for optimal performance). > **Tip — Having trouble uploading?** > > See [Upload Errors](https://knowledge.leegality.com/document-execution/troubleshooting/sending-journey/upload-errors) for common errors and their resolutions. 2. Drag and drop files into the designated area or browse and select files manually. 3. If multiple PDFs are uploaded, use the up ( ↑ ) and down ( ↓ ) arrows to arrange them in the desired order. > **Note:** When multiple PDFs are uploaded and arranged, they will be merged into a single document before sending for signing. 4. Click the delete icon (🗑️) to remove unwanted files. #### Option 2: Use a Template > **Tip — Prerequisite** > > You must have an existing template. Learn how to create a [**templates**](https://knowledge.leegality.com/document-execution/template/). 1. Navigate to the **Templates** tab. 2. Select the desired template. 3. *(Optional)* Enable **Append PDF files to template** if you want to attach extra PDF files alongside the selected template. Follow the same upload steps as above. > **Example:** A company uses a **Vendor Agreement Template** but occasionally needs to include an **NDA**. Instead of modifying the template, they use Append PDF files to template to attach the NDA while sending the document for signing. > **Note:** Additional PDF(s) will attach after the template. 3. **Name the Document:** Leegality automatically assigns a name based on the uploaded file and selected template. You can change it as desired. The document name will appear in the email subject and body. The **Name** and **Internal Reference Number (IRN)** fields have a maximum character limit of 255. The following special characters are allowed: **| - : () , _. [] &/**. > **Tip — Example** > > **Email Subject:** “Invitation to eSign: Service Level Agreement” 4. You can use [folders](https://knowledge.leegality.com/document-execution/manage-documents/folders) to group and manage your document. Select a folder from the dropdown and save your document into it. --- ## Step 2: Add Stamp Papers ### Use Leegality's Bharat Stamp 1. Enable the **Use Stamps** toggle. 2. Choose from the following stamp usage methods: - **Use Stamp Series (Single Stamp):** Select a stamp series from dropdown. A single stamp from that series will be attached. - **Use Stamp Series (Multiple Stamp):** Select a stamp series and specify the number of stamps required. Click **+ Add More** to add stamps from other series. The specified number of stamps will be attached. - **Use Stamp Group:** Select a stamp group and enter the total stamp value required. Stamps worth the specified amount will be automatically attached to the document. - **Use Revenue Stamp:** Select a Revenue stamp series and enter the number of stamps. Revenue stamps can be used alongside state stamp series, stamp groups, and upload stamps. ### Upload your stamp 1. Enable the **Upload Stamp** toggle. 2. Provide the following information: 1. **State** 2. **Denomination** 3. **First Party's Name** 4. **Second Party's Name** 5. **Stamp Serial Number** 3. Upload the stamp paper’s PDF file and click **Save**. --- ## Step 3: Add Invitees 1. By default, the sender is included as a signer. Use the **"I want to sign the document"** toggle to include or remove yourself as a signer. 2. To add another invitee, click **+ Add Invitee**: - Each invitee’s default role is "Signer" with the default eSign type configured in [**Settings ➔ Department ➔ eSignature**](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#set-the-default-esign-type). - Enter the invitee’s **Name** and **Contact Details** (Email and/or Phone). - Notifications will be sent via email/SMS/WhatsApp containing a signing link. > **Info — Note** > > While adding an invitee, enable the **Add new invitee to Contact Book** checkbox to save their details to your [Contact Book](https://knowledge.leegality.com/document-execution/contact-book). This allows you to auto-fill their details the next time you add them as an invitee. ### Set Signing Order 1. Toggle **Request invitees to sign in fixed order**: - **Disabled:** All invitees receive the signing link simultaneously. - **Enabled:** Signing links are sent sequentially based on the specified order. > **Tip — Example** > > If there are two signers, the documents would be sent to the second signer only after the first signer has signed the document. 2. Use the up ( ↑ ) and down ( ↓ ) arrows to adjust invitee order. ### Configure Invitee Settings #### eSign Type - [**eSign Type**](https://knowledge.leegality.com/category/esign-types)**:** Choose from Aadhaar, DSC, Doc Signer, Virtual Sign, Visual Sign, or Quick Sign. #### Invitee Type - [**Reviewer:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer) A non-signing invitee who needs to review the document’s content and then approve or reject it. - [**Group Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/group-invitee) A Group Invitee allows multiple signers, but only a specified number need to sign. - **For example**, if a group has three authorized signers and any two signatures are required, the document progresses once two members sign. - [**CC Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/cc) A CC Invitee does not sign the document but receives notifications about the document's progress. - **Invitation & Reminders:** When an invitation is sent, resent, or nearing expiry. - **Signing Progress:** When an invitee signs, a reviewer approves/rejects, or the document is completed. - **Failures & Expiry:** If signing fails due to expiry, face match, liveliness, or location issues. - **Final Documents:** Completed document and audit trail upon signing completion. #### Security Features - **Authentication:** Invitees must authenticate their identity before accessing the document to ensure only the intended recipient can proceed. - [**One-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/one-factor-authentication)**:** OTP verification via email or phone number. - [**Two-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/two-factor-authentication)**:** OTP verification via both email and phone number. - **GPS Location:** - [**Capture GPS Location:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Record the invitee's location at the time of signing the document. - [**Accuracy-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Don’t allow the invitee to sign if the captured location is not accurate up to a certain number of meters. - [**Location-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Restrict signing if the signer is outside of the configured area. - **Identity Verification** - [**Face Capture:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo) Capture the photo of the signer before allowing them to sign the document. - [**Face Match:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match) Capture the photo of the signer and match it against the reference image uploaded by the sender. - **User Liveliness![External Link](https://knowledge.leegality.com/img/external-link-svgrepo-com.svg):** Ensure real-time presence of the signer. - [**Manual User Liveliness (OTP-based):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness) The signer needs to capture a photo of themselves while showing the OTP appearing on the screen. - [**Smart User Liveliness (AI-powered):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness) AI-based solution that ensure the person sitting in front of camera is actively present there. It detects spoofs like photo and pre-recorded videos. #### Signature Appearance - [**Invitee Name on Signature:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-in-signature) Choose whether to display the invitee’s name in the signature. - [**Company Seal:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal) Ask invitee to upload the image company (organization) seal. If the signer has a Leegality account, the company seal will auto-fill based on the preferences. - [**Invitee Name Editing:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing) Allow or restrict name editing during signing. #### Other Features - [**Custom Webhook and URL:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/custom-url-and-webhook/webhook-and-url) Enable integrations for real-time updates. - [**Supporting Documents:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents) The Supporting document helps you request additional documentation, which invitee needs to upload during signing journey. - [**Additional Consent Terms:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/additional-consent) Add custom terms and conditions alongside default consent. - [**Mask Contact Details:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/mask-contact-details) Hide other invitees' contact details for privacy. - [**Reject to Sign:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign) Provide an option to reject to sign the document. --- ## Step 4: Configure Document Settings - [**Signing Link Expiry**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/document-expiry)**:** Set a deadline for invitees to sign or review the document. The signing or reviewing link can expire: - After a specific number of days - Within 45 minutes - By the end of the day Once expired, the invitee cannot access the document. Sender needs to re-activate the document. > **Info — NOTE** > > You can update the expiry date for documents that have already been sent. However, invitees will not receive a notification about the updated expiry date. - [**Reference Attachments**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/reference-attachments)**:** Add attachments for invitees to refer to during signing. - [**Transfer Completed Document**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/sftp)**:** Automatically transfer signed documents via SFTP. - [**Custom Message**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message)**:** Add a personalized note to the email body. --- ## Step 5: Notification Delivery Method Select methods for sending signing or reviewing invitation, reminders and other updates. Available delivery methods are: - Email - SMS - WhatsApp 1. Click **Invitee Level Options**. 2. Enable or disable **Email, SMS, and/or WhatsApp Notifications**. > **Info — Note** > > For CC invitees, only email notifications are available. --- ## Step 6: Placing Signature Coordinates A signature coordinate is where you want the invitee’s signature to be on the document. By default, signature coordinates are placed at the bottom-left corner of every page in the document. To place signature coordinates in your desired place: 1. Hover over **☰** icon and select **custom coordinate**. 2. Click on the document where you want to place the signature. 3. Use the dropdown to assign the signer. The signature placeholder size can be increased or decreased as per requirement by simply dragging from its edges. > **Info** > > For a multi-page document, you must click **custom coordinate** before placing coordinates in each page. > > 1. Navigate to each page that requires a signature. > 2. Hover over the **☰** icon and select **custom coordinate** again. > 3. Drop the signature coordinate on that page. > 4. Repeat for every page that needs a signature. > 5. Preview the document and visually confirm the coordinate marker is visible on every required page before sending. --- ## Step 7: Preview and Send Once you have added the document, invitees, and signature coordinates, you can preview the final version before sending it. - Click the **View Invitees** button to review all invitees associated with the document. Each invitee will have a label indicating their role (**Signer, CC, or Reviewer**). You can also verify their contact details (Email address and/or phone number). - Click **Send**, and invitations will be sent to all invitees for signing or reviewing the document. After sending, you will be redirected to the [**Document Details**](https://knowledge.leegality.com/document-execution/manage-documents/document-details/view-document-details#detailed-view-for-specific-document) page, where you can monitor the status of invitees and track the progress of the document. --- URL: https://knowledge.leegality.com/document-execution/getting-started/signing-journey # Signing a Document This guide will walk you through every step—from receiving your document notification to completing your secure signature. > **Info — Note** > > The invitee may not need to perform all the steps mentioned in this guide. The required actions depend on how the sender has configured the document. ## Step 1: Access the Document You will receive a notification via email, SMS, WhatsApp, or a direct link shared by the sender. 1. Click the **Review/Sign** button for email or the **signing link** if you received an *SMS* or *WhatsApp* message. #### Choose a language - [**Local Language**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/local-language#signing-journey)**:** At the start of your signing journey, select the language in which you would like to proceed. #### Authenticate Your Identity For added security, the sender may require identity verification before you access the document. This option is set by the person or business that is sending the documents. Identity authentication methods include: - [**One-Factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/one-factor-authentication#signing-journey)**:** Either email or SMS OTP authentication - [**Two-Factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/two-factor-authentication)**:** The first step is accessing the signing link via email or SMS. The second step requires entering an OTP sent to the alternate method (SMS if you used email, or vice versa). > **Info — OTP Expiry** > > All OTPs during signing journey expire after **10 minutes**. If the OTP expires, you will need to start the signing process again. --- ## Step 2: Preview the Document Once authenticated, you will be redirected to the document preview page. 1. Scroll through the document to review its content thoroughly. 2. Once satisfied, click **Proceed**. #### Additional Options - **Invitee List:** All invitees to whom the document has been sent. - [**Local Language Selector**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/local-language#signing-journey)**:** Change the language of the signing journey as desired. - [**Custom Message**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message#signing-journey)**:** Click on the message icon to view any additional message from the sender. - [**Reference Attachment (📎)**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/reference-attachments#accessing-reference-attachments-during-the-signing-journey)**:** Click on the attachment icon to view and download any reference documents uploaded by the sender. > **Info — Fill document Fields (If Applicable)** > > If you’re the first to sign/review and the sender has enabled the **Allow first invitee to fill** option, you must fill out the details before proceeding. > 1. Fill out the fields. > 2. Use the **Preview** option to verify your entries. > 3. Once all required fields are filled, click **Proceed**. --- ## Other Invitee Actions - [**Uploading Supporting Documents**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents#signing-journey) If the sender requests additional documentation, the name of the required file will appear on your screen. - Click the upload button and select the document from your device. Supported formats: .pdf, .png, .jpg (Maximum file size: 2 MB) - [**Company Stamp/Seal**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal#example-of-company-seal-with-signature) - Authorised Signatory Seal - Director Seal - Upload Company Seal - [**GPS Location**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location#signing-journey-of-capture-gps-location) > **Info — Recommended** > > For GPS-based signing, it is recommended to use a smartphone because of their better location accuracy. Options include: - Capture your current GPS location. - Capture your current GPS location (With Accuracy Threshold). - **Geofencing:** Allows signing only if you are within a predefined area configured by the sender. - **Face Capture** - [**Capture your photo**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo#signing-journey)**:** Take a real-time photo using your device. - [**Face Match**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match#signing-journey)**:** Your photo will be compared with the identity information provided by the sender. If not matched, you cannot proceed to sign. - **User(Invitee) Liveliness Detection**: Confirms that the person signing is physically present. Failure to detect liveliness prevents signing. - [**Manual Liveliness**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness)**:** OTP-based verification - [**Smart User Liveliness**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness)**:** AI-based verification - [**Name Editing**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing)**:** If allowed by the sender, you can edit the name that will appear on the signature. - [**Reject to Sign**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign#invitee-rejection-journey)**:** If permitted, you can choose to reject the document at any time during the signing journey. - [**Payment Collection**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/payment-collect#signing-journey)**:** In some cases, the sender may require you to make a payment before completing the signing process. This could be for fees related to the document, such as service charges, registration fees, or other costs. You will be prompted to make the payment securely within the signing journey, and once the payment is completed, you can proceed to sign the document. --- ## Step 3: Sign or Review the document Based on your role, proceed as follows: #### Signer 1. **Select an eSign Type:** - Availabe options can be - [**Aadhaar**](https://knowledge.leegality.com/document-execution/esign-type/aadhaar/?type=otp#signing-a-document-using-aadhaar-esign) - [**DSC Token**](https://knowledge.leegality.com/document-execution/esign-type/dsc-token) - [**Virtual Sign**](https://knowledge.leegality.com/category/virtual-sign) - [**Visual Sign**](https://knowledge.leegality.com/document-execution/esign-type/visual-sign) - [**Quick Sign**](https://knowledge.leegality.com/document-execution/esign-type/quick-sign) 2. Agree to the default and any additional consent terms. 3. Click **Sign Document**. On successful signing, you will receive a confirmation via email or SMS. Once all invitees have signed the document, you will receive the fully signed document and an audit trail via email. You will also be redirected to the **Public Details Page** page, where you can monitor the progress and view invitee actions. #### Reviewer 1. Review the Document. After reviewing, click **Proceed**. 2. Complete OTP verification if required. 3. Choose to either **Approve** or **Reject** the document. 4. Click **Submit**, check the consent box, and confirm your action. > **Info** > > Refer to [**Reviewer Journey**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer#reviewer-journey) for more details. ## Step 4: Track Document Status on the Public Details Page The Public Document Details Page is generated for every signer. It serves as a central hub where signers can view document information, track signing progress, and manage their signed copy. ### Information and Actions Available on the Public Details Page On this page, you can perform several key actions and view important information related to the document and its signers. * **View and Manage the Document** * See a preview of the signed document. * **Download** **the signed document** to your device. * **Download the Audit Trail** of the completely signed document. * **Save the document** directly to the Leegality account for permanent storage. * **Delete** **the document copy** permanently deletes the signer's copy, and that particular signer will no longer be able to access the Public Details Page link received via email, SMS, or WhatsApp. * **Track Signer Progress** * View a list of all invitees, including their names and contact details. * Check the current signing status of each invitee (e.g., "Signed," "Pending"). * See the exact date and time the invitation was sent and when each person completed their signature. * **Review Document Details** * Find the unique Document ID and the Document Name. * Check the overall status of the document (e.g., "Completed," "Signed"). ### Accessing Public Details Page #### **First 48 Hours** For the first **48 hours** after you complete your signature, the link to the Public Details Page provides open access. This means you can click the link and immediately view the page without needing to log in to a Leegality account. **Important:** **The 48-Hour Window is Invitation-Specific.** The 48-hour open access period begins for each signer *individually* at the moment they apply their signature. It is not based on when the document was first sent or when the first person signed. For example, in a sequential signing process: * **Signer 1** signs on **Monday at 2:00 PM**. Their public link will be open until Wednesday at 2:00 PM. * **Signer 2** signs on **Tuesday at 10:00 AM**. Their public link will be open until Thursday at 10:00 AM. #### **After 48 Hours** Once the 48-hour open access window for your specific invitation has expired, the link automatically becomes a **secure link**. To protect the document's information for the long term, you will be required to authenticate yourself to view the page. When you click the public link received via email, SMS, and/or WhatsApp: 1. You will be directed to a secure login page. 2. The default login option will be **Login with OTP**. 3. You must enter the **email address or phone number** associated with your signing invitation to receive the OTP. 4. Once you successfully log in, you will be redirected to the Public Document Details Page with full access. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/overview # Overview The **Documents** page serves as the central repository for all your documents and related activities. This includes invitations you have sent, received, or those requiring further action. The page is designed to simplify managing your documents by categorizing them into different sections, such as **Sent**, **Received**, **Completed**, and those that require action. ### Managing Documents From the **Documents** section, you can: - View details of sent, received, completed, or in-progress documents. - Use [filters](https://knowledge.leegality.com/document-execution/manage-documents/find-documents) to quickly locate documents based on their status, workflow, or creation mode (e.g., Workflow or Non-Workflow). - Create custom [folders](https://knowledge.leegality.com/document-execution/manage-documents/folders) to efficiently organise your documents. - Perform actions such as [signing](https://knowledge.leegality.com/document-execution/manage-documents/sign-documents-in-your-account), [deleting](https://knowledge.leegality.com/document-execution/manage-documents/delete-a-document), [editing](https://knowledge.leegality.com/document-execution/manage-documents/how-to-edit-a-document), or [resending](https://knowledge.leegality.com/document-execution/manage-documents/resend-a-document) invitations. - Download signed documents along with their associated audit trails. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/view-document-details # Overview There are two ways to view document information: - **List View:** Provides general information about all documents. - **Detailed View:** Offers comprehensive information about a specific document. ## List View for Basic Information This provides the basic information of your documents. The List view contains the following details. - **Document Name:** Name of the document. - **All Invitees:** List of all invitees in a document. - **Created On:** The date on which the document was created. - **Document ID:** The unique ID of the document. - **Status:** Specifies the status of the document, such as Pending Signature, Under Progress, Failed, Rejected, Completed, and Expired. Click **⦀** icon on the right to see more information, including: - **Expires In:** The number of days or months until the document expires. - **Last Updated:** The date on which the document was last updated. - **IRN:** Internal Reference Number assigned to the document by the sender during the sending journey. - **Folder:** The folder in which the document is saved. ## Detailed View for Specific Document You can access the detailed view by clicking on the document name. This view provides specific information such as: - **Invitee List:** See all invitees for the document. - **Signing Status:** Track the signing progress of each invitee. - **Document:** View the document in its current state. - **Activity Logs:** Track key events in the order they happened, including when the sender sent the invitation, when the invitee opened it, OTP generation and verification, and the document signing time. It also includes the sender's and recipient's contact details. ### Actions You Can Perform: - **[Edit invitation](https://knowledge.leegality.com/document-execution/manage-documents/how-to-edit-a-document):** Modify the details of the invite or resend it. - **Mark as complete:** Finalise the document’s signing process. - **[Delete document](https://knowledge.leegality.com/document-execution/manage-documents/delete-a-document):** Deleting a document revokes all outstanding signing and reviewer invitations. - **Upload reference attachment:** Add additional documents as references. - **Re-activate invitation:** Resend the invitation if expired. - **Check notification logs:** Check detailed record of all notifications sent to invitees. - **Resend notification to specific invitee:** Resend the invitation to sign or review. - **Verification Result:** Check the signature certificate verification results. - **Share completed document and audit trail:** Send the completely signed document and audit trail via email. ### Invitee Status The status of each invitee reflects their actions and pending tasks, with some statuses being role-specific: - **Signed:** The invitee has signed the document. Click *Details* to see the signing date and eSign type used for signing. - **Payment:** The invitee has made the payment. Click *Details* to see the payment status, date, amount, and ID. - **Rejected:** Reviewer/Signer has rejected the document. Click *Message* to see the reason for rejection (if provided). - **Approved:** The Reviewer has approved the document. - **Active:** The document is ready to be signed by the invitee but has not been signed yet. - **Unsigned:** The invitee needs to sign the document. - **Inactive:** The document is inactive for the invitee and cannot be signed by them. The sender cannot manually make an invitation inactive. To remove an invitee, the sender can [delete their invitation](https://knowledge.leegality.com/document-execution/manage-documents/delete-an-invitation) instead. ### Invitee Details This tab is visible at any stage of document execution. Click the **Details** tab under the document to view the following: - **Name:** The invitee's name. - **Email:** The invitee's email address. - **Invitation Date:** The date and time the invitation was sent. - **Status:** Current state of the document (e.g., Active, Expired). If the document is not yet signed, the document's **Expiry Date** is visible. If the document is already signed, two additional details are displayed: - **Type of eSign:** The specific signing method used by the invitee. - **Sign Date:** The date and time the document was signed. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/notification-logs # Notification Logs The Notification Logs feature offers a detailed record of all notifications sent to invitees. It helps you confirm whether a notification was successfully delivered to invitees or encountered any delivery issues. By checking the Notification Logs, you gain real-time visibility into notification delivery, including: * Tracking each notification sent to the invitee * Viewing the status (e.g., sent, delivered, read, or failed) * Checking the time and date of each notification * Monitoring notifications across all delivery channels (Email, SMS, or WhatsApp) ## How to Access Notification Logs To view the Notification Logs for a specific document: 1. Click on **Documents** at the top of the page. 2. Locate the document whose notification logs you want to check. You can search using the **Document ID**, **Document Name**, or **IRN**. 3. Click on the document name to open the detailed view. 4. In the invitee list, find the specific invitee's card. 5. Click on the **Three Dots (⋮)** on the top-right corner of the invitee card and select **Notification Logs**. A pop-up window will appear displaying the notification logs for the chosen invitee. > **Info — Note** > > Only notifications from the last 10 days are available in the logs. ## Details in Notification Logs ![Notifications Logs](https://knowledge.leegality.com/img/notification-logs-details.png) ### Channel The medium through which the notification was sent (SMS, Email, or WhatsApp). In the top-right corner, you will find the contact details of the invitee. * **Email only visible:** Notifications are sent to the email address. * **Phone number with message icon:** Notifications are sent via SMS. * **Phone number with WhatsApp icon:** WhatsApp is the primary mode of communication, but SMS is still sent in cases like virtual sign OTP verification. * **Both email and phone number (with SMS or WhatsApp icon):** Notifications are sent to both the email address and phone number (via WhatsApp or SMS). ### Notification Type The type of notification sent to the invitee. Below is a list of all available notification types. * Document Invite * Document Complete * Invitation Expired * Invitation Reminder * Invitation Signed * Verification OTP * NeSL Document Invite * Reviewer Document Invite * Reviewer Document Complete * Reviewer Invitation Expired * Reviewer Invitation Reminder * Review Complete * Document Reinvite * Reviewer Document Reinvite * Invitation Reject * Invitation Reject Signer * Partial Sign Complete * Invitation Expiration Sender * Invitation Expire Sender * Review Complete Partial * Audit Trail PDF * Completed Doc PDF * Group Invitee Completion * Group Invitee Self Sign * Group Invitee Sign Transaction ### Notification Status and Remark Explained | Status | Channel | Status Remark | Explanation | Suggested Action | | :---- | :---- | :---- | :---- | :---- | | **Sent** | Email, SMS, WhatsApp | Sent\! Awaiting delivery. | The notification has been successfully sent from Leegality and is pending delivery to the invitee. | Wait for delivery confirmation. | | **Delivered** | Email, SMS, WhatsApp | Delivered to the recipient | The invitee should now see the message. | No action required. | | **Read** | WhatsApp | Read by the recipient | Indicates that the invitee has engaged with the content. | No action required. | | **Error** | WhatsApp | Message Failed\! Please ensure the recipient’s phone number is correct and linked with WhatsApp | The message could not be sent because either phone number was incorrect or not linked with WhatsApp. | Check the number and resend the message. | | | Email | Delay in delivery due to network issues | There is a temporary issue affecting the delivery of the notification. This could be caused by problems with the recipient's email server or internet connectivity. | Monitor the status and check if the notification is delivered. If not, try resending the notification later. | | | | Failed\! The recipient's email inbox is full or the email account is inactive | The recipient cannot receive more emails until they clear space. | Ask the invitee to clear their inbox. | | | | Delivery failed\! The recipient's email is on the suppression list. Please contact the admin to remove it. | The email cannot be delivered | Contact [support@leegality.com](mailto:support@leegality.com) to resolve the issue. | | | | Failed\! Please ensure the recipient’s email ID is correct and active | Verify that the address you entered is valid. | Verify the email address. | ### Timestamp The date and time when the notification was sent. ### View Notification Specific Logs Displays all logs (sent, delivered, read) for a particular event notification. This makes it simple to track the status of any notification without having to search through the main table. > **Info — Example** > > Suppose you want to check the status of a Document Invite sent via WhatsApp to the above invitee, including when it was sent, delivered, and read. > > To do this, locate the Document Invite sent via WhatsApp in the logs and click the **View** button. This will display all stages of that specific notification, allowing you to easily track its progress. ## Filtering and Sorting * **Date Range Filter:** View logs for a time duration. There are predefined date filters such as last 5 days, today, yesterday, or a custom range. * **Change the Log Sort Order:** You can sort the logs by timestamp. By default, recent logs will appear at the top. * **Channel Filters:** You can view notifications specific to a channel (Email, SMS, WhatsApp), allowing you to isolate potential issues with specific delivery methods. * **Notification Type Filter:** Users can search for specific types of notifications, such as Document Invite or Document Complete, which helps in narrowing down what you need to check. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/audit-trail # Understanding the Audit Trail An audit trail is a step-by-step summary of each activity performed by the sender and invitees in the document, from start to completion. This provides a complete, time-stamped history of every action: who did what, when, where, and how. An audit trail contains the following information. | Category | Details Included | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | **Document details** | Name, ID, status, and hash | | **Stamp details** | State, amount, and stamp serial number(s) | | **Notifications** | Logs of notifications sent (Email and SMS) | | **Invitee authentication** | Details of Geo-fencing, face capture, and smart user liveliness | | **Actions of sender and invitees** | Chronological actions with timestamps — e.g., Opened, OTP steps, Consent, eSign method, Completion, Approval/Rejection, Payment | | **Digital signature certificate** | Information for Aadhaar-based eSign | ## How to Download Audit Trail from Dashboard 1. In the Documents section, click **Completed** documents in the left navigation panel. 2. Locate the document by searching, filtering, or simply skimming through the list. 3. Click on the document to show the details view. 4. Click the **Audit Trail** button to download the audit trail PDF file. > **Info — Note** > > * The audit trail can only be downloaded for completed documents, i.e. all invitees signed the documents. > * Each invitee receives a PDF of the audit trail and the fully signed document via email and WhatsApp. They also get a link to the document Details page, from which they can download both the audit trail and the completed document. > * Even after a document is purged, the audit trail remains accessible from the Activity Logs in the dashboard. > **Tip** > > If you want to generate the audit trail of a partially signed document, you need to manually mark it as complete. With this, only those invitee who signed the document will be recorded in the audit trail. ## Breakdown of the Audit Trail PDF ### Document Details * **Document Name:** Name of the document * **Document ID:** Unique ID of the document * **Stamp Document ID(s):** ID(s) of the attached stamps * **Document Hash** * **Status:** Final status of the document i.e. Completed ### Stamp Details * **State** * **Total Stamp Amount** * **Serial Number(s)** ### Details of Involved Parties A detailed list of sender and invitee actions in order of occurrence. Each entry shows the name, email, phone number, and role (e.g., sender, signer, reviewer) of the invitee. #### Invitee Actions * **Opened:** The invitee clicked the **Sign** button or link to view the document. Consent is not accepted at this stage. * **OTP Generated:** The invitee has generated the OTP. * **OTP Verified:** The invitee has verified the OTP. * **Consent Provided:** Accepting the electronic signature disclosure for the particular electronic document. * **eSigned:** Invitee has eSigned the document. This also shows the eSign type used for the signature. (Example: eSigned using Aadhaar). * Authentication Type * Signature Transaction ID * **Completed:** All invitees have finished signing the document. * **Document Rejected:** The Reviewer has rejected the document. * **Document Approved:** The Reviewer has approved the document. * **Payment Captured:** A payment has been successfully captured from the invitee. #### Sender's Actions * **Invitation Sent:** The document has been sent to an invitee. * **Invitation Resent:** New invitation notification has been sent to the specified invitee. * **Invitation Expired:** The invitation to eSign has expired, and a notification has been sent to inform the invitee. * **Re-invited:** The sender reactivated the invitation, and the invitee has been notified again to eSign the document. ### Invitee Authentication Details * **Smart User Liveliness:** X% * **Face Captured:** 3 Photos of the invitee * **Location Captured** * **Coordinates:** latitude and longitude * **The invitee’s location was accurate up to:** xxxx meters * **Region:** Address of the captured location as per Google Maps ### Digital Signature Certificate details **Signature Certificate Details (If eSigned using Aadhaar)**: Following details are as per Aadhaar at the time of signing the document. * **Name:** Name of the signer * **PIN Code:** PIN Code of the signer * **State:** State of the signer * **Year of Birth:** Year of birth of the signer * **Gender:** Gender of the signer * **Title:** Last 4 Digits of Aadhaar Number * **Serial Number:** Positive number of maximum Length 20 bytes and unique to each certificate issued by a CA. * **Issuer Name:** Certifying Authority that issued the digital certificate * **Issuer Organization** * **Validity Start and End** ### Device Information * **IP Address** * **Device name and model** * **OS (Operating System)** * **Browser** ## How to check the validity of Audit Trails? Every Audit Trail PDF is digitally signed by Leegality. This ensures that it hasn't been tampered with. You can check the digital signature validity in any standard PDF reader (like Adobe Acrobat Reader). If the document has been altered in any way after generation, the signature will show as invalid. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/signature-certificate-details # Signature Certificate Details The **Document Details** page provides a comprehensive overview of the document's verification, signature certificate data, and invitee information. You can access **Invitee Details** at any stage of the document execution process. However, the **Certificate Details** and **Verification Results** are available only after the document has been fully signed and executed. ## Certificate Details Access the Certificate Details tab to view information extracted from the digital signature certificate. This information is only available after the document has been fully signed. The certificate details include the following fields: - Name - Gender - Year of Birth - PIN Code - State - Last 4 digits of Aadhaar ## eSign Verification Details The Signature Verification Status can be accessed in two ways: from the document owner's perspective in the Document Details page, or directly by signers after completing the signing process. The verification process ensures that the identity information provided during signing matches the trusted information stored in the digital certificate. #### Sender To review the verification status as a sender, navigate to the Document Details page and click the **Verification Results** tab. This tab is available only after the document has been fully signed and executed. ### Verification Information The verification status displays the following information: - **Signature Verification Status:** The right panel displays the overall signature verification status. - **Detailed analysis of signature verification:** This section outlines the results of the verification process through Aadhaar eSign or DSC token: - **Configured details:** The details configured during signature type setup, used as the verification standard. - **Input Values:** The values provided by the invitee during the signing process. - **Corresponding Certificate Value:** The matching value found in the invitee's digital certificate for comparison. - **Result:** The verification outcome (e.g., Match or Mismatch) indicating if the input value aligns with the certificate value. #### Signer After successfully signing a document, signers receive a confirmation email with a **View Document** link. To access the verification status: 1. Click the **View Document** link in the email. 2. Complete the OTP verification process. 3. You will be redirected to a page displaying the signed document. 4. Click the **Signature Verification Details** button to view the verification status. ### Verification Information The verification status page displays the same comprehensive information available to document owners: -**Signature Verification Status:** The right panel displays the overall signature verification status. - **Detailed analysis of signature verification:** This section outlines the results of the verification process through Aadhaar eSign or DSC token: - **Configured details:** The details configured during signature type setup, used as the verification standard. - **Input Values:** The values provided by the invitee during the signing process. - **Corresponding Certificate Value:** The matching value found in the invitee's digital certificate for comparison. - **Result:** The verification outcome (e.g., Match or Mismatch) indicating if the input value aligns with the certificate value. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/complete-document-manually # Complete Document Manually You can manually complete a document that has been partially signed by at least one person. This action finalises the document and generates the audit trail, even if some invitees haven't signed. This is particularly useful when: * An invitee's signature is **no longer required**. * An invitation was sent to an **incorrect email or phone number**, and you need to finalise the document with the existing signatures. * An invitee is **unavailable or unresponsive**, and you have decided to proceed without their signature. ## Before You Begin: Prerequisites To manually complete a document, the following conditions must be met: * The document must have **at least two invitees**. * **At least one invitee** must have already signed. * Any remaining unsigned invitees **must be deleted** from the document journey first. ## How to Manually Complete the Document 1. From your dashboard, click **Documents** in the top navigation bar. 2. Navigate to the **Sent** from the left panel. 3. Locate the partially signed document you wish to complete. You can filter by *Document Status* or search by name. 4. Click the document name to open its details page. 5. Click the **Three dots (⋮)** menu in the upper-right corner and select **Complete**. ## Troubleshooting #### **Error: "Signing invitation(s) pending. Cannot complete the document right now."** * **Cause:** This error appears if you try to complete a document that still has active, unsigned invitees. The system requires all pending invitations to be resolved before completion. * **Solution:** You must first **delete the invitation** for each remaining unsigned invitee. 1. On the document details page, find the invitee who has not yet signed. 2. Click the **Three dots (⋮)** next to the invitee's name. 3. Select **Delete**. 4. Repeat for any other unsigned invitees. Once all have been deleted, you can proceed with the completion steps above. ## Result Once completed, the **final signed document and its audit trail are generated immediately**. The document's status changes to "Completed," and it moves from the **Sent** to the **Completed** section. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-storage # How Documents are Stored in Leegality Leegality stores and categorises documents in your dashboard based on their current stage in the eSigning journey. Each category helps you track the document’s status and understand what actions (if any) need to be taken. ## Sent The Sent folder contains all documents for which signing and/or reviewing invitations have been sent, but not all invitees have completed their actions. This contains the documents that are partially signed but expired before all invitees acted. In this case, the sender needs to **re-activate** the document from its details page and set a new expiry date. ## Received The **Received** folder lists documents that you’ve been invited to **sign or review**. * Documents remain here **until all invitees (including you)** have completed their action. * Once the signing/review is complete by all invitees, the document automatically moves to the **Completed** folder. In case you are a signer, the document will *only* move to the Completed folder if the “[**Auto Save Signed Document**](https://knowledge.leegality.com/document-execution/settings/account-level/document-setting/auto-save-signed-documents)” is enabled or manually saved from the details page. ## CC The **CC** folder shows documents where you were added as a **CC invitee**. * You are not required to take any action. * The document will only appear in the CC folder if the sender has enabled the “**Share audit trail and signed document**” option in the CC Options while sending the document. ## Drafts The Drafts folder contains documents you began preparing but aborted before sending for signing. **When is a document saved as a draft?** A document is added to **Drafts** when, during the **New Document Journey** or a **Workflow run**, you: | **Stage** | **When Draft is Saved** | **If Canceled – What’s Retained** | | ------------ | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Create** | Draft is saved when the sender clicks **Next** and proceeds to the **Invite** page. | Document(s) and Stamp(s) added in this stage are retained. | | **Invite** | Progress is **not** saved at this stage. | Even if every invitee, their configurations, and signatures are set, canceling will only retain the Document(s) and Stamp(s) from the Create stage. | | **Finalize** | Progress is **not** saved at this stage. | Even if signature coordinates are placed, canceling will only retain the Document(s) and Stamp(s) from the Create stage. | > **Warning — What's Retained in Drafts** > > Even if you configure invitees, signing options, or reach the final review stage, none of that progress is saved. Only the **document** and **attached stamps** are saved. > **Info — 📌 Stamps remain Resereved** > > If a stamp is attached, it remains **reserved** and **cannot** be used in other documents until the draft is deleted or sent. > **Tip — Draft Retention Period** > > Drafts are automatically deleted **30 days** after creation by default. You can customise the draft retention period from the [**Automatically Delete Draft Documents**](https://knowledge.leegality.com/document-execution/settings/Department/document-config#automatically-delete-draft-documents) setting in the dashboard. ## Completed The **Completed** folder shows documents where **all required parties have successfully signed the document**, and no further action is pending. ### For Signers However, whether a signer (invitee) sees the document in the **Completed** folder of their Leegality account depends on a feature called [**Auto Save Signed Document**](https://knowledge.leegality.com/document-execution/settings/account-level/document-setting/auto-save-signed-documents). #### What is “Auto-save signed documents”? This setting determines whether the signed document is **automatically saved** to the invitee’s Leegality account after they finish signing. * **If ON**: The document appears in the signer’s **Completed** folder immediately after signing. * **If OFF**: The document is **not saved automatically**. The signer must manually choose to save or delete it. #### How a Signer can Manually save a Signed Document from the Public Details page After the invitee signs the document, they are redirected to the **Public Details Page**. In the **bottom-left corner**, two options are available: * **Save the document:** Clicking this triggers an OTP verification (via registered email or phone). Once verified, the document is saved to the signer’s Completed folder. > **Note:** If the signer does not have a Leegality account then the system automatically creates a free, secure Leegality account for you using the email or phone number you provided during signing. The signed document is stored in this account. * **Delete my copy:** Clicking this will show a warning: “This will permanently delete this document. This action cannot be undone.” If confirmed, the document is deleted, and the signer will no longer be able to access it via email, SMS, or WhatsApp links. ### For Senders Regardless of the auto-save setting for invitees, the document is **always saved** in the **Completed** folder of the sender once all required actions are done. > **Info** > > Senders can enable [**Auto-delete Completed Documents**](https://knowledge.leegality.com/document-execution/settings/Department/document-security-settings#auto-delete-after-document-completion) to automatically remove completed documents from **their own account** after a chosen retention period. > > This setting **does not affect the signer’s copy**. If a signer has saved their copy, they will still be able to access it even after the sender’s copy is deleted. ## Expired The **Expired** folder contains documents where the **invitation to eSign or review has expired** before any invitee took action. In other words, these documents are considered **completely unsigned** — no invitee has signed or reviewed them. **As soon as a document expires:** * Invitees can no longer access or sign the document. * eSign credits are automatically reverted back to the unused pool. * If the expired document includes affixed stamps, the document is deleted immediately upon expiry. The status of those stamps is reset to Unused, making them available for future use. Unsigned documents in the Expired folder are automatically deleted after 30 days from the date of expiry. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/find-documents # Find Documents You can find documents using search, filters, and Quick Access. This guide explains how to effectively use these methods to locate documents within your account. ## Quick Access Quick Access categorizes your documents to help you quickly identify and manage the ones requiring immediate attention. - **Action Required:** Documents awaiting your action, such as signing, reviewing and/or drafts waiting to be sent for signing. - **Waiting for Others:** Documents you sent that are pending signatures or reviews from others. - **Expiring Soon:** Documents that will expire in a few days and may require action from you or other invitees. - **Failed:** Documents that expired due to reasons like invitation timeout, retry attempt exhaustion, or certificate details mismatch. - **Rejected:** Documents you sent but were rejected by the reviewer. ## Search Documents Use the Search box at the top right of your Documents section to find documents by: - Document name - Document ID - IRN (Internal Reference Number) > **Tip** > > The search returns both exact and partial matches and is case-insensitive. 1. Select a category (**Sent, Received, CC, Drafts, Completed, Expired** or any **Quick Access** option). 2. Enter the search term in the search box at the top right corner. 3. Matching results will appear in real time as you type. **Example:** If you selected Sent, only documents in the Sent category will be shown. ## Filter Documents Filters help you find documents based on selected criteria for a more detailed search. > **Tip** > > You can use filters and search together to narrow down search results. ### To Apply Filter 1. Select a category (**Sent, Received, CC, Drafts, Completed, Expired** or any **Quick Access** option.) 2. Available filters will appear on the right. 3. Select filter(s) and the document list will update based on the selected filter. ### General Filters These filters are available in multiple statuses such as Completed, Waiting for Others, Expiring Soon, Expired, and Rejected. - **Workflow Used:** To find documents created using a specific workflow. - **Creation Mode:** To find documents created using Dashboard Workflow, API Workflow, Excel Workflow, and Non-Workflow. ### Filter by Document Status #### Sent - **Document Status:** To find documents you’ve sent - **Partially Signed:** At least one invitee has completed the assigned activity (sign or review). #### Received - **Invitation Status:** To find documents you’ve received. - **You Signed:** You have signed the invitation. - **Pending your signature:** The invitation is pending your signature. - **Pending your review:** The invitation is pending your review. - **You reviewed - Accepted:** You have reviewed and accepted the invitation. - **You reviewed - Rejected:** You have reviewed and rejected the invitation. #### Action Required - **Status:** To find the documents based on their current status. - **Draft:** Documents you have created and saved but not sent yet. - **Pending your signature:** Documents require your signature. - **Pending your review:** Documents you need to review. #### Failed - **Failure Reason:** Filter documents according to failure reasons. - **Invitation Expired** - **Certificate Detail Mismatch - Accepted** - **Certificate Detail Mismatch - Rejected** - **Aadhaar eSign - Retry Attempt Exhausted** --- URL: https://knowledge.leegality.com/document-execution/manage-documents/how-to-edit-a-document # How to Edit an Invitation You can edit the details of invitations you have sent but have not completed yet. You can modify the invitee's name, eSign type, invitee level and signing journey options. > **Info — note** > > You can only edit details of invitees who haven't signed or reviewed. ## To Edit an Invitation In the Documents section, find the document you want to edit. 1. Click the **Three Dots (⋮)** and select **Edit**. 2. You have options to edit the name, eSign type, invitee role, and change invitee-level options. 3. After completing your edits, click **Next**. 4. Finalise the signing coordinate position. 5. Once finished, click **Send**. ## Details you can Edit in an Invitation ### Invitees Level Options For invitees who haven't signed yet, you can enable/disable and edit: #### Invitee Information - Invitee Name - Invitee Role - eSign Type #### Aadhaar Preferences - Prioritize Aadhaar for Invitee - Define maximum Aadhaar signing attempts #### Signature Appearance - Prevent invitee from editing name in signing journey - Hide invitee's name in signature appearance #### Document Requirements - Require company seal from invitee - Require invitee to upload supporting documents - Allow viewing of all invitees' supporting documents #### Security and Permissions - Enable security features - Allow the signer to reject the document #### Notifications and Communication - Send Email Notifications - Send SMS Notifications - Add custom URLs and webhooks #### Consent and Payment - Set additional consent terms - Collect Payment ### Signing Journey Options You can edit any of the signing journey options. - Extend or reduce the expiry of the document. - Add a custom message for remaining the invitees - Upload reference attachment for the remaining invitees - Auto delete document after completion ### Documents You can only change the singing coordinates in the document. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/resend-a-document # Resending an Invitation When you send a document for eSign, Leegality sends an original notification to each invitee through the channels you've enabled (email, SMS, and/or WhatsApp). You can also resend notification manually to the invitee. They receive the same signing URL that was sent in the original notification. The resend notification type will be the same as it was selected during the sending journey for the invitee. > **Info — Note** > > You can resend a notification only if the document is still active for the invitee. ## To Resend an Invitation 1. In the Documents section, [find the document](https://knowledge.leegality.com/document-execution/manage-documents/find-documents) containing the invitee you wish to resend the notification to. 2. Click on the document name to open the Detail View. 3. In the **Invitee List**, you can see all active and inactive invitees. 4. For active invitees, you can: - **Resend Notification:** Click to instantly send another eSign notification. - **Re-invite:** If the invitee has rejected the eSign request, the status will be `Unsigned` and `Rejected`. Click **Re-Invite**, optionally add a message, and confirm to send the invitation. The invitee will receive a notification consisting of the signing URL of the document. > **Info** > > You can use **Resend Notification** up to four times per invitee. > **Tip** > > Alternatively (or after you've used all four resends), click **Copy URL** button in the invitee card to copy the signing URL and share it with the invitee through their preferred mode of communication. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/sign-documents-in-your-account # Sign Documents in your Account The Leegality dashboard allows you to sign the documents you received and is awaiting your signature. You can sign one document at a time or select multiple documents and sign them in bulk. ## Sign one document 1. From the Documents section, click on the **Action Required** under **Quick Access** in the left navigational panel. This list shows the documents that require your action, including those that need signing and review. 2. Find the document you want to sign and click the **Sign** button on the right. 3. This initiates the signing journey, allowing you to complete signing the document. Once signed, the document moves to the Completed section. > **Info** > > To sign multiple documents in bulk, use [**DSC-Token bulk signing**](https://knowledge.leegality.com/document-execution/esign-type/dsc-token#bulk-sign-using-dsc-token). --- URL: https://knowledge.leegality.com/document-execution/manage-documents/share-documents # Share documents You can share documents with internal team members and external users through multiple methods. Each method serves different purposes depending on who needs access and what level of visibility they require. ## Sharing methods overview Leegality provides four ways to share documents: | Method | Internal users | External users | Scope | Best used for | |--------|----------------|----------------|-------|---------------| | CC invitee | ✓ | ✓ | Single document | Real-time updates during signing process | | Impersonator mode | ✓ | ✗ | All user documents | Admin and granted user can access documents | | Completion notifications | ✓ | ✓ | All completed documents | Automated notifications when documents are signed | | Share specific document | ✓ | ✓ | Single document | One-time sharing of completed documents | ## Share with CC invitees Add a CC invitee to keep someone informed about a specific document's progress. CC invitees receive notifications throughout the document lifecycle, including when invitations are sent, signed, approved, rejected, or when the document is completed. > **Info — Note** > > This method shares a single document while it's in progress. The CC invitee receives notifications but cannot sign or review the document. Learn how [**to add a CC invitee**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/cc). **Use this method when:** - Someone needs to monitor a specific document's progress - You want to keep stakeholders informed without giving them signing responsibilities - Both internal team members and external users need visibility ## Share via impersonator mode Impersonator mode allows admins to grant specific team members access to another user's entire document collection. This is an internal-only feature designed for administrative purposes. When you grant impersonator access, the authorized user can: - View all documents in the shared user's account - Download documents and audit trails - Perform administrative actions on behalf of the user > **Warning — Internal access only** > > Impersonator mode is available only for users within your organization. You cannot grant impersonator access to external users. Learn how [**to grant impersonator access**](https://knowledge.leegality.com/document-execution/settings/Admin/impersonator-mode#grant-impersonator-access-to-users). **Use this method when:** - Team members need ongoing access to another user's documents - Providing administrative support or troubleshooting - Managing documents when users are unavailable ## Share via completion notifications Configure completion notification recipients to automatically receive email notifications when any document is completed. Recipients receive notifications for all completed documents, not just specific ones. > **Info** > > Learn how [**to add completion notification recipients**](https://knowledge.leegality.com/document-execution/settings/Notifications/notification) **Use this method when:** - Finance, legal, or compliance teams need to be notified of all completed documents - You want automated notifications without manual sharing - Both internal team members and external users need to be informed ## Share specific document and audit trail Share a completed document and its audit trail directly via email. This is a one-time sharing action for individual documents. **To share a specific document:** 1. Navigate to the **Completed** section under documents. 2. Find the document you want to share and click on the **⋮** and select **share**. 3. Enter the email address of the recipient. (**Note:** You add up to 15 email addresses.) 4. Click **Send**. The recipient receives an email with the completed document and its audit trail attached. **Use this method when:** - You need to share a specific completed document once - The recipient needs both the document and audit trail - You want immediate, ad-hoc sharing without ongoing access --- URL: https://knowledge.leegality.com/document-execution/manage-documents/delete-a-document # Deleting a Document You can delete drafts and documents you have sent (under-progress, rejected, failed, expired, and completed). Deleting a document revokes all outstanding signer and reviewer invitations. > **Warning** > > Once you delete a document from your account, it cannot be retrieved. ## How to Delete a Document 1. In the Documents section, [search for the document](https://knowledge.leegality.com/document-execution/manage-documents/find-documents#search-documents) you want to delete. 2. Click on the **Three Dots (⋮)** and select **Delete**. 3. Confirm your action by clicking on **Delete**. > **Tip** > > You can download audit trails for completed documents that have been deleted from the activity logs. ## What happens when you delete ### Documents you sent Deleting a document has varying impacts depending on its status. The effects of deletion are as follows: #### Sent Documents (Under-Progress) As the sender, deleting a sent document that is under-progress revokes any outstanding signing and reviewer invites. - Invitees who haven’t signed yet but have an active invitation will be notified that the invitation was revoked. - Invitees who have already signed the document will be unable to access it and will receive a notification that the invitation was deleted. - Future invitees, who are later in the signing order, will not receive any notifications regarding the invitation. #### Completed Documents If you delete a completed document where all invitees have signed the document, the document and invitee are unaffected. Invitees can still view and download the document. ## When Are Invitees Notified? When a completely unsigned document is **deleted** Leegality notifies the invitees about the cancellation, depending on the notification settings. **When notifications are _enabled_ at the invitee level:** * The invitee will receive a notification stating: > *“The sender has revoked the invitation sent to you to eSign the document.”* * This applies **even if** the sender deletes the document **after** it has expired. **When notifications are _disabled_:** * The invitee **will not receive** any communication about the revocation of the document. > **Tip** > > Learn [**how to configure notification for each invitee**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/email-notifications) during the sending journey. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/delete-an-invitation # Deleting an Invitation You can delete an invitee's invitation at any stage of the signing journey, except after they have already signed the document. Once an invitee has signed, their invitation cannot be deleted individually — however, you can still [delete the entire document](https://knowledge.leegality.com/document-execution/manage-documents/delete-a-document). > **Info — Note** > > No email or message notification is sent to the invitee when their invitation is deleted, regardless of their status. ## How to Delete an Invitation 1. Go to the **Documents** section and select the document. 2. On the document details page, click the **Three Dots (⋮)** next to the invitee you want to delete. 3. Select **Delete**. 4. Confirm the deletion from the popup. ## What Happens When You Delete an Invitation ### Active and Unsigned An active invitee is one who has already received the signing invitation. If their invitation is deleted: - They are removed from the document without any notification. - Since they received an invitation email or message earlier, if they attempt to sign using the link they received, they will encounter an error page and will not be able to complete the signing. ### Inactive and Unsigned An inactive invitee is one who has not yet received the signing invitation (for example, they are later in the signing order and the previous invitee has not signed yet). If their invitation is deleted: - They are removed from the document without any notification. - Since they never received a signing invitation, no further action is required on their end. > **Info — Note** > > The sender cannot manually make an invitation inactive. They can, however, mark an inactive invitee as active. ### Rejected An invitee who has rejected the signing invitation can also be deleted. No notification is sent in this case either. ## Impact on Signing Order When an invitee is deleted, the signing journey does **not** automatically continue to the next person. The sender must **manually activate the next invitee** to send the signing invitation to them. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/folders # Folders Folders provide a way to organise your documents. Leegality dashboard has some pre-built sections including Sent, Received, Draft, Completed, and Expired. However, folders give you flexibility if you want to categorise your documents any other way. > **Info — note** > > The order of folders is determined by creation time, with the earliest created folders appearing at the top of the list and newly created folders at the bottom. ## Create, Edit, Delete, and Move Folders 1. Go to the Documents section. - To **Create a Folder**: 1. In the **Folders** pane of the left, click the **+** icon. 2. In the Create Folder dialog, enter the desired **folder name**. 3. Click **Confirm** to create a folder. The new folder will appear in the list. - To **Create a subfolder**: 1. In the list of folders, find the parent folder in which you want to create a sub-folder. 2. Click the **Three dots (…)** and select **Create subfolder**. 3. In the Create folder dialog, enter the name and click **Confirm**. You can create multiple levels of sub-folders like this. - To **Edit or Delete a folder or subfolder**, click on the **three dots (…)** next to the folder. 1. To edit the folder name, select **Rename**. 2. To delete the folder, select **Delete**. **Note:** Deleting a folder will not delete the documents within it. - To **move a folder**: 1. Find the folder you want to move. 2. Click on the icon next to the folder and select **Move to folder**. 3. In the Move to folder dialog box, choose where you want to move the folder. You can move the folder into the existing folder or create a new parent folder. ## Move Documents to a Folder 1. In the Documents section, select the document you want to move. 2. Click on **Three dots (⋮)** and select **Move to folder**. 3. In the Move to folder dialog box, select the folder in which you want the document(s). Click **Move here**. > **Info — Note** > > Moving a document to a folder does not remove it from its original location. > > **For example**, if you move a document from the Completed section to a subfolder, it will appear in both places. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamps # Stamps Overview The Stamps section gives you complete access to Stamp Series and Stamp Groups. Here, you can efficiently manage all stamp-related activities, including: - [**Creating new Stamp series**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series) and [**Stamp groups**](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups) - [**Purchasing stamps**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/purchase-stamp-series) - [**Viewing consumption history**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/consumption-history-of-stamps) - Inventory management The stamp section has been divided into two parts: - **Stamp Series:** Stamp Series is required to purchase the stamp papers of a specific state and denomination. It also helps you keep track of how and when the stamp papers are used. - **Stamp Groups:** A Stamp Group is a collection of various stamp series of different denominations combined. This grouping allows you to pay [**variable stamp duty**](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups). > **Info — Note** > > The stamps section will only be visible if the stamp module is included in your subscription plan. ## Types of Stamps --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/stamp-series # Stamp Series Stamp Series is a system that helps you order and track stamp papers easily. Here's how it works: 1. **Store Your Information:** It saves details about the stamp papers you want to purchase and their delivery address. 2. **Easy Ordering:** You can order stamp papers without re-entering the same information each time. 3. **Inventory Management:** Monitor your stamp usage and manage your inventory effectively 4. **Track Your Stamps:** All your stamp papers are tracked in the system, so you can see where they are in the delivery process. In short, Stamp Series makes ordering and tracking stamp papers simple and convenient by remembering your preferences and shipment details. To access your Stamp Series, select **Stamps** on the top bar and **Series** on the left. The Stamp Series section is divided into three categories: - **All:** Displays all stamp series. - **Starred:** Displays stamp series you have marked as ⭐starred for quick access. - **Draft:** Displays stamp series that are in the draft stage. ## Table overview The table provides an overview of each stamp series with the following actions and information: - Stamp Series Details - [Purchase Stamp Papers](https://knowledge.leegality.com/document-execution/stamps/stamp-series/purchase-stamp-series) - [Edit Stamp Series](https://knowledge.leegality.com/document-execution/stamps/stamp-series/edit-stamp-series) - [Consumption History of stamps](https://knowledge.leegality.com/document-execution/stamps/stamp-series/consumption-history-of-stamps) - [Extend Expiry of stamps](https://knowledge.leegality.com/document-execution/stamps/stamp-series/extend-expiry-of-stamps) ### Stamp Series Details - **Series Number:** A unique number assigned to each stamp series. This helps identify the stamp series during purchase, group stamp creation, and document initiation. (**Note:** This is auto-generated by Leegality.) - **State:** Displays the state name corresponding to the stamp paper. - **Series Name:** Name of the stamp series assigned by the creator of the series for identification - **Denomination:** Indicates the value of the stamp paper(s) contained in the series. ### Stamp Statuses - **Unused:** Stamps available for use when sending documents for execution. - **Reserved:** Number of stamps affixed to documents currently waiting to get eSigned. > **Info** > > If the document remains unsigned these stamps are credited back to the Unused state. - **Used:** Number of stamps affixed to documents that have been signed. - **Blocked:** Number of blocked stamp papers that are not eligible for digital document creation. - **In Process:** Number of stamps purchased and currently under procurement. - **Expired:** Displays the count of stamps for which the expiry date has passed. You can [extend the expiry date](https://knowledge.leegality.com/document-execution/stamps/stamp-series/extend-expiry-of-stamps) to continue using these stamps for digital document execution. - **Total:** The total number of stamps purchased to date. > **Tip** > > You can add or remove columns by clicking on the (**III**) icon in the table header. ### Needs attention ![Needs Action](https://knowledge.leegality.com/img/needs-action.png) - **Expiring Soon:** Indicates the number of stamp papers expiring in the next 30 days. You can directly extend the expiry date from here. - **Low Balance:** Indicates that you have consumed 100% of your last purchase quantity. You can directly purchase from here. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series # Create a Stamp Series You need to create a **Stamp Series** in order to purchase the stamp papers of a specific state and denomination via Leegality. The series can be reused for purchasing more stamp papers as needed, and it also allows you to monitor their usage. 1. Click on the **+ Create** button on the top bar and select **Stamp Series** option. 2. Fill in the required information across the following sections. ## Basic Information - **Series Name**: Enter a unique name to identify this stamp series for easy reference and tracking. > **Info — Character Limit** > > You can enter a maximum of 20 characters for the series name. Allowed inputs include alphanumeric characters and the following special characters: **| - : () , _ . [] & / # + @ ; ' –** ## Stamp Paper Information - **State**: Select the state for which you need to procure stamp papers from the dropdown list. - **Purpose/Article Code**: Select the article code that represents the legal classification of your agreement type. This determines the stamp duty rates and compliance requirements applicable to your document. Note that you must select a state before this field becomes available. > **Info — Selection Requirements** > > - Only agreement types already configured for the selected state will appear in the dropdown > - The article code must be selected before you can specify the denomination - **Denomination (₹)**: Specify the stamp duty value to be affixed on your stamp papers. The available denomination options depend on the state and article code you selected. Denomination field changes according to the scenarios below: - **Range-based denominations**: If the selected state supports a range of denominations(For intance from ₹10 to ₹500), you must enter a value within this range. Values outside this range will result in an error. - **Fixed denomination**: For certain states and article codes, the denomination will be fixed and cannot be modified. The field will display the predetermined value. - **Mixed options**: Some states allow specific fixed values up to a threshold, then offer a range beyond that. (For example: ₹20, ₹50, ₹100, and then any value from ₹100 to ₹5000). Available fixed values appear in a dropdown, while invalid denominations trigger an error message. - **Consideration Price calculation**: For certain agreement types, an additional field called **Consideration Price** appears. Enter the transaction value here, and the system automatically calculates 2% stamp duty and populates the denomination field. > **Info — Denomination Rules** > > - Decimal values are not allowed in the denomination field > - Always verify that your entered value matches the permitted range or options for your selected state and article code > **Warning — Important** > > The **State, Purpose/Article Code, Denomination** fields cannot be changed once the stamp papers have been procured. Choose carefully before proceeding. - **First Party Name**: Enter the legal name of the first party involved in the agreement. You can enter a maximum of 52 characters for this field. - **Second Party Name**: Select or enter a generic name representing the second party in the agreement. You can choose from the preapproved dropdown list or provide a custom name based on your organization's entitlements. Note that you cannot change the Second party names once the stamp series is created. > **Info — NOTE** > > - The second party name must be generic rather than a specific individual or company name (e.g., Borrower, Tenant, Contractor, Customer, Vendor, Lender) > - Available options in the dropdown vary based on the state you selected > - You can only select the second party name after entering the first party name > - The ability to provide a custom name depends on your organization's configuration. Contact **support@leegality.com** for more information about custom name entitlements. - **Purchased By**: Enter the name of the entity or individual purchasing the stamp paper. This is a mandatory field and can be different from the first and second parties involved in the agreement. > **Info — NOTE** > > You can enter a maximum of 52 characters for this field. - **Stamp Duty Paid By**: Select the entity or individual who paid the stamp duty to procure the stamp papers. You must choose either the first party or the second party from the dropdown. ## Legend Configuration - **Legend Content**: Specify the text to be printed on the physical stamp papers. This content must include Leegality's Document ID, which is a unique identifier that links the stamp paper to its corresponding document in the system. > **Info — Auto-fill and Editing** > > - The system automatically populates this field with the first and second party names > - You can edit the legend content according to your requirements > - You can use alphanumeric characters and these special characters: **+ | - : () , _ . [] & / @ # ; ' –** > - Maximum allowed length is 255 characters and can span up to 8 lines > **Warning — Document ID** > > Do not remove or modify the Document ID from the legend content. This identifier is essential for tracking and linking the stamp paper to its document. ## Shipping Information Provide the delivery details for shipping the physical stamp papers to the correct recipient. - **POC Name**: Enter the full name of the point of contact who will receive the stamp paper delivery. - **POC Phone Number**: Provide the phone number of the point of contact for delivery coordination. - **POC Email Address**: Enter the email address of the point of contact. The procurement team will use this email to communicate updates about the stamp procurement process and delivery status. - **Address**: Enter the complete delivery address where the physical stamp papers should be shipped. > **Tip — Quick Address Entry** > > Enter the Pincode first, and the system will automatically populate the City and State fields for you. 3. Once you have completed all the required fields, click on the **Create Series** button. The newly created stamp series will appear in your stamp series list and will be ready for purchasing stamp papers. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/purchase-stamp-series # Purchase Stamp Papers > **Tip — Prerequisite** > > You must [**create a stamp series**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series) in order to purchase stamp papers. You can purchase the stamp papers of a series directly from the Stamps section. To Purchase Stamp Series 1. Navigate to **Stamps > Series**. 2. Locate the Stamp Series you wish to purchase by searching using the series name or number. 3. Click the Cart icon on the right. 4. Specify the quantity of stamp papers needed. 5. Proceed to checkout. 6. Review your order details and click **Confirm**. 7. Select your payment method (credit card, debit card, UPI, net banking, wallet, or EMI) and click **Pay**. > **Info** > > After a successful payment, the stamp procurement process begins and usually takes 7-10 business days. Once completed, the purchased stamps will be available in your account. ## Bulk Purchase - Multiple Stamp Series 1. Select the checkbox for each stamp series you want to purchase. 2. Enter the required stamp paper quantity for each selected series. 3. Click **Purchase** and review your order details. 4. Click **Confirm** to proceed. 5. Choose a payment method (credit card, debit card, UPI, net banking, wallet, or EMI) and click **Pay**. ## Check Stamp Procurement Status You can monitor the status of your stamp order by clicking on the Procurement detail icon. This is visible only during active procurement for a series. Upon clicking the icon, you can view: - **Order Date:** Date when the order was placed. - **Order Quantity:** Number of stamps purchased. - **Estimated Due Date:** Expected date when the stamps will become available for use on the dashboard. - **Updated Due Date:** Revised due date in case of delays. - **Reason:** Explanation for any delays. ## Minimum Order Quantity (MOQ) for Stamp Paper Purchase There is no minimum order quantity requirement for purchasing stamp papers. Customers can place an order even for a single stamp paper. However, the applicable convenience fee and handling charges will be charged as follows: - **Basic/Personal Plan:** Convenience fee equivalent to 30 stamp papers per state and handling charges of ₹500 per state. - **Enterprise Plan:** As per the agreed commercial terms ### Convenience Fee Calculation (Basic/Personal Plan) - 30 × ₹45 = ₹1,350 convenience fee - Per state handling charges: ₹500 ### Important Points #### **Same State, Different Series** If a customer orders stamp papers from the same state but with different series, only one convenience fee equivalent to 30 stamp papers + 500 Handling fee will be charged. For example, if a customer purchases 1 stamp paper from Delhi 03 and another 1 stamp paper from Delhi 04, only one convenience fee, equivalent to 30 stamp papers, i.e., **₹1350, along with a ₹500 handling fee,** will be charged, since both stamp papers belong to the same state.   #### **Different States** If a customer orders stamp papers from multiple states, the convenience fee equivalent to 30 stamp papers will be applied separately for each state, along with ₹500 handling charges per state. For example, if a customer purchases 1 stamp paper from Delhi 03 and another 1 stamp paper from Maharashtra 02, the convenience fee equivalent to 60 stamp papers will be charged (30 for Delhi + 30 for Maharashtra), along with a handling fee of ₹500 per state. ### Why is the Convenience Fee Charged Even for a Single Stamp Paper? The stamp paper must first be procured from the respective state and sent to us via courier. Once received, we digitise the stamp paper, upload it to the system, and dispatch it to the customer via courier. These operational and logistics costs remain the same regardless of whether the customer orders one stamp paper or multiple stamp papers. ## FAQ **Can I get a refund on a stamp purchase?** > No, stamp purchases through Leegality are non-refundable. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/edit-stamp-series # Edit a Stamp Series You have the option to edit a stamp series that you have already created. To do this; 1. Navigate to **Stamps > Series** 1. Find the stamp series you want to edit. You can search for it by using the series name or number. 2. Click on the Series or **Three Dots (︙)** and **Open**. 2. In the edit view, you can modify the following details: - **Series Name** - **Series Information** - First Party Name - Second Party Name - Purpose/Article Code - Purchased By - Stamp Duty Paid By - **Legend Configuration** - Legend Content - **Shipping details** - POC Details - Shipping Address 3. Click **Save** after making the desired changes. > **Info** > > - Changes will apply to all future orders placed with this stamp series. > - Changes will not affect stamps that are already in the procurement process or those currently available for use. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/extend-expiry-of-stamps # Extend Expiry of Stamps When using stamp papers procured via Leegality, each stamp has a default expiry date of 6 months from the date of purchase. > **Tip — Example** > > If the stamps' purchase date is 01-January-2024, they will expire on 01-July-2024. Beyond this period, the stamp papers are automatically categorized as expired and removed from usable circulation. > **Info — Note** > > This Expiry date is an internal policy of Leegality and does not hold any regulatory significance in a legal context. To continue using beyond the default 6-month period, Leegality provides an Extend Expiry Date option within the dashboard. You must have admin access to extend expiry date of stamps. ## To Extend the Expiry of Stamps 1. From your Leegality Dashboard, navigate to **Stamps > Series**. 2. Find the stamp series with expired stamps that you want to extend. You can search using the series name or number. 3. Click on **Three Dots (⋮)** and select **Extend Expiry**. 4. Each row represents stamps based on the **Purchase Date** and **Expiry Date**, along with the quantity of stamps falling into this combination. 5. Select the row(s) for which you intend to extend the expiry date, then specify the **number of days** you wish to extend it. > **Tip — Example** > > Suppose the **Expiry Date** is 31-March-2024, and you specified an **additional 100 days**. The new expiry date will be 09-July-2024. 6. Click **Extend**. > **Info** > > Expiry dates can be extended regardless of whether the stamp papers are expired or not. ## Legal Validity vs Platform Expiry The expiry shown in the Leegality dashboard is a **platform expiry** — a soft 6-month default that an admin can extend internally. **Legal validity** is governed by your state's stamp laws and is independent of the dashboard setting. In the following states, stamp papers have a strict, non-extendible **6-month legal validity** by law. Extending the expiry in the Leegality dashboard does **not** extend legal validity in these states: - Maharashtra - Rajasthan - Gujarat - Karnataka > **Warning — IMPORTANT** > > The legal validity of stamps is governed by the respective state laws. Extending the expiry on Leegality does not extend it from a legal perspective. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/block-stamp-papers # Block Stamp Papers The block stamp feature in Leegality enables users to remove specific stamp papers from the Unused category, thereby preventing them from being affixed to the document during sending journeys. **When to Block Stamp Papers?** You need to block a stamp paper when it is intended for physical use and to avoid its utilization in digital workflows via Leegality. > **Warning** > > Blocking stamp papers is an irreversible action. ## Steps for Blocking a Stamp Paper 1. Navigate to **Stamps > Series** from the top bar. 2. Click on the relevant stamp series to access the stamp papers associated with it. 3. Go to the **Stamps** tab to access all stamp papers. 4. This page will display the complete list of stamp papers procured for that series. 5. Locate the specific stamp paper you want to block within the list. You can also select multiple stamp papers and block them in one click. 6. Click on the 🚫 icon to block single stamp paper. You can also select multiple and click on the **Block** button at the top. 7. Confirm the action to block the selected stamp papers. > **Info — Note** > > Only unused stamp papers can be blocked. Your stamp paper is now successfully blocked and cannot be used for digital document creation. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/download-stamp # Download stamps You can download your purchased stamps as PDF files. This is useful when you need to physically print and use stamp papers. ## Download a stamp paper 1. Navigate to **Stamps > Stamp Series**. 2. Click the stamp series whose stamps you want to download. 3. Click the **Stamps** tab to view all stamp papers in this series. 4. Hover over the stamp paper and click the preview icon ![Preview Stamp Paper Icon](https://knowledge.leegality.com/img/Icon=eye.svg). 5. In the preview panel, click the download icon ![Download Stamp Paper Icon](https://knowledge.leegality.com/img/Icon=download.svg). The stamp paper PDF downloads to your device. > **Warning — Block stamps before physical use** > > If you plan to use the stamp paper physically, you must [**block the stamp paper**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/block-stamp-papers) before downloading. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/consumption-history-of-stamps # Consumption History of Stamps The Consumption History section provides detailed records of how each stamp has been used, including: - Credits - Debits - Associated document IDs - Transaction dates It covers information for all stamp series and individual stamps within each series. You can access the Consumption History by: 1. Navigate to **Stamps > Series**. 2. Locate the Stamp Series whose history you want to check. 3. Click on the **Three Dots (⋮)** and select **History**. Here you can access the consumption history for your stamps. You can also customize your view by specifying a date range and transaction type (*credit, debit, reserve, release, and reduce*) for each stamp series individually. ## Stamp Consumption Details The Stamp Consumption History provides the following information: - **Series Number:** Identifies the stamp series for which consumption history is being viewed. - **Transaction:** Details the type of transaction: credit, debit, reserve, or release. - **Reference ID:** Document IDs associated with stamp usage in document transmission. (**Note:** Document IDs may repeat if invitations are revoked or expired.) - **Date:** Records the date of each transaction. - **Remark:** Provide additional details regarding each transaction. - **Release Date:** Indicates when stamps are released from reserve, whether credited or debited. - **Debit:** Displays the number of stamps deducted from the account for the relevant transaction. - **Credit:** Shows the number of stamps credited to the account, either through release or purchase. - **Balance:** Reveals the remaining number of stamps in the account for the specified series at the time of this transaction. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-series/stamp-report # Stamp Series Report You can download an inventory report of a series from the Stamps listing page ## To Export Stamp Details 1. Open the stamp series for which you want to download the report. 2. In the detail view, go to the **Stamps** tab. 3. You will see a list of all stamp papers associated with that series. 4. You can use the Status filter to narrow the list by: Used, Unused, Blocked, Expired, and In Process. 5. Click the **Generate Report** button. 6. Choose the details you want to include in the report: - **Document ID** - **Stamp Serial Number** - **Status** - **Last Updated On (Date and Time)** - **Purchased On (Date and Time)** - **Expiry Date** 7. Click **Export** to download the report. An Excel file will be downloaded to a local device. The file name format will be Stamp *Series Number_State_Denomination*. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups # Stamp Group Stamp Groups allow paying variable stamp duty on documents by letting you choose stamps of various denominations to meet the required amount. > **Tip — Example** > > **Understand Stamp Groups with an example.** > > Let’s say you need an 850-rupee stamp for an agreement in Maharashtra. The available stamp denominations are 200, 500, and 1000 rupees. > > - **Without Stamp Groups:** You would need to use a 1000-rupee stamp, which results in an extra payment of 150 rupees. > - **With Stamp Groups:** With stamp group, you simply enter the required stamp value, and Leegality's algorithms automatically select the combination of stamps that meet your exact needs. This eliminates the hassle of manually picking stamps and ensures you only pay what is required. This feature is especially useful for documents where the stamp duty is a percentage of the agreement value (ad-valorem). Instead of dealing with fixed stamp values, Stamp Groups allow you to tailor the stamp duty to match the exact amount needed for your document, saving you both time and money. ## Create a Stamp Group 1. Click on the **Stamps** on top and select **Groups** from the left. 2. Click on the **+ Create** button on the top right. 3. Enter a suitable **Group Name**. 4. Select a **State** to be associated with this group (e.g., Delhi). > **Info — Note** > > The state cannot be changed once the stamp group is created. 5. Specify the **Maximum Stamp Value** for this stamp group. This is the highest amount of stamp value that can be used when sending the document. 6. Choose the series of the selected states to be associated with this group. 7. Click **Create**. ## Edit a Stamp Group 1. Click on the **Stamp** and select **Groups** from the left. 2. Find the Stamp Group you want to edit. You can search for it by using the Group Name or Number. 3. Click on the edit icon on the right. 4. You can edit the following details of a stamp group. - **Group Name** - **Maximum Stamp value** - **Add or remove associated stamp series** 5. Once done, click on the **Update** button. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/stamp-procurement-panel # Stamp Procurement Panel The **Stamp Procurement Panel** is a lightweight, self-serve dashboard that enables you to manage stamp series and generate proforma invoices independently, without requiring access to the full Leegality dashboard. This upgrade makes stamp series creation more accurate and fully self-serve with the following enhancements: ## What the Procurement Panel Offers The **Stamp Procurement Panel** provides you with essential stamp management capabilities: - **View All Stamp Series**: Access the complete list of all existing stamp series for your organization. See details including state, denomination, available stamps, and status at a glance. - **Create and Edit Stamp Series**: Based on your access level, you can: - Create new stamp series with state-specific configurations - Edit existing series details - **Generate Proforma Invoices**: Download proforma invoices for your stamp purchases directly from the panel, streamlining your procurement and accounting processes. ## Access the Stamp Procurement Panel ### How to Get Access The **Stamp Procurement Panel** is not publicly accessible. Access to the **Stamp Procurement Panel** is restricted and provided on a per-organization basis by the Leegality support team. Only users with authorized email addresses can log in to the panel. If you need access to the **Stamp Procurement Panel**: 1. Contact the Leegality support team at **support@leegality.com** or the Leegality Account Manager of your organisation. 2. The support team will authorise the specified email addresses for your organization. 3. Once authorised, you will receive the access link to log in to the panel. Two types of access are provided for the panel: - **Edit and Create Access**: For those who need to create and edit stamp series from the panel. - **View Access**: For those who require to purchase stamp paper but do not need to create or edit stamp series. > **Info — NOTE** > > User with any level of access can generate proforma invoice. ### Login to Stamp Procurement Panel Follow these steps to log in to the **Stamp Procurement Panel**: 1. Navigate to the Stamp Procurement Panel login page. (The access link will be provided by Leegality support or the AM.) 2. Enter your email address that has been authorized for access. 3. Click the **Send Verification Code** button. 4. An OTP (One-Time Password) will be sent to your email address. 5. Enter the OTP in the verification field. 6. Once authenticated, you will be logged into the **Stamp Procurement Panel** and can access your organization's stamp series and procurement options. > **Info — OTP Validity and Limits** > > - The OTP is valid for **10 minutes** from the time it is sent > - You can resend the OTP after **60 seconds** if you didn't receive it > - You can request a new OTP up to **5 times**. After 5 attempts, you will need to wait before requesting additional OTPs ## Dashboard Overview Once you successfully log in to the **Stamp Procurement Panel**, you will see the main dashboard that displays your organization's stamp inventory and provides tools for managing stamp series and procurement. The dashboard is organized into functional areas including: | Section | Description | Key Features | | :---- | :---- | :---- | | **Top Navigation Bar** | Header section with search and action buttons | • Search by Series Number • **Purchase** button (activates when series selected) • **+ Create** button (admin only) | | **Stamp Series Inventory Table** | Main table displaying all stamp series and their status | • Series Information (ID, State, Article Type) • Denomination • Inventory counts by status • Last Purchase date • **View** button for each series | For detailed information about stamp series fields, inventory statuses, and column descriptions, see the [Stamp Series](https://knowledge.leegality.com/document-execution/stamps/stamp-series) page. ### Viewing Series Details Click the **View** button to open a right-side panel showing complete series details. > **Info — Edit Access** > > If you have edit access, you will see an **Edit** button in the details panel. Learn more about [editing stamp series](https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/edit-stamp-series). ## Getting Started Once you have access to the **Stamp Procurement Panel**, you can: - View all existing stamp series and their inventory status - [Purchase Stamps and Download Proforma Invoice](https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/purchase-and-download-proforma) to order stamp papers and obtain invoices - [Create a Stamp Series](https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/create-a-stamp-series) to set up new stamp configurations (admin access required) - [Edit Stamp Series](https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/edit-stamp-series) to update shipping information and other editable fields (admin access required) > **Tip — Need Help?** > > If you have questions about the **Stamp Procurement Panel** or need assistance with stamp procurement, contact **support@leegality.com**. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/create-a-stamp-series # Create a Stamp Series You need to create a **Stamp Series** in order to purchase the stamp papers of a specific state and denomination via Leegality. The series can be reused for purchasing more stamp papers as needed, and it also allows you to monitor their usage. > **Warning — Edit Access Required** > > Only users with **edit access** can create stamp series in the **Stamp Procurement Panel**. 1. Click on the **+ Create** button on the top bar and select the **Stamp Series** option. 2. Fill in the required information across the following sections. ## Basic Information - **Series Name**: Enter a unique name to identify this stamp series for easy reference and tracking. > **Info — Character Limit** > > You can enter a maximum of 20 characters for the series name. Allowed inputs include alphanumeric characters and the following special characters: **| - : () , _ . [] & / # + @ ; ' –** ## Stamp Paper Information - **State**: Select the state for which you need to procure stamp papers from the dropdown list. - **Purpose/Article Code**: Select the article code that represents the legal classification of your agreement type. Note that you must select a state before this field becomes available. > **Info — Selection Requirements** > > - Only Article codes available for the selected state will appear in the dropdown > - The article code must be selected before you can specify the denomination - **Denomination (₹)**: Specify the stamp duty value to be affixed on your stamp papers. The available denomination options depend on the state and article code you selected. The denomination field behavior varies based on the state and article code configuration: | Denomination Type | Description | Example | | :---- | :---- | :---- | | **Range-Based** | Enter any value within the allowed range for the selected state and article code. Values outside this range will result in an error. | If the range is ₹10 to ₹500, you can enter ₹150, ₹275, etc. | | **Fixed Denomination** | The denomination is predetermined and cannot be modified. The field displays the fixed value automatically. | State XYZ for Article Code ABC always requires ₹100 stamp duty. | | **Mixed Options** | Select from specific fixed values up to a threshold, then enter any value within a range beyond that threshold. Available fixed values appear in a dropdown. | Fixed options: ₹20, ₹50, ₹100. Range option: Any value from ₹100 to ₹5000. | | **Consideration Price-Based** | An additional **Consideration Price** field appears. Enter the transaction value, and the system automatically calculates stamp duty (typically 2%) and populates the denomination field. | Enter Consideration Price: ₹100,000. System calculates and sets denomination as ₹2,000. | > **Info — Denomination Rules** > > - Decimal values are not allowed in the denomination field > **Warning — Important** > > The **State, Purpose/Article Code, Denomination** fields cannot be changed once the stamp papers have been procured. Choose carefully before proceeding. - **First Party Name**: Enter the legal name of the first party involved in the agreement. You can enter a maximum of 52 characters for this field. - **Second Party Name**: Select or enter a generic name representing the second party in the agreement. You can choose from the preapproved dropdown list or provide a custom name based on your organization's entitlements. Note that you cannot change the Second party names once the stamp series is created. > **Info — NOTE** > > - The second party name must be generic rather than a specific individual or company name (e.g., Borrower, Tenant, Contractor, Customer, Vendor, Lender) > - Available options in the dropdown vary based on the state you selected > - You can only select the second party name only after selecting the state. - **Purchased By**: Enter the name of the entity or individual purchasing the stamp paper. This is a mandatory field and can be different from the first and second parties involved in the agreement. > **Info — NOTE** > > You can enter a maximum of 52 characters for this field. - **Stamp Duty Paid By**: Select the entity or individual who paid the stamp duty to procure the stamp papers. You must choose either the first party or the second party from the dropdown. ## Legend Configuration - **Legend Content**: Specify the text to be printed on the physical stamp papers. This content must include Leegality's Document ID, which is a unique identifier that links the stamp paper to its corresponding document in the system. > **Info — Auto-fill and Editing** > > - The system automatically populates this field with the first and second party names > - You can edit the legend content according to your requirements > - You can use alphanumeric characters and these special characters: **+ | - : () , _ . [] & / @ # ; ' –** > - Maximum allowed length is 255 characters and can span up to 8 lines > **Warning — Document ID** > > Do not remove or modify the Document ID from the legend content. This identifier is essential for tracking and linking the stamp paper to its document. ## Shipping Information Provide the delivery details for shipping the physical stamp papers to the correct recipient. - **POC Name**: Enter the full name of the point of contact who will receive the stamp paper delivery. - **POC Phone Number**: Provide the phone number of the point of contact for delivery coordination. - **POC Email Address**: Enter the email address of the point of contact. The procurement team will use this email to communicate updates about the stamp procurement process and delivery status. - **Address**: Enter the complete delivery address where the physical stamp papers should be shipped. 3. Once you have completed all the required fields, click on the **Create Series** button. The newly created stamp series will appear in your stamp series list and will be ready for purchasing stamp papers. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/edit-stamp-series # Edit Stamp Series Once you have created a stamp series in the **Stamp Procurement Panel**, you may need to update certain details such as shipping information, party names, or legend content. This guide explains how to edit an existing stamp series. > **Warning — Edit Access Required** > > Only users with **edit access** can create and edit stamp series in the **Stamp Procurement Panel**. ## Editable and Non-Editable Fields ### Editable Fields You can modify the following information in an existing stamp series: - **Series Name** - **First Party Name** - **Purchased By** - **Stamp Duty Paid By** - **Legend Content** - **Shipping Information** (POC Name, Phone, Email, Address) ### Non-Editable Fields The following fields **cannot be changed** once a stamp series has been created: - **State**: The state selection is permanent and cannot be modified - **Purpose/Article Code**: The legal classification cannot be changed - **Denomination**: The stamp duty value is fixed - **Second Party Name**: The name of the second party cannot be modified after series creation These restrictions ensure compliance with stamp duty regulations and prevent misuse of procured stamp papers. ## How to Edit a Stamp Series Follow these steps to make changes to an existing stamp series: 1. Log in to the **Stamp Procurement Panel** using your authorized email and OTP verification. 2. From the dashboard, locate the stamp series you want to edit in the inventory table. 3. Click the **View** button on the right side of the stamp series row. 4. A right-side panel will slide open, displaying the complete details of the selected stamp series. 5. Click the **Edit** button to enable editing mode for the stamp series. 6. The fields that can be modified will become editable, while locked fields remain grayed out. Update any of the editable fields as needed: > **Warning — Document ID Required** > > Do not remove or modify the Document ID in the legend content. This unique identifier is essential for linking stamp papers to their corresponding documents. 7. Once you have made all necessary modifications, click the **Save** button to apply the changes to the stamp series. - A confirmation message will appear indicating the series has been updated successfully. - The details panel will close, and you will return to the dashboard with the updated series information displayed. 8. If you decide not to save your modifications, click the **Cancel** button. A confirmation popup will appear with two options: - **Keep Editing**: Returns you to the editing panel without discarding changes, allowing you to continue making modifications. - **Discard Changes**: Closes the editing panel and returns you to the dashboard without saving any of your changes. > **Tip — Need Help?** > > If you have questions about editing stamp series or encounter issues, contact the Leegality support team at **support@leegality.com**. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/purchase-and-download-proforma # Purchase Stamp Papers and eSign Credits You can purchase stamp papers for multiple stamp series in one transaction and optionally add eSign credits. You can also generate and download a proforma invoice for approvals and accounting. ## How to Purchase Stamp Papers Follow the steps below to create a purchase: 1. Log in to the **Stamp Procurement Panel** dashboard. 2. Select checkboxes next to the stamp series you want to purchase. 3. Click the **Purchase** button from the top-right corner of the panel. A pop-up appears with your selected stamp series. 4. If there is an existing purchase, you must discard that purchase before creating a new one. Click **Discard and Create New.* 5. Enter the quantity for each stamp series. 6. Remove unwanted items using the *Delete** icon. 7. **Optional: You can also purchase eSign credits along with the stamp purchase.* 1. Click *+ Add Item** in the eSigns section. 2. Select eSign type from the dropdown. 3. Enter the quantity of each eSign type. 4. Repeat to add multiple eSign types. 8. Select a billing profile for the purchase. > **Info** > > Learn how to [create a billing profile in stamp procurement panel](billing-profile.md). 9. Review all items and quantities and click **Generate Proforma Invoice.* 10. The PDF invoice downloads automatically to your device. The proforma invoice includes Leegality's *virtual bank account number, which you can use to transfer funds directly to Leegality.* > **Info — NOTE** > > There is no limit to the number of stamp series you can purchase in a single transaction. You can select and purchase as many stamp series as needed for your organization. ## Deleting an Existing Purchase If you have an existing purchase that you want to discard, you can delete it from the header. The existing purchase can be seen in the header. Click *Delete** to discard the purchase. --- URL: https://knowledge.leegality.com/document-execution/stamps/stamp-procurement-panel/billing-profile # Billing Profile - Stamp Procurement Panel The Stamp Procurement Panel supports multiple billing profiles, allowing you to manage different billing addresses for your purchases. > **Info — NOTE** > > This feature works exactly as it does on the main dashboard. Any changes to billing profiles will reflect in your main account, and this feature is available for both user types of the procurement panel. ## Add New Billing Profile When you review your purchase items and click **Purchase**, a popup appears with billing profile options. If you don't have a billing profile configured, you can create one: 1. Click **Switch**. 2. Select **Add New** from the bottom of the panel. 3. Fill up the details with the following fields: - **Required Fields:** - **Name**: Your name or contact person's name - **Billing Address**: Complete billing address - **City**: City name - **Pincode**: Postal code - **Optional Fields:** - **Company Name**: Organization or company name - **State**: State or province - **Country**: Country name - **GST Number**: Goods and Services Tax identification number - **PAN**: Permanent Account Number > **Tip** > > Ensure all mandatory fields are filled correctly. The billing profile cannot be saved without Name, Billing Address, City, and Pincode. 4. Click **Create**. Your newly created billing profile will be saved and available for future purchases. ## View & Switch Billing Profiles If you have already configured billing profile(s), you'll see your current billing profile with the following options: - Click **Expand** to view the complete billing address details. ### Switch Billing Profile If you have multiple profiles configured, you can switch between them: 1. Click **Switch** to change the billing profile. A list of all configured billing profiles will appear. 2. Select the billing profile you want to use for this purchase. 3. You can also click **Create new billing address** from this list to add a new profile. > **Info — NOTE** > > Deletion of a billing profile can only be done from the main dashboard, not from the Stamp Procurement Panel. ## Edit Billing Profile You can edit any existing billing profile at any time: 1. Click **Edit** to modify the existing billing profile. 2. Make your desired changes to the address information. 3. Click **Update** to save the changes. 4. After choosing or configuring the billing profile, proceed by clicking **Generate Proforma Invoice**. 5. The PDF invoice downloads automatically to your device. The proforma invoice includes Leegality's **virtual account number**, which you can use to transfer funds directly to Leegality. --- URL: https://knowledge.leegality.com/document-execution/stamps/use-stamps # Use Stamps > **Tip — Prerequisites** > > Before using stamps, ensure you have stamp papers in your account: > 1. [**Create a Stamp Series**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series) > 2. [**Purchase Stamp Papers**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/purchase-stamp-series) #### New Document Journey ### Use Stamps in New Document Journey Enable the **Use Stamps** toggle switch. #### Use Stamp Series 1. Enable the **Use Stamp Series** toggle switch. 2. **Single Stamp:** Use one stamp from a single stamp series. - Select the Stamp Series using the dropdown. One stamp from the selected series will be attached to the document. 3. **Multiple Stamps:** Use multiple stamps from multiple stamp series. - Select the Stamp Series using the dropdown. - Enter the number of stamps you want to attach from the selected stamp series. (**Note:** Minimum quantity: 1, Maximum quantity: 99) - Click **\+ Add More** to add stamps from another stamp series. Select the stamp series from the dropdown and specify the stamp quantity. (**Note:** Up to 15 stamp series can be added). >**Note:** If using multiple stamp series, all must be from the same state. Learn [**when to use Multiple Stamp Series**](https://knowledge.leegality.com/document-execution/stamps/multiple-stamp-series-vs-stamp-group). --- #### Use Revenue Stamp [Revenue Stamps](https://knowledge.leegality.com/document-execution/stamps/?type=revenuestamp) are a type of stamp series that are **state-agnostic** — they can be attached to documents regardless of the stamp-duty state, unlike regular stamp series which are tied to a specific state. {/* TODO: replace ARCADE_URL_REVENUE_STAMP_NEW_DOCUMENT with the real arcade URL */} 1. Enable the **Use Revenue Stamp** toggle switch. 2. Select the Revenue stamp series from the dropdown. 3. Enter the number of revenue stamps. One revenue stamp is worth one rupee. >**Note:** Revenue stamps can be used alongside any state stamp series, stamp group, or upload stamp. --- #### Use Stamp Group A Stamp Group is a collection of multiple stamp series of different denominations. It is used for value-based stamping, where stamps of different values are selected to match (approximately) a specific total amount. > **Tip — Prerequisite** > > You must have created a stamp group. Learn [**how to create a stamp group**](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups#create-a-stamp-group). 1. Enable the **Use Stamp Group** toggle switch. 2. Select a stamp group from the dropdown. 3. Enter the stamp amount. - Based on the entered amount, Leegality automatically calculates the number of stamps required and attaches them to the document. The system selects stamps from your chosen group to ensure the total stamp value matches (approximately) the required amount. --- ### Upload Stamp in New Document Journey If you have a physical stamp paper (or PDF), you can attach it to the document. 1. Enable the **Upload Stamp** toggle switch. 2. Provide the following information: - **State** - **Denomination** - **First Party's Name** - **Second Party's Name** - **Stamp Serial Number** 3. Upload the stamp paper’s PDF file and click **Save**. #### Workflow Creation ### Use Stamps in a Workflow Enable the **Use Stamps** toggle switch. #### Use Stamp Series 1. Enable the **Use Stamp Series** toggle switch. 2. **Single Stamp:** Use one stamp from a single stamp series. - The workflow creator has two options: 1. Select a stamp series. A stamp from that series will be automatically affixed to the document when the workflow runs. (**Note:** The workflow runner cannot remove or change the selected stamp series.) 2. Leave the stamp series selection blank, allowing the workflow runner to choose a stamp series when running the workflow. (**Note:** The workflow runner must select a stamp series.) 3. **Multiple Stamps:** Use multiple stamps from multiple stamp series. - The workflow creator has two options: 1. Select the stamp series and specify the number of stamps to be attached from each series. These will be automatically affixed to the document when the workflow runs. (**Note:** The workflow runner cannot remove or modify the selected series.) >**Note:** Stamp minimum quantity: 1, maximum quantity: 99 2. Leave placeholders (Stamp Series and Number of Stamps) blank. The workflow runner can choose the stamp series and number of stamps when running the workflow. - **Example:** If the workflow has placeholders for two stamp series: - The workflow runner must select the stamp series and specify the number of stamps. - They can use one or both stamp series (using both is not mandatory). - If using multiple stamp series, all must be from the same state. --- #### Use Revenue Stamp [Revenue Stamps](https://knowledge.leegality.com/document-execution/stamps/?type=revenuestamp) are a type of stamp series that are **state-agnostic** — they can be attached to documents regardless of the stamp-duty state, unlike regular stamp series which are tied to a specific state. {/* TODO: replace ARCADE_URL_REVENUE_STAMP_WORKFLOW with the real arcade URL */} 1. Enable the **Use Revenue Stamp** toggle switch. 2. The workflow creator has two options: - Select the stamp series and specify the number of stamps to be attached. These will be automatically affixed to the document when the workflow runs. (Note: The workflow runner cannot remove or modify the selected series.) - Select the Revenue Stamp Series using the dropdown and leave the Number of stamps blank. The workflow runner can choose number of stamps when running the workflow. - Leave placeholders (Revenue Stamp Series and Number of Stamps) blank. The workflow runner can choose the stamp series and number of stamps when running the workflow. >**Note:** Revenue stamps can be used alongside any state stamp series, stamp group, or upload stamp. --- #### Use Stamp Group > **Tip — Prerequisite** > > You must have created a stamp group. Learn [**how to create a stamp group**](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups#create-a-stamp-group). 1. Enable the **Use Stamp Group** toggle switch. - The workflow creator has three options: 1. **Leave placeholders (Stamp Group and Stamp Amount) blank**, allowing the workflow runner to select the stamp group and enter the stamp amount when running the workflow. 2. **Fix a stamp group but leave the stamp amount blank**, allowing the workflow runner to specify the stamp amount. The system will automatically affix the required stamps. 3. **Fix both the stamp group and stamp amount**, preventing the workflow runner from modifying them while running the workflow. --- ### Upload Stamp in a Workflow 1. Enable the **Upload Stamp** toggle switch. - The workflow creator has the following options: 1. Leave all stamp details blank, requiring the workflow runner to enter all details and upload the stamp paper. 2. Pre-fill the **State, Denomination, and First & Second Party’s Name** during workflow creation. The workflow runner will only need to provide the **Stamp Serial Number** and upload the stamp paper. --- URL: https://knowledge.leegality.com/document-execution/stamps/multiple-stamp-series-vs-stamp-group # Multiple Stamp Series Multiple Stamp Series lets you explicitly select up to **15 stamp series** and specify how many stamps to attach from each. This is different from a Stamp Group, where the system automatically selects a combination of denominations to meet a variable stamp duty amount. - **Multiple Stamp Series:** A user can select the stamp series from which they want to attach the stamp paper to the document. - **Stamp Group:** A user can only add the stamp amount that needs to be attached; they cannot choose from which stamp series the papers are coming from. > **Tip — Prerequisite** > > Before using Multiple Stamp Series, ensure you have stamp papers in your account: > 1. [Create a Stamp Series](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series) > 2. [Purchase Stamp Papers](https://knowledge.leegality.com/document-execution/stamps/stamp-series/purchase-stamp-series) ## When to Use Multiple Stamp Series - The stamp duty amount is **fixed and known** before the document is sent. - You need stamps from **different series** — for example, series with different article codes meant for different types of agreements. - You want to **control exactly which series** a stamp is drawn from for a specific document. ## Enabling Multiple Stamp Series Multiple Stamp Series can be configured while creating a **New Document** or while configuring a **Workflow**. In both cases, go to the stamp configuration step in the respective flow (see [Use Stamps](https://knowledge.leegality.com/document-execution/stamps/use-stamps) for detailed steps) and follow the steps below. 1. Enable the **Use Stamps** toggle. 2. Enable the **Use Stamp Series** toggle and select **Multiple Stamps**. 3. Select a stamp series from the dropdown and enter the number of stamps to attach (min: 1, max: 99 per series). 4. Click **+ Add More** to add another series. Repeat as needed. 5. All selected series must be from the **same state**. > **Info — Note** > > In **Workflow Configuration**: > - The creator can either pre-select the series and lock them, or leave placeholders for the workflow runner to fill in. > - If placeholders are left blank, the workflow runner **must** select a series before running — it is mandatory. > - The runner is not required to use all added series; using one or more is allowed. --- ## Same Denomination in a Stamp Group When two series share the same denomination but have different article codes, adding them both to a Stamp Group is not recommended. Since the Stamp Group algorithm selects stamps based on denomination value alone, it cannot distinguish between the two series — making the selection unpredictable. **What to do instead:** If you need stamps from two series that share the same denomination (for example, two ₹500 series with different article codes), use **Multiple Stamp Series** instead. This lets you explicitly select each series and specify the quantity, giving you full control over which series is used for each document. > **Info — Note** > > Adding two or more series with the same denomination to a Stamp Group is not recommended, as the system cannot determine which series to draw from. ## Use Case Suppose a document requires multiple stamp papers from different stamp series, such as 100 INR stamp paper for an Affidavit, 100 INR for a Deed of Mortgage, and 100 INR for a Power of Attorney. In that case, you can use the Multiple Stamp Series Selection feature. Here's how it works: When sending the document, you can select the "Multiple Stamps" option. This allows you to affix one stamp from each of the three series. Simply: 1. Choose the Affidavit series and specify 1 stamp. 2. Choose the Deed of Mortgage series and specify 1 stamp. 3. Choose the Power of Attorney series and specify 1 stamp. With this feature, you can easily manage and allocate the required number of stamp papers for each specific purpose within a single document workflow, ensuring all necessary stamps are appropriately affixed. --- URL: https://knowledge.leegality.com/document-execution/template/template # Template Engine Welcome to Leegality's Template Engine! Save time and streamline your document sending processes by creating reusable templates. Whether you're dealing with contracts, agreements, or any other document that follows a similar format, templates are the perfect solution. Templates are perfect for almost any document sending journey that you do over and over again. You can use templates in new document journeys as well as workflows. To access Template, on the dashboard, click **Templates** on the left. ## Types of Template There are two types of templates: - **PDF Editor:** Start with an existing PDF file and add dynamic fields on top of it. - **Text Editor:** Start with a blank document in Leegality’s HTML-based template engine. ## Use Cases of Template ### PDF Template Use PDF Editor to create standardized documents such as forms and legal agreements. This is especially helpful for businesses that already have pre-designed forms and just need to add fillable fields using the PDF editor. ### Text Editor Use Text Editor Templates when you need flexibility and customisation. This HTML-based editor lets you create documents from scratch and create the structure to fit your specific needs, without being restricted by a predefined layout. > **Tip** > > Contact us at support@leegality.com for template creation, tailored to your needs. --- URL: https://knowledge.leegality.com/document-execution/template/pdf-editor/create-a-pdf-template # Create a PDF Template This guide shows you how to create a PDF template in three steps. > **Info — Note** > > - Only admins can create and edit templates. > - Users within the organisation can use these templates. ## 1. Upload PDF 1. In the **Dashboard**, click on the **Template** on the left. 2. Click **+ Create** in the top right corner. 3. Give a suitable **Template Name**. (**Note:** The Template Name is only visible on the dashboard and is not seen by the signers when using this template.) 4. Select **PDF Editor** as the template type and click **Proceed**. 5. Upload PDF files and click **Proceed**. This will take you to the template engine. > **Info — Note** > > You can upload up to 10 PDF files in one template and the maximum upload size of collective PDF files is 30 MB (15 MB recommended for optimal performance). ## 2. Add Fields to a PDF Template 1. In the **+ Add Fields** section on right, you can see the various types of dynamics fields that you can add. 2. To add a field, click on the type of field you want to add, then click on the document where you want to place the field. There are six types of fields that you can add and configure to the PDF. Let’s have a look at them one by one. - Textbox - Dropdown - Radio Button - Checkbox - Date - Image Attachment ## 3. Preview PDF Template 1. Click **Preview** on the top right. 2. In the middle, you will see the PDF template consisting of all the fields you added. 3. In the fields panel on the right, input the field values and then click **Filled Document Preview** to see a preview of the filled PDF. Once satisfied with the preview and all desired fields are added, click on the **Save and Finish** button on the top right. --- URL: https://knowledge.leegality.com/document-execution/template/pdf-editor/fields # Field Properties and Options The PDF Template Engine allows you to add dynamic fields on the PDF templates. Each field has properties that determine its appearance and behaviour. This article outlines the properties of each field type to help you configure your templates efficiently. ## Types of Fields - Textbox - Dropdown - Radio Button - Checkbox - Date Field - Image Attachment ### Common Properties Several basic properties are shared across multiple field types: - **Label:** The text that appears as the label for the field. - **Mandatory Field:** Indicates whether the field is mandatorily required either by the sender or an invitee (to be filled in the signing/review journey). - **Invisible Border:** Specifies whether the field border should be invisible. - **Location on the PDF (in px):** Determines the exact position of the field on the PDF document. - **Px from left:** Distance in pixels from the left side of the page. - **Px from top:** Distance in pixels from the top of the page. ### Field-specific Properties #### Textbox - **Allow only Numbers:** Specifies whether the textbox should only accept numeric input. - **Character Limit:** Defines the maximum and/or minimum number of characters that can be entered. - **Boxed Field:** Specifies if the text box should display a separate box for each character, similar to physical forms. - **Text Formatting:** Font Size, Family, and Style (e.g., bold, italic). #### Dropdown - **Dropdown Values:** List of options available in the dropdown. - **Default Value:** The value that is selected by default. #### Radio Button - **Value (single-selection):** List of available options. #### Checkbox - **Value (multi-selection):** List of available options. #### Date - **Date format:** The format in which the date should be displayed. #### Image - **Max upload size:** The maximum size of the image to be uploaded. (Note: Maximum size cannot exceed 200KB) - **Width (Px):** Width of the image frame in px - **Height (Px):** Height of the image frame in px ## Copy Field Copy Field allows users to reuse the field they have already created. By copying a field all the properties of the original field will also be copied. > **Info — Note** > > Unlike Duplicate Fields, these are not interconnected and need to be filled individually every time. ### To Copy a Field 1. Go to **List of Fields** in the right panel. 2. Click on the Copy icon ![Copy Field](https://knowledge.leegality.com/img/copy.png) and select **Copy**. 3. The Duplicate Field will be attached to the cursor tip, click on the desired place in the document to drop it. ## Duplicate Field Duplicate Fields allow users to enter information once, and then automatically replicate that input across multiple instances of a specific field that requires the same information. > **Info — Example** > > For instance, if a user needs to input their address multiple times in a bank account creation form, Duplicate Fields enable them to enter the address once, and the system will automatically populate the same address in all linked or duplicated address fields. ### To Duplicate a Field 1. Go to **List of Fields** in the right panel. 2. Click on the Copy icon and select **Duplicate**. 3. The Duplicate Field will be attached to the cursor tip, click on the desired place in the document to drop it. > **Info — note** > > Duplicate fields only work with Textbox and Date fields as of now. ## Cut Field To Cut a Field: 1. Go to **List of Fields** in the right panel. 2. Click on the Copy icon ![Copy Field](https://knowledge.leegality.com/img/copy.png) and select **Cut**. 3. The field will be attached to the cursor tip, click on the desired place in the document to drop it. ## Delete a Field To delete a field, 1. Find the field you want to delete. You can find the field directly in the PDF or from the **List of Fields** on the right. 2. Click on the field and then in the right panel, click on the **Delete** icon ![Delete Field](https://knowledge.leegality.com/img/delete.png). > **Info — Note** > > Deleting a field is an irreversible action. ## Download Form Fields The Download Form Fields option provides a JSON of the fields used in a template. You can use this JSON to pass field values in a POST API call. ### To Download Form Fields 1. Click on **Tools** on the top menu and select **Templates** on the left. 2. Find the template whose fields you want to download by searching the template name or template ID. 3. Click on the **three dots (⋮)** on the right and select the **Download Form Fields**. This will download a JSON file containing all template fields, which you can use to make an eSign request. To create an eSign request: 1. Make a POST request to: `https://sandbox.leegality.com/api/v2.1/sign/request` 2. Include the fields JSON in the request body under file > fields. --- URL: https://knowledge.leegality.com/document-execution/template/pdf-editor/replace-base-pdf # Replace Base PDF The Replace Base PDF template feature allows you to replace the existing PDF of the template with a new one while keeping the fields and their properties saved. When you’re working on a template sometimes the PDF content gets updated. So instead of creating a new template from scratch and adding fields to it, you can replace the base pdf on which the fields were dropped. This will keep the fields and their settings intact so you can use them in the new PDF. ## How to Replace Base PDF 1. In the **Dashboard**, click on the **Template** on the left. 2. Find the PDF template whose base PDF you want to change. 3. Click the **Three Dots (⋮)**, then choose **Replace Base PDF**. 4. In the pop-up, click to upload the new PDF. That’s it! Your original PDF will be replaced with your new PDF. Your fields will remain in the same positions, with the same Properties settings. ## Missing Fields When replacing the original PDF with a new version that has fewer pages, some fields may no longer be included. > **Info — Example** > > If a 10-page PDF is replaced by a 9-page PDF, any fields on the 10th page will be missing. > These missing fields retain all their original properties and can be found in the right panel under "List of Fields." To reuse these fields, click on the field and add it to the desired location in the new PDF document. --- URL: https://knowledge.leegality.com/document-execution/template/pdf-editor/download-and-reuse # Download and Reuse a PDF Template You can download a PDF template with all its fields intact and use it to create a new template. This is useful when you want to reuse an existing template — for example, to move a template from your sandbox environment to production. When a PDF template is downloaded and re-uploaded, all fields and their configurations are preserved. ## Download a PDF Template 1. Open the PDF template from the **Templates** section. 2. Click the **Generate PDF** button on the top bar. The PDF will be downloaded exactly as it appears on the screen, with all fields embedded. ## Reuse the Downloaded PDF To create a new template from the downloaded PDF: 1. Go to **Templates** and click **+ Create**. 2. Enter a **Template Name** and select **PDF Editor**, then click **Proceed**. 3. Upload the downloaded PDF and click **Proceed**. All fields from the original template will be intact and ready to use. > **Tip — Copying a Template from Sandbox to Production** > > Download the template from your sandbox environment using the steps above, then upload it in your production environment to create an identical template — no need to rebuild fields from scratch. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/html-template # HTML Template HTML Templates allow you to create documents from scratch using an HTML-based editor. This provides flexibility and customization, letting you design documents that fit your specific needs without being restricted by a predefined layout. ## Key Features - **Create from Scratch:** Build documents without requiring an existing PDF file. - **Rich Text Formatting:** Use advanced formatting options to create professional-looking documents. - **Dynamic Fields:** Add interactive elements like text boxes, dropdowns, and checkboxes. - **Full Customization:** Control every aspect of your document's appearance and structure. ## When to Use HTML Templates HTML Templates are ideal when you: - Need to create a document from the ground up - Require extensive formatting and styling options - Want to incorporate dynamic elements and interactive fields - Need to maintain brand consistency with custom styling ## Getting Started with HTML Templates This section covers everything you need to know about working with HTML Templates: - **[Create a New PDF](https://knowledge.leegality.com/document-execution/template/html-template/create-a-new-pdf):** Learn how to create a new HTML template from scratch. - **[Formatting and Editing](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing):** Discover all the formatting and editing options available in the HTML template editor. - **[Preview and Download](https://knowledge.leegality.com/document-execution/template/html-template/preview-and-download):** Learn how to preview your template and download the final PDF document. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/create-a-new-pdf # Create a New HTML Template HTML Templates allow you to create documents from scratch using an HTML-based editor. This provides flexibility and customization, letting you design documents that fit your specific needs without being restricted by a predefined layout. This guide walks you through creating a new HTML template from scratch. > **Info — Note** > > * Template creation and modification are restricted to Administrators (Organization accounts) or the Account Owner (Individual accounts). > * Once created, templates are available for use by all users within the organization. ## How to Create a New HTML Template 1. Log in to your Leegality account. 2. Navigate to the **Templates** section from the main dashboard. 3. Click **+ Create** to open a popup window. 4. Enter the template name in the field provided. 5. Select **HTML Template** as the template type. 6. Click **Proceed**. The HTML Template editor will open, allowing you to start building your document. ## Next Steps Once your template is created, you can begin formatting and editing your document using the comprehensive set of tools available in the HTML editor. **[Learn about Formatting and Editing →](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing)** --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing # Formatting and Editing The HTML Template editor provides a comprehensive set of tools to help you create professional documents. ## Available Tools Use these tools to add content, format your document, and create interactive elements: ### Form Elements - **[Checkbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/checkbox):** Add checkboxes for multiple-choice selections - **[Radio Button](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/radio-button):** Add radio buttons for single-choice selections - **[Small Textbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/small-textbox):** Insert short, single-line text input fields - **[Large Textbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/large-textbox):** Insert longer, multi-line text input fields - **[Dropdown](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/dropdown):** Create dropdown menus with multiple options - **[Upload Image](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/images-upload):** Allow users to upload images ### Text Formatting - **[Fonts and Text Formatting](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/fonts):** Change fonts, sizes, colors, apply bold/italic/underline, copy formatting, and align text - **[Lists](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/lists):** Create numbered and bulleted lists with sublists ### Styling and Layout - **[Margins and Borders](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/margins-and-borders):** Control spacing and borders for elements - **[Insert Image](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/images-static):** Add images directly to your template - **[Horizontal Lines](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/horizontal-lines):** Add dividers between sections - **[Hyperlinks](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/hyperlinks):** Add clickable links to your document ### Content Elements - **[Special Characters](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/special-characters):** Add symbols and special characters - **[Tables](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables):** Create structured tables for data - **[Page Breaks](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/page-breaks):** Control page breaks for printing ### Document Structure - **[Header and Footer](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/header-and-footer):** Add headers and footers to your document - **[Source HTML](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/source-html):** Edit the raw HTML code for advanced customization > **Tip** > > Changes are auto-saved as you work, so you can safely close the editor and return later to continue editing. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/checkbox # Checkboxes Checkboxes allow signers to select one or more options from a list. Use checkboxes when you need "select all that apply" responses, such as consent forms, service selections, or document acknowledgments. > **Info — When to Use Checkboxes** > > Use checkboxes for multiple-choice selections where signers can pick more than one option. If signers should only pick one option, use **Radio Buttons** instead. ## Create & add checkboxes 1. In the HTML Template editor, place your cursor where you want the checkbox to appear. 2. On the toolbar, click the **Checkbox** icon. 3. The configuration popup will open with two tabs: - **Basic tab:** Configure the group name and value for the checkbox - **Select Group:** Choose an existing group or create a new one - **Group Name:** Name that organises related checkboxes together - **Value:** Unique identifier for this specific checkbox option - **More Options tab:** Control checkbox behavior - **Keep Selected by Default:** Pre-select this checkbox for signers - **Make Field Mandatory:** Require signers to interact with this checkbox 4. Configure your checkbox settings (explained in detail in the sections below). 5. Click **OK**. > **Tip — Label Your Checkboxes** > > Always add a text label next to each checkbox in the editor so signers know what they're selecting. Use clear, concise labels that describe the action or choice. ## Organise checkboxes into groups Grouping helps you organise related checkboxes together. When you create a group, all checkboxes in that group will appear together in the preview and final document. **Why use groups?** Think of each group as a single question with multiple checkbox options. For example: - **Question 1:** "Select the software tools you are proficient in:" → Create a group called `software_skills` - Checkboxes: Excel, PowerPoint, Word, Photoshop - **Question 2:** "Select your preferred communication channels:" → Create a group called `communication_preferences` - Checkboxes: Email, Phone, WhatsApp, Slack When you preview the document, all checkboxes from the same group will appear together under their respective question, making it easy for signers to understand which options belong to which question. > **Tip — Best Practice** > > Create a new group for each question that has multiple checkbox options. This keeps your form organised and makes it easier for signers to fill out. ### Add to a new group When creating checkboxes for a new question: 1. Open the Checkbox configuration popup. 2. In the **Basic** tab, ensure **New group** is selected in the **Select Group** dropdown. 3. In the **Group Name** field, enter a unique identifier (e.g., `software_skills`, `contact_preferences`). 4. In the **Value** field, enter a unique identifier for this specific checkbox (e.g., `excel`, `powerpoint`). 5. Click **OK**. > **Info — About the Value Field** > > The **Value** field is for your internal tracking and database purposes. It will not be visible to signers on the final PDF. Use clear, descriptive values that help you identify responses later. **Example:** For the question "Select the software tools you are proficient in:": - Group Name: `software_skills` - Values: `excel`, `powerpoint`, `word`, `photoshop` ### Add to an existing group When adding more checkbox options to the same question: 1. Open the Checkbox configuration popup. 2. In the **Basic** tab, select your existing group from the **Select Group** dropdown. 3. The **Group Name** field will auto-populate with the selected group name. 4. In the **Value** field, enter a new unique identifier for this checkbox option. 5. Click **OK**. > **Info — Note** > > You can edit the auto-populated group name to create a new group instead. The new name will be added to the **Select Group** dropdown for future use. **Example:** For the question "Select your preferred communication channels:": - Group Name: `communication_preferences` - Values: `email`, `phone`, `whatsapp`, `slack` ## Customise checkbox behavior After creating your checkboxes, you can control how they behave when signers open the document. Use the **More Options** tab in the checkbox configuration popup to access these settings. ### Set a default selection To pre-select a checkbox for signers: 1. Open the Checkbox configuration popup (or right-click an existing checkbox and select **Checkbox properties**). 2. Go to the **More Options** tab. 3. Check the **Keep Selected by Default** box. 4. Click **OK**. **When to use:** - Pre-selecting common or recommended options - Setting default selections in forms - Highlighting popular choices > **Info — Note** > > Unlike radio buttons, you can set multiple checkboxes in the same group to be selected by default. ### Require a selection (Mandatory) To make a checkbox mandatory: 1. Open the Checkbox configuration popup (or right-click an existing checkbox and select **Checkbox properties**). 2. Go to the **More Options** tab. 3. Check the **Make Field Mandatory** box. 4. Click **OK**. Signers will be unable to complete the document until they interact with this checkbox. **When to use:** - Required consent forms - Mandatory acknowledgments (e.g., "I have read the terms and conditions") - Critical selections that cannot be skipped ## Manage & edit checkboxes After placing checkboxes in your template, you can modify, move, or duplicate them as needed. ### Change checkbox properties To edit an existing checkbox: 1. **Right-click** on the checkbox inside the editor. 2. Select **Checkbox properties** from the menu. 3. Modify the group name, value, default state, or mandatory settings in the popup. 4. Click **OK** to save your changes. > **Info — Note** > > All the original settings (group, value, default state, and mandatory settings) will be visible and editable when you access Checkbox properties. ### Move or duplicate a checkbox To move or copy a checkbox to a different location: 1. Select the checkbox you want to perform the action. 2. **Right-click** the checkbox. 3. Select **Cut** (to move) or **Copy** (to duplicate). 4. Move your cursor to the new location. 5. **Right-click** and select **Paste**. ## Preview your checkboxes 1. Click **Preview** to view how your template will appear to signers. 2. Test clicking the checkboxes to verify grouping, default selections, and mandatory settings work as expected. 3. Exit preview mode and make any necessary adjustments. > **Tip** > > Always preview your template after creating or modifying checkboxes to ensure they appear and function as expected. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/radio-button # Radio Buttons Radio buttons allow signers to select exactly one option from a group of choices. Use radio buttons when you need mutually exclusive selections, such as payment method, gender selection, service tier, or Yes/No questions. > **Info — When to Use Radio Buttons** > > Use radio buttons when signers must select exactly one option from a group (e.g., "Yes" or "No", not both). If signers can pick multiple options, use **[Checkboxes](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/checkbox)** instead. ## Create & add radio buttons Follow these steps to insert a radio button into your template: 1. In the HTML Template editor, place your cursor where you want the radio button to appear. 2. On the toolbar, click the **Radio Button** icon. 3. The configuration popup will open with two tabs: - **Basic tab:** Configure the group name and value for the radio button - **Select Group:** Choose an existing group or create a new one - **Group Name:** Name that organises related radio buttons together - **Value:** Unique identifier for this specific radio button option - **More Options tab:** Control radio button behavior - **Keep Selected by Default:** Pre-select this radio button for signers - **Make Field Mandatory:** Require signers to select an option from this group 4. Configure your radio button settings (explained in detail in the sections below). 5. Click **OK**. 6. Repeat these steps to add additional options to the same group. > **Tip — Label Your Radio Buttons** > > Always add a text label next to each radio button in the editor so signers know what they're selecting. Use clear, concise labels that avoid technical jargon. > **Info — Display All Options** > > Display all available radio button options at once so signers can see all choices before selecting. This helps them make informed decisions. ## Organise radio buttons into groups All radio buttons in the same group are mutually exclusive—selecting one automatically deselects the others. This ensures signers can only pick one option from the set. > **Info — How Grouping Works** > > Grouping works the same way as [Checkboxes](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/checkbox#organise-checkboxes-into-groups), but with one key difference: radio buttons allow only **one selection per group**, while checkboxes allow multiple selections. > **Tip — Best Practice** > > Use radio buttons for 2-7 options. If you have more than 7 options, consider using a dropdown field instead for better user experience. **Example groups:** - `payment_method` → Credit Card, Debit Card, Net Banking, UPI - `service_tier` → Basic, Premium, Enterprise ### Add to a new group When creating radio buttons for a new question: 1. Open the Radio Button configuration popup. 2. In the **Basic** tab, ensure **New group** is selected in the **Select Group** dropdown. 3. In the **Group Name** field, enter a unique identifier (e.g., `payment_method`, `service_tier`). 4. In the **Value** field, enter a unique identifier for this specific radio button (e.g., `credit_card`, `debit_card`). 5. Click **OK**. 6. Repeat steps 1-5 to add more options to the same group. > **Info — About the Value Field** > > The **Value** field is for your internal tracking and database purposes. It will not be visible to signers on the final PDF. Use clear, descriptive values that help you identify responses later. **Example:** For the question "Select your preferred payment method:": - Group Name: `payment_method` - Values: `credit_card`, `debit_card`, `net_banking`, `upi` ### Add to an existing group When adding more radio button options to the same question: 1. Open the Radio Button configuration popup. 2. In the **Basic** tab, select your existing group from the **Select Group** dropdown. 3. The **Group Name** field will auto-populate with the selected group name. 4. In the **Value** field, enter a new unique identifier for this radio button option. 5. Click **OK**. > **Info — Note** > > You can edit the auto-populated group name to create a new group instead. The new name will be added to the **Select Group** dropdown for future use. **Example:** For the question "Select your service tier:": - Group Name: `service_tier` - Values: `basic`, `premium`, `enterprise` ## Customise radio button behavior After creating your radio buttons, you can control how they behave when signers open the document. Use the **More Options** tab in the radio button configuration popup to access these settings. ### Set a default selection To pre-select a radio button for signers: 1. Open the Radio Button configuration popup (or right-click an existing radio button and select **Radio Button properties**). 2. Go to the **More Options** tab. 3. Check the **Keep Selected by Default** box. 4. Click **OK**. **When to use:** - Pre-selecting the most common choice - Setting recommended selections - Guiding users toward a default option > **Warning — Important** > > Only **one radio button per group** can be set as default. If you enable "Keep Selected by Default" for one option and then enable it for another option in the same group, the first option will be automatically deselected. ### Require a selection (Mandatory) To make a radio button group mandatory: 1. Open the Radio Button configuration popup for any option in the group (or right-click an existing radio button and select **Radio Button properties**). 2. Go to the **More Options** tab. 3. Check the **Make Field Mandatory** box. 4. Click **OK**. Signers will be unable to complete the document until they select an option from this group. **When to use:** - Required selections - Mandatory choices (e.g., agreeing to terms) - Critical decisions that cannot be skipped ## Manage & edit radio buttons After placing radio buttons in your template, you can modify, move, or duplicate them as needed. ### Change radio button properties To edit an existing radio button: 1. **Right-click** on the radio button inside the editor. 2. Select **Radio Button properties** from the menu. 3. Modify the group name, value, default state, or mandatory settings in the popup. 4. Click **OK** to save your changes. > **Info — Note** > > All the original settings (group, value, default state, and mandatory settings) will be visible and editable when you access Radio Button properties. ### Move or duplicate a radio button To move or copy a radio button to a different location: 1. Select the radio button you want to perform the action. 2. **Right-click** the radio button. 3. Select **Cut** (to move) or **Copy** (to duplicate). 4. Move your cursor to the new location. 5. **Right-click** and select **Paste**. ## Preview your radio buttons 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how your template will appear to signers. 3. Test selecting different radio buttons to verify mutual exclusivity works correctly (selecting one option deselects others in the same group). 4. Verify that default selections and mandatory settings work as expected. 5. Exit preview mode and make any necessary adjustments. > **Tip** > > Before finalizing your template, preview it to ensure radio buttons appear and function correctly. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/small-textbox # Small Textbox Small textboxes allow signers to enter short, single-line text input in your templates. Use small textboxes to collect information like names, email addresses, phone numbers, PAN numbers, or any other brief text-based data. > **Info — When to Use Small Textbox** > > Use small textboxes for short inputs with a maximum of 1028 characters. If you need to collect longer, multi-line text, use **[Large Textbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/large-textbox)** instead. ## Create & add small textbox Follow these steps to insert a small textbox into your template: 1. In the HTML Template editor, place your cursor where you want the textbox to appear. 2. On the toolbar, click **Small Textbox**. 3. The configuration popup will open with two tabs: - **Basic tab:** Configure the group name, field name, and placeholder text - **Select Group:** Choose an existing group or create a new one - **Group Name:** Name for auto-filling the same information across multiple textboxes - **Name:** Unique identifier for this textbox (not visible to signers) - **Placeholder:** Helper text that appears inside the textbox - **More Options tab:** Control textbox behavior and appearance - **Maximum Character Limit:** Restrict the number of characters (up to 1028) - **Type:** Choose Text or Number input - **Mandatory Field:** Require signers to fill this field - **Boxed Field:** Display characters in individual boxes 4. Configure your textbox settings (explained in detail in the sections below). 5. Click **OK**. > **Tip — Use Helpful Placeholders** > > Provide clear placeholder text with examples or formatting guidance to help signers understand what to enter. For example: "Enter your full name", "name@example.com", or "+91 98765 43210". ## Understanding groups and auto-fill Grouping textboxes allows you to auto-fill the same information across multiple fields in your document. When textboxes are in the same group, filling one field automatically fills all other fields in that group. **Why use groups?** Use groups when you need the same information to appear in multiple places in your document. For example: - Name appearing in the header and multiple times in the document body - Email address needed in different sections - Phone number required in multiple locations **How it works:** When a signer fills in one textbox in a group, all other textboxes in that same group are automatically populated with the same value. This saves time and ensures consistency. > **Warning — Important** > > All textboxes in the same group should have the same **Type** (Text or Number). If you mix types: > - Filling a **Text** field won't populate **Number** fields (Number type only accepts numeric input) > - Filling a **Number** field WILL populate **Text** fields (Text type accepts both text and numbers) > > **Best practice:** Always use the same type for all fields in a group to avoid confusion and ensure proper auto-fill behavior. > **Tip — Use Grouping Wisely** > > Only group fields that should contain the exact same information. Don't group different fields together just for organisation purposes. Grouping is specifically for auto-filling repeated information. ## Configure small textbox options Use the **More Options** tab to customise the behavior and appearance of your small textbox. ### Set character limit Control the maximum number of characters allowed in the textbox: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. In the **Maximum Character Limit** field, enter your desired limit (up to 1028). 4. Click **OK**. > **Warning — Character Limit** > > The Small Textbox has a hard limit of 1028 characters. If you need to collect more text, use a **[Large Textbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/large-textbox)** instead. > **Tip** > > Set appropriate character limits based on expected input length to prevent overly long entries and improve data quality. ## Choose input type Restrict what type of data signers can enter: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. In the **Type** dropdown, select: - **Text:** Allows letters, numbers, and special characters (default) - **Number:** Allows only numeric input 4. Click **OK**. **When to use Number type:** - Phone numbers - Age or quantity fields - Numeric codes - Any field requiring numbers only > **Tip** > > Using the Number type prevents invalid input and improves data quality by ensuring signers can only enter numbers. ## Enable boxed field Display each character in its own separate box: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. Check the **Boxed Field** checkbox. 4. Click **OK**. **When to use Boxed Field:** - PAN numbers - Account numbers - Reference codes - Serial numbers - Any input where individual characters need emphasis ## Make field mandatory Require signers to fill in the textbox: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. Check the **Mandatory Field** checkbox. 4. Click **OK**. Signers will be unable to complete the document until they fill in this field. **When to use:** - Required personal information - Mandatory contact details - Essential identifiers > **Tip** > > Only mark fields as mandatory when they are truly required. Too many mandatory fields can frustrate signers. ## Manage & edit textboxes After placing textboxes in your template, you can modify, move, or duplicate them as needed. ### Change textbox properties To edit an existing textbox: 1. **Right-click** on the textbox inside the editor. 2. Select **Text Field Properties** from the menu. 3. Modify any settings (group, name, placeholder, character limit, type, or field options). 4. Click **OK** to save your changes. > **Info — Note** > > All the original settings (group, name, placeholder, character limit, type, mandatory field, and boxed field) will be visible and editable when you access Text Field Properties. ### Move or duplicate a textbox To move or copy a textbox to a different location: 1. Select the textbox you want to perform the action. 2. **Right-click** the textbox. 3. Select **Cut** (to move) or **Copy** (to duplicate). 4. Move your cursor to the new location. 5. **Right-click** and select **Paste**. ## Preview your textboxes 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how your template will appear to signers. 3. Test the textbox functionality: - Try entering text to verify character limits work correctly - If using Number type, confirm only numbers can be entered - If using Boxed Field, check that characters appear in separate boxes - Verify mandatory fields cannot be skipped 4. Exit preview mode and make any necessary adjustments. > **Tip** > > Always preview your textboxes after creation to ensure they work as expected and provide a good user experience. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/large-textbox # Large Textbox Large textboxes allow signers to enter longer, multi-line text input in your templates. Use large textboxes to collect information like full addresses, comments, detailed descriptions, or any other lengthy text-based data. > **Info — When to Use Large Textbox** > > Use large textboxes for longer, multi-line inputs without character restrictions. If you need to collect short, single-line text (up to 1028 characters), use **[Small Textbox](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/small-textbox)** instead. ## Create & add large textbox Follow these steps to insert a large textbox into your template: 1. In the HTML Template editor, place your cursor where you want the textbox to appear. 2. On the toolbar, click **Large Textbox**. 3. The configuration popup will open with two tabs: - **Basic tab:** Configure the group name, field name, and placeholder text - **Select Group:** Choose an existing group or create a new one - **Group Name:** Name for auto-filling the same information across multiple textboxes - **Name:** Unique identifier for this textbox (not visible to signers) - **Placeholder:** Helper text that appears inside the textbox - **More Options tab:** Control textbox appearance and behavior - **Columns:** Width of the textbox in character columns - **Rows:** Height of the textbox in text lines - **Mandatory Field:** Require signers to fill this field 4. Configure your textbox settings (explained in detail in the sections below). 5. Click **OK**. > **Tip — Use Helpful Placeholders** > > Provide clear placeholder text with examples or formatting guidance to help signers understand what to enter. For example: "Enter your complete address" or "Provide any additional comments here". ## Understanding groups and auto-fill Grouping textboxes allows you to auto-fill the same information across multiple fields in your document. When textboxes are in the same group, filling one field automatically fills all other fields in that group. **Why use groups?** Use groups when you need the same information to appear in multiple places in your document. For example: - Complete address appearing in multiple sections - Detailed description needed in different parts of the document - Comments or notes required in various locations **How it works:** When a signer fills in one textbox in a group, all other textboxes in that same group are automatically populated with the same value. This saves time and ensures consistency. **Example:** If you create two large textboxes with the group name `full_address`: 1. Signer enters their complete address in the first textbox 2. The second textbox in the `full_address` group automatically shows the same address > **Tip — Use Grouping Wisely** > > Only group fields that should contain the exact same information. Don't group different fields together just for organisation purposes. Grouping is specifically for auto-filling repeated information. ## Configure large textbox options Use the **More Options** tab to customise the appearance and behavior of your large textbox. ### Set textbox dimensions Control the width and height of the textbox to match the expected content: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. Set the dimensions: - **Columns:** Width in character columns (e.g., 40-50 for narrow, 80-100 for wide) - **Rows:** Height in text lines (e.g., 3-5 for addresses, 8-10 for comments, 15+ for descriptions) 4. Click **OK**. > **Info** > > The columns and rows settings control the initial display size of the textbox. Signers can enter more text than the visible area, and scrollbars will appear if needed. **Example dimensions:** - Address: 50 columns × 5 rows - Comments: 80 columns × 8 rows - Detailed description: 100 columns × 15 rows > **Tip** > > Set rows and columns appropriately so signers can see most of their input without excessive scrolling. This improves the user experience. ### Make field mandatory Require signers to fill in the textbox: 1. Open the textbox configuration popup (or right-click an existing textbox and select **Text Field Properties**). 2. Go to the **More Options** tab. 3. Check the **Mandatory Field** checkbox. 4. Click **OK**. Signers will be unable to complete the document until they fill in this field. **When to use:** - Required additional information - Mandatory feedback or comments - Essential descriptions > **Tip** > > Only mark fields as mandatory when they are truly required. Too many mandatory fields can frustrate signers. ## Manage & edit textboxes After placing textboxes in your template, you can modify, move, or duplicate them as needed. ### Change textbox properties To edit an existing textbox: 1. **Right-click** on the textbox inside the editor. 2. Select **Text Field Properties** from the menu. 3. Modify any settings (group, name, placeholder, columns, rows, or mandatory field). 4. Click **OK** to save your changes. > **Info — Note** > > All the original settings (group, name, placeholder, columns, rows, and mandatory field) will be visible and editable when you access Text Field Properties. ### Move or duplicate a textbox To move or copy a textbox to a different location: 1. Select the textbox you want to perform the action. 2. **Right-click** the textbox. 3. Select **Cut** (to move) or **Copy** (to duplicate). 4. Move your cursor to the new location. 5. **Right-click** and select **Paste**. ## Preview your textboxes 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how your template will appear to signers. 3. Test the textbox functionality: - Ensure the dimensions (rows and columns) are appropriate for the expected content - Try entering multi-line text to verify the textbox works correctly - Verify mandatory fields cannot be skipped 4. Exit preview mode and make any necessary adjustments. > **Tip** > > Always preview your textboxes after creation to ensure they provide adequate space for the expected content and offer a good user experience. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/dropdown # Dropdown Dropdowns (also called select menus) allow signers to choose one or more options from a list. Use dropdowns to collect selections like country, payment method, industry, department, or any other choice from a predefined list. > **Info — When to Use Dropdowns** > > Use dropdowns when you have 7 or more options. For fewer options (2-6), consider using **[Radio Buttons](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/radio-button)** instead, as they're easier to scan and require one less click. ## Create & add a dropdown Follow these steps to insert a dropdown into your template: 1. In the HTML Template editor, place your cursor where you want the dropdown to appear. 2. On the toolbar, click the **Dropdown** icon. 3. The configuration popup will open with two tabs: - **Basic tab:** Configure the dropdown name and options - **Dropdown Name:** Label visible to signers (e.g., "Select Country", "Choose Payment Method") - **Dropdown Options:** List of choices with Preview Text and Value for each option - **More Options tab:** Control dropdown behavior - **Allow Multiple Selections:** Let signers select multiple options - **Mandatory Field:** Require signers to make a selection 4. Configure your dropdown settings (explained in detail in the sections below). 5. Click **OK**. > **Tip — Use Clear Names** > > The Dropdown Name is visible to signers, so use a clear, descriptive label that indicates what should be selected. ## Build your dropdown list Add and organise the options that will appear in your dropdown menu. ### Understanding Preview Text vs Value For each dropdown option, you provide two pieces of information: - **Preview Text:** What you see while building the template (helps you identify options during creation) - **Value:** What signers see in the dropdown menu (the actual selectable text) **Example:** ``` Preview Text Value ------------------- ------------------- Option 1 India Option 2 United States Option 3 United Kingdom ``` ### Add options 1. In the Basic tab, enter the **Preview Text** in the Preview Text field. 2. Enter the **Value** in the Value field (this is what signers will see). 3. Click the **Add** button to add the option to the list. 4. Repeat for each option you want to include. You can add as many dropdown options as needed. > **Tip — Meaningful Values** > > Make sure the Value field contains clear, user-friendly text that signers will understand. This is what they'll see and select. ### Modify an option To edit an existing option: 1. **Select the entry** from the list you want to change. 2. Make changes to the Preview Text or Value fields. 3. Click **Modify** to update the option. ### Reorder options Use the ordering buttons to arrange options in the desired sequence: - **Move Up:** Move the selected option higher in the list - **Move Down:** Move the selected option lower in the list > **Tip — Logical Ordering** > > Organise your dropdown options in a logical order—alphabetically, by frequency of use, or by importance. Place the most commonly selected options near the top to reduce scrolling and improve user experience. ### Remove an option To delete an option: 1. Select an option from the list. 2. Click **Delete** to remove that entry. ### Set a default selection To pre-select an option: 1. Select the option you want to set as the default. 2. Click **Set as default selected value**. This option will be pre-selected when the document is opened. > **Tip — Set Defaults Wisely** > > Only set a default if there's a clear most-common choice. Avoid biasing responses in surveys or forms where neutral selection is important. ## Configure dropdown options Use the **More Options** tab to customise the behavior of your dropdown. ### Allow multiple selections To let signers select multiple options: 1. Open the dropdown configuration popup (or right-click an existing dropdown and select **Dropdown properties**). 2. Go to the **More Options** tab. 3. Check the **Allow Multiple Selections** checkbox. 4. Click **OK**. **When to use:** - Selecting multiple services or features - Choosing multiple categories - Multi-selection surveys or forms > **Info** > > When multiple selections are allowed, signers typically hold Ctrl (Windows) or Cmd (Mac) to select multiple items, or the interface may show checkboxes. > **Warning** > > Only enable multiple selections when it's truly necessary, as it can be less intuitive for users than single selection. ### Make field mandatory To require signers to make a selection: 1. Open the dropdown configuration popup (or right-click an existing dropdown and select **Dropdown properties**). 2. Go to the **More Options** tab. 3. Check the **Mandatory Field** checkbox. 4. Click **OK**. Signers will be unable to complete the document until they select at least one option. **When to use:** - Required selections - Essential categorisations - Critical choices that cannot be skipped > **Tip** > > Only mark fields as mandatory when they are truly required. Too many mandatory fields can frustrate signers. ## Manage & edit dropdowns After placing dropdowns in your template, you can modify, move, or duplicate them as needed. ### Change dropdown properties To edit an existing dropdown: 1. **Right-click** on the dropdown inside the editor. 2. Select **Dropdown properties** from the menu. 3. Modify any settings: - Change the dropdown name - Add, modify, or delete options - Reorder options - Adjust the default selection - Update multiple selection or mandatory settings 4. Click **OK** to save your changes. > **Info — Note** > > All the original settings will be visible and editable, including the complete list of options with their Preview Text and Values. ### Move or duplicate a dropdown To move or copy a dropdown to a different location: 1. Select the dropdown you want to perform the action. 2. **Right-click** the dropdown. 3. Select **Cut** (to move) or **Copy** (to duplicate). 4. Move your cursor to the new location. 5. **Right-click** and select **Paste**. ## Preview your dropdown 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how your template will appear to signers. 3. Test the dropdown functionality: - Click the dropdown to view all options - Verify options appear in the correct order - Check that the default selection is appropriate - If multiple selections are enabled, test selecting multiple options 4. Exit preview mode and make any necessary adjustments. > **Tip** > > Always preview your dropdowns after creation to ensure all options are visible, the default selection is correct, and the ordering makes sense for signers. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/fonts # Fonts and Text Formatting This guide provides a comprehensive overview of how to manage the appearance of text in your document by changing fonts, sizes, colors, and applying formatting styles. All font options are available on the toolbar. > **Info** > > For all formatting options, ensure to select the text first. If no text is selected, the formatting will apply to text you type from that point forward. ## Apply text styles Apply formatting styles to emphasise or modify text appearance: ### Bold Make text bold for emphasis: 1. Select the text you want to make bold. 2. Click the **Bold** button (B) on the toolbar. **Keyboard shortcut:** Press **Ctrl+B** (Windows) or **Cmd+B** (Mac). ### Italics Make text italic for emphasis or titles: 1. Select the text you want to italicise. 2. Click the **Italics** button (I) on the toolbar. **Keyboard shortcut:** Press **Ctrl+I** (Windows) or **Cmd+I** (Mac). ### Underline Add an underline to text: 1. Select the text you want to underline. 2. Click the **Underline** button (U) on the toolbar. **Keyboard shortcut:** Press **Ctrl+U** (Windows) or **Cmd+U** (Mac). ### Strikethrough Draw a line through text to indicate its invalidity(e.g., ~~Agreement~~ ): 1. Select the text. 2. Click the **Strikethrough** button on the toolbar. ### Subscript Format text below the baseline (e.g., H₂O): 1. Select the text you want as subscript. 2. Click the **Subscript** button on the toolbar. ### Superscript Format text above the baseline (e.g., x²): 1. Select the text you want as superscript. 2. Click the **Superscript** button on the toolbar. ## Remove format Remove all font-based formatting from text: 1. Select the formatted text. 2. Click the **Remove Format** button on the toolbar. All formatting (bold, italic, underline, strikethrough, subscript, superscript, font type, font size, text color, and background color) will be removed. The text will return to default formatting. ## Change font type Change the font family: 1. Select the text you want to change. 2. Click the **Font Type** dropdown on the toolbar. 3. Choose a font from the list. **Common fonts:** Arial, Times New Roman, Calibri, Verdana, Georgia, Courier New ## Change font size Change the text size: 1. Select the text you want to resize. 2. Click the **Font Size** dropdown on the toolbar. 3. Choose a size from the list. ## Change text color Change the color of text: 1. Select the text you want to color. 2. Click the **Text Color** button on the toolbar. 3. Choose a color from the color sheet. > **Tip** > > Use colors that provide good contrast with your background. Black or dark gray on white is standard for body text. ## Change background color Apply a background color to text: 1. Select the text. 2. Click the **Background Color** button on the toolbar. 3. Choose a color from the color sheet. The selected text will have a colored background (like a highlighter effect). > **Info** > > Background color is useful for highlighting important information or creating visual emphasis without changing the text color itself. ## Copy formatting Copy the visual styling from one section and apply it to another: 1. Select the text that has the formatting you want to copy. 2. On the toolbar, click the **Copy Formatting** button (paintbrush icon). 3. Select the text where you want to apply the copied formatting. ### What copy formatting copies Copy formatting memorizes and applies: - **Font style:** Bold, italics, typeface, and font size - **Colors:** Text color and background color - **Alignment:** Left, center, right, or justified settings - **Table styles:** Cell borders and padding (if used within tables) ### Use copy formatting multiple times **Single application:** Click the **Copy Formatting** button once to apply formatting to one section. **Multiple applications:** Double-click the **Copy Formatting** button to lock it, then apply formatting to multiple sections. Click the button again to deactivate. > **Tip** > > Use copy formatting to ensure consistency across your document. You can style one header or field exactly how you want it, then copy that formatting to all similar elements. ## Align text Control how text aligns horizontally within your document: ### Align left Align text to the left margin: 1. Select the text or paragraph. 2. On the toolbar, click the **Align Left** button. ### Align center Center text horizontally: 1. Select the text or paragraph. 2. On the toolbar, click the **Align Center** button. ### Align right Align text to the right margin: 1. Select the text or paragraph. 2. On the toolbar, click the **Align Right** button. ### Justify Align text to both left and right margins: 1. Select the text or paragraph. 2. On the toolbar, click the **Justify** button. The text will stretch to align with both margins, creating even edges on both sides. > **Info** > > Alignment applies to entire paragraphs. If your cursor is in a paragraph, you don't need to select the whole paragraph—just click the alignment button. ## Adjust indent Control the indentation of text or paragraphs: ### Increase indent Move text further from the left margin: 1. Select the text or paragraph. 2. On the toolbar, click **Increase Indent**. You can click multiple times to increase indentation further. ### Decrease indent Move text closer to the left margin: 1. Select the text or paragraph. 2. On the toolbar, click **Decrease Indent**. You can click multiple times to decrease indentation further. > **Tip** > > Indent is useful for creating visual hierarchy, nested lists, or block quotations. Use it to make subsections stand out from main content. ## Change line height Control the spacing between lines of text: 1. Select the text where you want to adjust line height. 2. On the toolbar, click the **Line Height** dropdown. 3. Select a value from 1 to 2. **Line height values:** - **1.0:** Single spacing (minimal space between lines) - **1.5:** One and a half spacing (standard for readability) - **2.0:** Double spacing (maximum space between lines) > **Info** > > Line height controls the vertical distance between two subsequent lines. Higher values create more breathing room, while lower values make text more compact. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/lists # Lists Lists help organise information in a clear, easy-to-read format. You can create numbered lists for sequential items or bulleted lists for non-sequential items. ## Numbered list Create a numbered list that starts from 1: 1. Place your cursor where you want the list to begin. 2. On the toolbar, click **Insert/Remove Numbered List**. 3. Type your first list item and press **Enter** to create the next item. The list will automatically number each item (1, 2, 3, etc.). ### Create sublists in numbered lists Add nested sublists within your numbered list: 1. Position your cursor at the list item where you want to create a sublist. 2. Press **Tab** on your keyboard. The item will indent and become a sublist with its own numbering format (e.g., 1.1, 1.2 or a, b, c). > **Tip** > > You can press Tab multiple times to create deeper nested sublists (e.g., 1.1.1, 1.1.2). Each Tab press creates a new nesting level. ### Remove numbered list Remove numbering from a list: 1. Select the numbered list items. 2. On the toolbar, click **Insert/Remove Numbered List** again. The numbers will be removed and the text will return to normal paragraphs. ## Bulleted list Create a bulleted list with bullet points: 1. Place your cursor where you want the list to begin. 2. On the toolbar, click **Insert/Remove Bulleted List**. 3. Type your first list item and press **Enter** to create the next item. The list will automatically add bullet points (•) before each item. ### Create sublists in bulleted lists Add nested sublists within your bulleted list: 1. Position your cursor at the list item where you want to create a sublist. 2. Press **Tab** on your keyboard. The item will indent and become a sublist with a different bullet style (e.g., ○ or ■). > **Tip** > > You can press Tab multiple times to create deeper nested sublists. Each Tab press creates a new nesting level with different bullet styles. ### Remove bulleted list Remove bullets from a list: 1. Select the bulleted list items. 2. On the toolbar, click **Insert/Remove Bulleted List** again. The bullets will be removed and the text will return to normal paragraphs. > **Info — INFO** > > Press **Shift+Tab** to move a list item back to a higher level (reduce nesting). ## When to use lists **Use numbered lists when:** - Order matters (steps in a process, rankings, sequences) - Items need to be referenced by number - Creating instructions or procedures **Use bulleted lists when:** - Order doesn't matter - Listing features, benefits, or options - Breaking down information into digestible points > **Info** > > Lists automatically continue numbering or adding bullets when you press Enter after each item. Press Enter twice to exit the list and return to normal text. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/images-static # Insert Image The Insert Image feature allows you to embed static images directly into your HTML template. In the HTML Template editor, you can add images from a URL or by uploading files, configure dimensions, set margins and borders, and add alternative text for accessibility. ## Insert an image Add static images to your template that are part of the document itself. 1. In the HTML Template editor, place your cursor where you want the image to appear. 2. On the toolbar, click **Insert Image**. 3. A popup will open with **Basic** and **More Options** tabs. 4. Configure the image settings as needed. 5. Click **OK** to insert the image. ## Insert Image Configuration When you select the Insert Image option, a configuration popup appears with the following sections: ### Basic Settings Choose how you want to add the image to your template: #### 1. URL Option Select this checkbox to insert an image from a web URL: - Check the **URL** checkbox - Enter the complete image URL in the provided field - The image will be loaded from the specified web address **Example:** ``` https://www.example.com/images/logo.png ``` > **Info** > > Make sure the URL is publicly accessible and points directly to an image file. The URL should start with `http://` or `https://`. #### 2. Upload Option Select this checkbox to upload an image file from your computer: - Check the **Upload** checkbox - Click the file browser to select an image from your device - The image will be uploaded and embedded in the template **Supported Formats:** JPG, JPEG, PNG, GIF, SVG > **Warning — Important** > > You cannot choose both URL and Upload options simultaneously. Select only one method to insert your image. ### More Options These are optional settings to customise the image appearance and behavior: #### 1. Alternative Text Enter text that describes the image: - This text appears in the filled form if the image fails to load - It's also used for accessibility purposes (screen readers) - Helps users understand what the image represents #### 2. Image Vertical Margin (px) Set the vertical spacing above and below the image: - Controls the top and bottom margin around the image - Enter the value in pixels - **Default: 0 px** #### 3. Image Horizontal Margin (px) Set the horizontal spacing to the left and right of the image: - Controls the left and right margin around the image - Enter the value in pixels - **Default: 0 px** #### 4. Image Border (px) Add a border around the image: - Controls the thickness of the border around the image - Enter the value in pixels - **Default: 0 px** (no border) #### 5. Custom Width and Height Specify custom dimensions for the image: ##### Width (px) - Enter the desired width of the image in pixels - Leave empty to use original image width ##### Height (px) - Enter the desired height of the image in pixels - Leave empty to use original image height #### 6. Maintain Aspect Ratio Enable this checkbox to automatically adjust dimensions proportionally: - When **enabled**: Changing width automatically calculates the appropriate height (or vice versa) to maintain the image's original proportions - When **disabled**: You can set width and height independently, which may distort the image **When to use:** - **Enable** to preserve image proportions and prevent distortion (recommended for most images) - **Disable** only if you need exact dimensions regardless of distortion > **Info** > > Maintaining aspect ratio ensures your images don't appear stretched or squashed. It's recommended to keep this checkbox enabled for professional-looking documents. ## Manage & edit images Once an image is inserted, you can modify its properties or reposition it. ### Edit an image 1. **Double-click** on the image in the editor, or **right-click** and select **Image Properties**. 2. The Insert Image popup will open with current settings. 3. Make your desired changes to any field. 4. Click **OK** to save changes. ### Move or duplicate an image 1. **Right-click** the image. 2. Select **Cut** or **Copy**. 3. Move your cursor to the new location and right-click **Paste**. ### Remove an image 1. **Click** to select the image. 2. Press the **Delete** or **Backspace** key on your keyboard. ## Preview your image Before finalizing your template, check how the image will appear in the generated PDF. 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how the image appears in the document. 3. Verify the image displays correctly with the configured settings. > **Info** > > The Insert Image feature is for static images that are part of the template. If you need users to upload their own images during document signing, use the [Upload Image](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/images-upload) field instead. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/images-upload # Upload Image The Upload Image field allows signers to upload image files to your document. In the HTML Template editor, you can configure image dimensions, alignment, file size limits, quality requirements, and make the upload mandatory for signers. ## Create & add an upload image field 1. In the HTML Template editor, place your cursor where you want the upload image field to appear. 2. On the toolbar, click the **Upload Image** button. 3. In the configuration popup, enter your settings in the **Basic** and **More Options** tabs. 4. Click **OK**. ## Upload Image Configuration When you select the Upload Image option, a configuration popup appears with the following sections: ### Basic Settings These are the core settings required to create an upload image field: #### 1. Image Field Name (Required) Enter a unique name for the upload image field (e.g., `profile_photo`). - This serves as an internal identifier for the image field - **Must be unique** across your template - Choose a descriptive name that clearly identifies the field's purpose #### 2. Width (Required) Specify the display width of the uploaded image in pixels (px). - Determines how wide the image will appear in your document - Enter the value in pixels (this is a required field) #### 3. Height (Optional) Specify the display height of the uploaded image in pixels (px). - Determines how tall the image will appear in your document - **Default is auto** - automatically maintains aspect ratio based on the width you specify - If you want automatic height calculation, leave this field empty #### 4. Alignment Choose how the uploaded image should be aligned in the document. - **None (default):** No specific alignment - **Left:** Aligns image to the left - **Right:** Aligns image to the right - **Centre:** Centers the image ### More Options These are optional settings for advanced upload image configuration: #### 1. Maximum Upload File Size (in KB) Set the maximum file size limit for uploaded images in kilobytes. - Controls how large the uploaded file can be - Helps prevent overly large uploads that slow down processing - Enter the value in KB (1 MB = 1024 KB) #### 2. Picture Quality Set quality requirements for uploaded images by specifying width constraints: ##### Minimum Upload File Width (px) Specify the minimum width the uploaded image must have. - Ensures the uploaded image meets a minimum quality standard - Images narrower than this will be rejected ##### Maximum Upload File Width (px) Specify the maximum width the uploaded image can have. - Prevents excessively large or high-resolution uploads - Images wider than this will be rejected > **Info — NOTE** > > These width constraints validate the actual image dimensions, not the display size. The display size is controlled by the Width and Height fields in Basic Settings. #### 3. Mandatory Field Enable this checkbox to make the image upload mandatory. - Users must upload an image before proceeding with document signing - Use this for critical images that cannot be skipped ## Manage & edit upload image fields Once an upload image field is placed, you can move it or update its configuration. ### Change upload image properties 1. **Double-click** or **Right-click** on the upload image field. 2. The properties popup will open with all current settings. 3. Modify any settings as needed. 4. Click **OK** to save changes. > **Info — NOTE** > > When you edit the upload image field through Image properties, all the original settings (field name, dimensions, alignment, file size limits, quality constraints, and mandatory setting) will be visible and editable. ### Move or duplicate an upload image field 1. **Right-click** the upload image field. 2. Select **Cut** or **Copy**. 3. Move your cursor to the new location and right-click **Paste**. ## Preview your upload image field Before finalizing your template, check how the upload field will appear in the generated PDF. 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view the interactive elements. 3. Test the upload functionality to ensure it works as expected. > **Tip** > > Always preview your upload image fields after creation to ensure the dimensions and alignment look appropriate in the document layout. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/margins-and-borders # Margins and Borders Margins and borders help you control the spacing and visual boundaries of your HTML template. Use margins to add space around your document content, and borders to create a professional frame for formal documents like certificates, letterheads, or official notices. ## Add margins Set custom margins to control the space around your document content: 1. In the HTML Template editor toolbar, click **Add Margin**. 2. A properties box will open with margin settings. 3. Adjust the margin values as needed: - **Top:** Space from the top edge of the page (in pixels) - **Bottom:** Space from the bottom edge of the page (in pixels) - **Left:** Space from the left edge of the page (in pixels) - **Right:** Space from the right edge of the page (in pixels) 4. Click **OK** to apply the margins. ### Default margin values - **Top:** 62 px - **Bottom:** 62 px - **Left:** 48 px - **Right:** 48 px > **Tip — Use Default Margins** > > The default margins (62px top/bottom, 48px left/right) are optimised for most standard documents and work well for printing. Only adjust if you have specific requirements. ### Reset to default margins To revert to the default values: 1. In the margin properties box, click **Reset to default**. 2. All margin values will be restored to their defaults (top/bottom: 62px, left/right: 48px). 3. Click **OK** to apply. > **Info — Print Considerations** > > Ensure margins are adequate for printing. Too small margins may result in content being cut off. If documents will be bound, increase the left margin (for left binding) or top margin (for top binding) to account for binding space. ## Add borders Add visual boundaries around your document to frame the content: 1. In the HTML Template editor toolbar, click **Add Border**. 2. The Border Properties box will open. 3. Configure the border settings: - **Thickness (px):** Enter the thickness of the border in pixels - **Distance from page edge (px):** Enter how far the border should be from the page edge in pixels - **Style:** Choose the border style - **Solid:** A continuous line (recommended for formal documents) - **Dotted:** A line made of dots (for decorative purposes) 4. Click **OK** to apply the border. > **Info — Distance from Page Edge** > > The "Distance from page edge" setting controls the gap between the page edge and where the border begins. Set appropriate distance (at least 10px) to ensure the border doesn't look cramped and prints properly. ## Edit margins or borders To modify existing margin or border settings: 1. Click the **Add Margin** or **Add Border** button again. 2. The properties box will open with current settings displayed. 3. Make your desired changes. 4. Click **OK** to save. > **Tip — Preview Your Changes** > > Always preview your document after adding or modifying margins and borders to ensure they appear as intended before finalizing your template. ## Preview margins and borders 1. Locate the **Preview** button in the bottom-left corner of the editor. 2. Click **Preview** to view how your template will appear with the applied margins and borders. 3. Check that margins provide adequate spacing and borders frame the content properly. 4. Exit preview mode and make any necessary adjustments. > **Tip** > > Always preview after setting margins and borders to ensure they work well together and look professional before finalizing your template. > **Info — NOTE** > > When using **[Source HTML](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/source-html)** to merge 2-3 different templates together, it's critical to ensure all templates have consistent margin and border values before merging. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/hyperlinks # Hyperlinks Hyperlinks allow you to add clickable links to your HTML template that direct users to web pages or other online resources. Use this feature when drafting contracts or agreements to link to terms and conditions, privacy policies, or supporting documentation without cluttering your document. In the HTML Template editor, you can insert hyperlinks with custom display text and specify the destination URL. ## Insert a hyperlink Add clickable links to your document that direct users to external URLs. 1. In the HTML Template editor, place your cursor where you want the hyperlink to appear. 2. On the toolbar, click **Insert Hyperlink**. 3. A popup will open with hyperlink settings. 4. Configure the hyperlink: - **Display Text:** Enter the text that should appear as the clickable link - **Link type:** URL (this is the default option and is already displayed) - **URL:** Enter the web address where users should be directed when clicking the link 5. Click **OK** to insert the hyperlink. **Example:** - Display Text: "Visit our website" - Link type: URL - URL: https://www.example.com The text "Visit our website" will appear as a clickable link in the document. > **Info** > > - The Display Text is what users will see in the document, while the URL is the actual web address they'll be taken to when clicking the link > - Use clear, descriptive text for Display Text instead of generic phrases like "Click here" (e.g., use "View our Privacy Policy" instead) > - Always enter complete, valid URLs starting with `http://` or `https://` (e.g., `https://www.example.com`, not `www.example.com`) ## Manage & edit hyperlinks Once a hyperlink is inserted, you can modify it, move it, or remove it entirely. ### Edit a hyperlink 1. **Right-click** on the hyperlink in the editor. 2. Select **Edit link** from the context menu. 3. The hyperlink properties popup will open with current settings. 4. Make your desired changes to Display Text or URL. 5. Click **OK** to save changes. ### Preview hyperlink View how your hyperlink will appear in the document before finalizing. 1. Hover over the hyperlink in the editor to see a preview of the link destination. 2. To test the link functionality, use the **Preview** button in the bottom-left corner of the editor. 3. Click on the hyperlink in preview mode to verify it directs to the correct URL. ### Move or duplicate a hyperlink 1. **Right-click** the hyperlink. 2. Select **Cut** or **Copy**. 3. Move your cursor to the new location and right-click **Paste**. ### Remove a hyperlink 1. Select the hyperlink text in the editor. 2. In the toolbar panel, click **Remove Hyperlink**. 3. The hyperlink will be removed, but the text will remain. > **Info — NOTE** > > Removing a hyperlink only removes the clickable link, not the text itself. The Display Text will remain as regular text in your document. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/horizontal-lines # Horizontal Lines Horizontal lines are visual separators that help organise content and improve readability in your document. They span the full width of the page wherever you insert them. ## Insert a horizontal line Add a horizontal line to separate sections of your document: 1. Place your cursor where you want the line to appear. 2. On the toolbar, click **Insert Horizontal Line**. The line will appear at the cursor position, spanning the full width of the page. ## Remove a horizontal line Delete a horizontal line from your document: 1. Click to position your cursor at the line. 2. Press **Backspace** or **Delete** on your keyboard. The line will be removed from your document. ## When to use horizontal lines **Good use cases:** - Separating major sections of a document - Before and after important notices - Creating visual breaks in long documents - Between different topics or subjects **Avoid using when:** - Content sections are already clearly separated by headings - The document is very short - White space alone would suffice > **Tip** > > Use horizontal lines sparingly. Too many lines can create visual clutter. For most documents, a simple line between major sections is sufficient. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/special-characters # Special Characters Special characters are symbols that aren't available on a standard keyboard, such as currency symbols (₹, €, $), mathematical symbols (×, ÷, ±), punctuation marks (©, ®, ™), and accented characters (á, é, ñ). ## Insert a special character Add special characters to your document: 1. Place your cursor where you want the character to appear. 2. On the toolbar, click **Insert Special Character**. 3. An elaborate list of special characters will open. 4. Click on the character you want to include. The selected character will appear in your document at the cursor position. ## Manage special characters Once inserted, special characters can be managed like regular text: ### Delete a special character 1. Position your cursor at the special character. 2. Press **Backspace** or **Delete** on your keyboard. ### Copy, cut, or paste special characters 1. Select the special character in your document. 2. **Right-click** on the selected character. 3. Choose **Copy**, **Cut**, or **Paste** from the menu. > **Info** > > Special characters behave exactly like regular text once inserted. You can format, move, copy, or delete them using the same methods you use for normal text. ## Common special characters The special character picker includes: - **Currency symbols:** ₹ (Rupee), $ (Dollar), € (Euro), £ (Pound), ¥ (Yen) - **Mathematical symbols:** × (Multiplication), ÷ (Division), ± (Plus-Minus), ≠ (Not Equal) - **Legal symbols:** © (Copyright), ® (Registered), ™ (Trademark), § (Section) - **Punctuation:** • (Bullet), … (Ellipsis), – (En Dash), — (Em Dash) - **Arrows and symbols:** → ← ↑ ↓ ★ ☑ ☐ - **Accented characters:** á é í ó ú ñ ç > **Tip** > > For frequently used special characters, you can copy them once and paste them wherever needed throughout your template. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables # Tables Tables help you organise and present structured data in rows and columns in your HTML templates. Use tables to display information like pricing plans, schedules, contact details, financial data, or any structured information that's easier to understand in a grid format. ## Insert a table Add a table to your template to display structured data: 1. In the HTML Template editor, place your cursor where you want the table to appear. 2. On the toolbar, click **Insert Table**. 3. A popup will open with table configuration options: - **Number of Rows:** Enter the number of horizontal rows (required) - **Number of Columns:** Enter the number of vertical columns (required) - **Cell Padding (px):** Space between cell content and cell border in pixels - **Table Width:** Width in pixels (e.g., 500) or percentage (e.g., 100%) - **Table Height:** Height in pixels - **Border Size (px):** Thickness of table borders in pixels - **Alignment:** Position of the table (Left, Right, Centre) - Default is `` 4. Click **OK** to insert the table. > **Tip — Set Table Width in Percentage** > > Use the % sign to set table width as a percentage (e.g., 100% for full width, 75% for three-quarters width). This makes tables responsive and adaptable to different screen sizes. ## Edit your table After inserting a table, you can modify its structure, appearance, and content using the right-click menu. **To access edit options:** 1. **Right-click** on any cell or area in your table. 2. Select from the available operations. ### Table editing operations - **[Cell operations](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/cell-operations):** Insert, delete, merge, split cells, and customise cell properties - **[Row operations](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/row-operations):** Add or remove rows from your table - **[Column operations](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/column-operations):** Add or remove columns from your table - **[Table properties](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/table-properties):** Modify overall table settings - **[Delete table](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/delete-table):** Remove the entire table from your template - **[Copy, cut, and paste](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/copy-cut-paste):** Move or duplicate table content --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/cell-operations # Cell Operations Access cell-specific operations by right-clicking on any cell and hovering over **Cell** in the menu. ## Insert cells Add new cells before or after the selected cell: 1. **Right-click** on a cell. 2. Hover over **Cell** in the menu. 3. Select **Insert Cell Before** or **Insert Cell After**. The new cell will be inserted in the selected position. > **Caution — NOTE** > > Inserting cells between existing rows or columns may automatically generate additional rows/columns to compensate, which can disrupt the table's layout. Exercise caution when modifying the table structure to prevent unintended formatting shifts. ## Delete cells Remove specific cells from your table: 1. **Right-click** on the cell you want to delete. 2. Hover over **Cell** in the menu. 3. Select **Delete Cells**. ## Merge cells Combine multiple cells into a single cell using different merge options: ### Merge selected cells 1. Select the cells you want to merge (click and drag). 2. **Right-click** on the selected cells. 3. Hover over **Cell** in the menu. 4. Select **Merge Cells**. The selected cells will combine into one cell, and content from all merged cells will be preserved. ### Merge right 1. **Right-click** on a cell. 2. Hover over **Cell** in the menu. 3. Select **Merge Right** to merge with the cell on the right. ### Merge down 1. **Right-click** on a cell. 2. Hover over **Cell** in the menu. 3. Select **Merge Down** to merge with the cell below. > **Tip — When to Merge Cells** > > Use merge cells for creating headers that span multiple columns, grouping related information, or creating custom table layouts with varying cell sizes. ## Split cells Divide a cell into multiple cells horizontally or vertically: ### Split horizontally 1. **Right-click** on the cell. 2. Hover over **Cell** in the menu. 3. Select **Split Cell Horizontally**. The cell will be divided into two cells stacked vertically. ### Split vertically 1. **Right-click** on the cell. 2. Hover over **Cell** in the menu. 3. Select **Split Cell Vertically**. The cell will be divided into two cells side by side. ## Cell properties Customise individual cell appearance and behavior: 1. **Right-click** on the cell. 2. Hover over **Cell** in the menu. 3. Select **Cell Properties**. 4. A popup will open with the following options: - **Width:** Cell width in pixels or percentage - **Height:** Cell height in pixels - **Word Wrap:** Enable or disable text wrapping (Yes/No) - **Horizontal Alignment:** Align content horizontally (Left, Right, Center, Justify) - **Vertical Alignment:** Align content vertically (Top, Middle, Bottom, Baseline) - **Cell Type:** Define cell type (Data or Header) - **Rows Span:** Number of rows the cell should span - **Columns Span:** Number of columns the cell should span - **Background Color:** Choose cell background color from the color chart - **Border Color:** Choose border color from the color chart with checkboxes to specify which borders to apply (Top, Bottom, Right, Left) 5. Configure your desired settings. 6. Click **OK** to apply the changes. > **Info — Cell Type: Header vs Data** > > Set cell type to "Header" for column or row headers. This helps with accessibility and can apply different default styling to make headers stand out. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/row-operations # Row Operations Access row operations by right-clicking on any cell and hovering over **Row** in the menu. ## Insert rows Add new rows above or below existing rows: 1. **Right-click** on any cell in your table. 2. Hover over **Row** in the menu. 3. Select **Insert Row Before** to add a row above the selected cell. OR Select **Insert Row After** to add a row below the selected cell. The new row will be inserted with the same number of columns as existing rows. ## Delete rows Remove rows from your table: 1. **Right-click** on any cell in the row you want to delete. 2. Hover over **Row** in the menu. 3. Select **Delete Rows**. The entire row will be removed from the table. > **Warning** > > Deleting rows is permanent. Make sure you don't need the data before deleting. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/column-operations # Column Operations Access column operations by right-clicking on any cell and hovering over **Column** in the menu. ## Insert columns Add new columns to the left or right of existing columns: 1. **Right-click** on any cell in your table. 2. Hover over **Column** in the menu. 3. Select **Insert Column Before** to add a column to the left of the selected cell. OR Select **Insert Column After** to add a column to the right of the selected cell. The new column will be inserted across all rows. ## Delete columns Remove columns from your table: 1. **Right-click** on any cell in the column you want to delete. 2. Hover over **Column** in the menu. 3. Select **Delete Columns**. The entire column will be removed from the table. > **Warning** > > Deleting columns is permanent. Make sure you don't need the data before deleting. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/table-properties # Table Properties Modify the overall table settings after insertion. ## Edit table properties 1. **Right-click** anywhere in the table. 2. Select **Table Properties**. 3. The same popup from table insertion will open with these options: - **Number of Rows:** Adjust the number of rows - **Number of Columns:** Adjust the number of columns - **Cell Padding (px):** Space between cell content and cell border - **Table Width:** Width in pixels or percentage - **Table Height:** Height in pixels - **Border Size (px):** Thickness of table borders - **Alignment:** Position of the table (Left, Right, Centre) 4. Make your desired changes. 5. Click **OK** to apply. > **Tip — Set Table Width in Percentage** > > Use the % sign to set table width as a percentage (e.g., 100% for full width, 75% for three-quarters width). This makes tables responsive and adaptable to different screen sizes. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/delete-table # Delete Table Remove the entire table from your template. ## Delete a table 1. **Right-click** anywhere in the table. 2. Select **Delete Table**. The entire table and all its content will be removed from your template. > **Warning** > > Deleting a table is permanent. Make sure you don't need the table or its data before deleting. If you're unsure, consider copying the table content to another location first. > **Tip** > > If you only want to remove certain rows or columns, use the **[Row operations](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/row-operations)** or **[Column operations](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/column-operations)** instead of deleting the entire table. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/tables/copy-cut-paste # Copy, Cut, and Paste Move or duplicate table content using standard clipboard operations. ## Copy cells Duplicate cell content to use elsewhere: 1. Select the cell(s) you want to copy (click and drag to select multiple cells). 2. **Right-click** and select **Copy**. 3. Navigate to the destination cell. 4. **Right-click** and select **Paste**. The content will be copied to the new location while keeping the original intact. ## Cut cells Move cell content from one location to another: 1. Select the cell(s) you want to move (click and drag to select multiple cells). 2. **Right-click** and select **Cut**. 3. Navigate to the destination cell. 4. **Right-click** and select **Paste**. The content will be moved to the new location and removed from the original. ## Copy entire tables Duplicate a complete table to another location in your template: 1. **Right-click** anywhere in the table. 2. Select the entire table (or use a keyboard shortcut to select all). 3. **Right-click** and select **Copy**. 4. Navigate to the location where you want the duplicate table. 5. **Right-click** and select **Paste**. > **Tip — Keyboard Shortcuts** > > You can also use standard keyboard shortcuts for faster operations: > - **Copy:** Ctrl+C (Windows) or Cmd+C (Mac) > - **Cut:** Ctrl+X (Windows) or Cmd+X (Mac) > - **Paste:** Ctrl+V (Windows) or Cmd+V (Mac) > **Info** > > When copying or cutting cells, formatting (colors, borders, alignment) is preserved along with the content. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/page-breaks # Page Breaks Page breaks control where one page ends and the next begins in your document. They ensure content appears on separate pages when your document is converted to PDF or printed. ## Insert a page break Add a page break to start content on a new page: 1. Place your cursor where you want the page break to occur. 2. On the toolbar, click **Insert Page Break**. A page break will be inserted at the cursor position. Content after the page break will move to the next page. ## Remove a page break Delete a page break from your document: 1. Position your cursor at the page break, or select the page break. 2. Press **Backspace** or **Delete** on your keyboard. The page break will be removed and content will flow continuously. > **Info** > > Page breaks are primarily important for printed documents and PDFs. They may not be visible in the web view of your template. ## When to use page breaks **Use page breaks to:** - Start major sections on new pages - Keep signature sections on separate pages - Separate appendices or attachments - Create cover pages or title pages **Avoid page breaks when:** - Content naturally flows across pages - The document is primarily for screen viewing - You have very little content per page --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/header-and-footer # Header and Footer Headers and footers appear at the top and bottom of every page in your document. Use them to display consistent information like company names, page numbers, or document titles across all pages. ## Work with header Add content that appears at the top of every page: 1. Locate the **Header** toggle button in the top-left corner of the page. 2. Click the toggle to turn it **on**. 3. A separate header section will open. 4. Add your content (text, images, formatting) in the header section. Whatever you write in the header will appear at the top of all pages in the filled document. > **Info** > > The header applies to all pages by default. You can exclude specific pages using the Exclude Header option. ### Exclude header from specific pages Remove the header from certain pages: 1. In the header section, click **Exclude Header** from the toolbar. 2. A popup will open. 3. Enter the page numbers where you want to exclude the header. 4. Separate page numbers with commas (e.g., 1, 3, 5). 5. Click **OK**. The header will not appear on the specified pages. ### Add page numbers to header Display the current page number in the header: 1. In the header section, click **Add Page Number** from the toolbar. The page number will appear in the header. ### Add total pages to header Display the total number of pages in the header: 1. In the header section, click **Add Total Page** from the toolbar. The total page count will appear in the header. > **Tip** > > You can enable both page number and total pages. To separate them (e.g., "Page 1 of 10"), manually type a separator between them like "/" or ":" or "of" because there's no default separator. **Example:** - Type "Page ", click **Add Page Number**, type " of ", click **Add Total Page** - Result: "Page 1 of 10" ## Work with footer Add content that appears at the bottom of every page: 1. Locate the **Footer** toggle button in the bottom-left corner of the page. 2. Click the toggle to turn it **on**. 3. A separate footer section will open. 4. Add your content (text, images, formatting) in the footer section. Whatever you write in the footer will appear at the bottom of all pages in the filled document. > **Info** > > The footer applies to all pages by default. You can exclude specific pages using the Exclude Footer option. ### Exclude footer from specific pages Remove the footer from certain pages: 1. In the footer section, click **Exclude Footer** from the toolbar. 2. A popup will open. 3. Enter the page numbers where you want to exclude the footer. 4. Separate page numbers with commas (e.g., 1, 3, 5). 5. Click **OK**. The footer will not appear on the specified pages. ### Add page numbers to footer Display the current page number in the footer: 1. In the footer section, click **Add Page Number** from the toolbar. The page number will appear in the footer. ### Add total pages to footer Display the total number of pages in the footer: 1. In the footer section, click **Add Total Page** from the toolbar. The total page count will appear in the footer. > **Tip** > > You can enable both page number and total pages. To separate them (e.g., "1/10"), manually type a separator between them like "/" or ":" because there's no default separator. **Example:** - Click **Add Page Number**, type "/", click **Add Total Page** - Result: "1/10" > **Info — NOTE** > > Use formatting options (fonts, colors, alignment) in the header and footer sections just like you would in the main document body. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/source-html # Source HTML Source HTML gives you access to the backend code view of your template. The primary use of this feature is to duplicate templates with exact properties—including all features, fields, and formatting—without losing any details during the copy-paste process. When you copy and paste content normally in the visual editor, some properties can get lost, especially font types, spacing, or field configurations. The Source HTML feature solves this by letting you copy the complete HTML code and paste it into another document, ensuring an exact replica of your template. > **Info — No HTML Knowledge Required** > > You don't need to know HTML to use this feature. Simply copy the source code from one template and paste it into another to duplicate the exact structure and formatting. ## Access Source HTML view To view the HTML code of your template: 1. In the HTML Template editor, click the **`<>` Source** button in the top left corner of the toolbar. 2. The editor will switch to code view, displaying the HTML markup (backend view). 3. You can now copy the entire code or make edits if needed. 4. Click **`<>` Source** again to switch back to the visual editor. > **Warning — Toolbar Disabled in HTML View** > > When you're in Source HTML view, all other toolbar options (like inserting checkboxes, textboxes, images, etc.) are disabled. This is because Source HTML is the backend view, while the other toolbar options are frontend tools. You must switch back to the visual editor to use those features. ## When to use Source HTML - **Duplicate templates exactly:** Copy the source code from one template and paste it into another document to replicate all properties, fields, and formatting without any loss of detail. - **Copy HTML templates from Sandbox to Production:** Copy the source HTML from your sandbox template and paste the copied HTML code in the new production HTML template. - **Fix formatting issues:** If the visual editor creates unexpected formatting or spacing that you can't fix normally, you can adjust it directly in the source code. - **Clean up pasted content:** When content pasted from Word documents or websites brings unwanted formatting, you can clean it up in Source HTML view. - **Paste external HTML templates:** If you have an HTML template from another source (like an email template or web design), you can paste it into Source HTML view and adapt it for your document. > **Tip — Merging Multiple Templates** > > When merging 2-3 different templates together, ensure consistent **[margins and borders](https://knowledge.leegality.com/document-execution/template/html-template/formatting-and-editing/margins-and-borders)** across all templates to avoid distortion. --- URL: https://knowledge.leegality.com/document-execution/template/html-template/preview-and-download # Preview and Download After creating your HTML template, preview it to ensure everything looks correct before using it. You can also download form fields, generate PDFs, and save your work. ## Preview your template Check how your template will appear to users: 1. In the HTML Template editor, click the **Preview** button. 2. The preview window will open showing your template. 3. Review the layout, formatting, and form fields. 4. Click **Close Preview** or **Edit** to return to the editor. > **Info** > > Preview mode shows your template with placeholder text in all dynamic fields. This helps you check the overall layout and design. > **Tip** > > Always preview your template after making significant changes. This helps catch issues before using the template in production. ## Filled document preview See how your template looks with sample data filled in: 1. Click the **Preview** button. 2. Fill in sample data in the fields panel on the right. 3. Click **Filled Document Preview**. 4. Review how the completed document will look with actual data. > **Tip** > > Use Filled Document Preview to test how your template handles different data lengths and edge cases. This is particularly useful for checking text overflow and field sizing. ## Download form fields Export your template's form field configuration as a JSON file: 1. Locate the **Download Form Fields** button in the top-right corner. 2. Click the button. 3. A JSON file will download to your computer. This JSON file contains all the form field definitions, groups, and configurations from your template. ## Generate PDF Create a PDF version of your template: 1. In the editor or preview mode, click **Generate PDF**. 2. The template will appear as a PDF. 3. You can print the PDF or download it to your computer. > **Info** > > The generated PDF reflects your current template design. Use this to share your template layout or to print physical copies for review. ## Save your template The template automatically saves your work as you edit. You can also manually save: 1. Click the **Save** button in the toolbar. 2. Wait for the confirmation message. 3. Continue editing or close the editor. > **Info — NOTE** > > Templates auto-save every few seconds, so you don't need to manually save frequently. The Save button is available if you want to ensure your latest changes are saved before closing the editor. --- URL: https://knowledge.leegality.com/document-execution/workflows/overview # Workflow Overview Workflows allow you to create, save, and reuse the document sending journey configurations, eliminating repetitive setup. They store all invitee-level and document-level options, ensuring a consistent sending journey each time. **Invitee Level Options** - eSign type - Security settings - 1 or 2 Factor Authentication - GPS Capture (Geo-fencing) - Photo Capture (Face verification and Liveliness detection) - Custom consent - Signing retry attempts **Document Level Options** - Number of signers - Signing order - Signature positioning - Stamp paper requirements Workflow setup only needs to be done once and can be used over and over again. This removes the need for repetitive tasks of preparing documents from scratch each time. Workflows are ideal for frequently executed and complex document journeys, accelerating the process significantly. > **Info — Example - Loan Agreement** > > Your bank provides loans to multiple customers, requiring a loan agreement signed by both parties with all terms and conditions. > > To streamline this process, you can create a workflow and upload your loan agreement PDF or select the loan agreement template with variable fields like Beneficiary Name, Loan Amount, Tenure, and Guarantor. > > One-Time Workflow Configuration as per requirement > > - Add stamp papers as needed > - Add invitee roles such as "Beneficiary" and "Lender" as signers. > - Set a signing order, for example, the beneficiary signs first, followed by the lender. > - Specify the eSign type for each signer. > - Add other invitees as reviewers if needed. > - Configure any invitee-level and signing journey options during workflow creation. > - Set eSign coordinates where the signature would be placed. > > Whenever you need to send a loan agreement document, you don’t need to repeat all the above steps. Instead, run the workflow with a pre-configured sending journey. Provide the contact information of invitees and send the signing invitation. --- URL: https://knowledge.leegality.com/document-execution/workflows/create-workflow # Create a Workflow Creating a workflow is a lot similar to creating a document. > **Info — Note** > > Only admins have permission to create workflows. > **Tip** > > You can clone an existing workflow to modify it according to your needs. click on the **Three dots (⋮)** next to the desired workflow and select **Clone**. ## Step 1: Create a New Workflow 1. Go to the **Workflows** section using the left panel. 2. Click on the **+ Create** button in the top right corner. 3. Enter the **Workflow Name** and click on **Confirm**. This will direct you to the **Create** page. > **Info — Note** > > From here on, you can save the workflow at any stage. ## Step 2: Prepare Your Document 1. Choose how to prepare your workflow: #### Option 1: Upload PDF File(s) **Workflow user can upload:** - **Single PDF File:** Choose this if you want to use single PDF file. - **Multiple PDF Files:** Choose this if you want to use multiple PDF files. 1. Click **Upload** to add document(s) from your computer. > **Info — Note** > > - **Supported file type:** PDF > - **Upload Limit:** 10 files > - **Maximum total size:** 30 MB (15 MB recommended for optimal performance). 2. Drag and drop files into the designated area or browse and select files manually. 3. If multiple PDFs are uploaded, use the up ( ↑ ) and down ( ↓ ) arrows to arrange them in the desired order. > **Note:** When multiple PDFs are uploaded and arranged, they will be merged into a single document before sending for signing. 4. Click the delete icon (🗑️) to remove unwanted files. > **Warning — Important** > > While running the workflow, the workflow runner needs to upload the relevant PDF(s) in the same order. #### Option 2: Use a Template > **Info — Prerequisite** > > You must have an existing template. Learn how to create a [**templates**](https://knowledge.leegality.com/document-execution/template/). 1. Navigate to the **Templates** tab. 2. Select the desired template. 3. (Optional) Enable **Allow user to append single/multiple PDF files to the template** if additional documents need to be attached along with the selected template. 2. Optionally, you can use [folders](https://knowledge.leegality.com/document-execution/manage-documents/folders) to group and manage your document. Select a folder from the dropdown, and when the workflow is run, the document will be saved into the selected folder. > **Tip** > > Enable **Provide instructions for Workflow user** to add instructions for the workflow runner, such as which PDF to use or the required stamp duty. 3. Click **Next**. If you selected a template in Step 2, an additional screen appears before invitee configuration. The left panel shows a preview of the selected template, and the right panel lists all the template fields within it. > **Info — Note** > > The workflow creator cannot fill template fields. This is done by the workflow runner (and optionally the first invitee). Use the **Allow first invitee to fill** toggle to control how template fields are handled at runtime: - **Disabled:** The workflow runner must fill the template fields before sending the document. If there are mandatory fields, the workflow runner must fill them before proceeding in the sending journey. The workflow runner cannot enable this toggle while running the workflow. - **Enabled:** The workflow runner can fill some, all, or none of the fields before sending: - If the workflow runner fills all fields, the first invitee will have no role in template field filling. - If the workflow runner leaves some or all fields empty — including mandatory ones — the document can still be sent. The first invitee will then be required to fill all mandatory fields before proceeding in the signing journey. The workflow runner cannot disable this toggle while running the workflow. --- ## Step 3: Add Stamp Papers ### Use Leegality's Bharat Stamp The workflow creator can predefine stamps or enable the toggle only allowing the workflow runner to select required stamps during runtime. 1. Enable the **Use Stamps** toggle. 2. Choose one of the following stamp usage methods: [**Configure Stamp Series in Workflow**](https://knowledge.leegality.com/document-execution/stamps/use-stamps?type=workflow-creation#use-stamp-series) - **Single Stamp Series:** Select a stamp series from dropdown. Every time the workflow runs, a single stamp from that series will be attached. - **Multiple Stamp Series:** Select a stamp series and specify the number of stamps required. Click **+ Add More** to add another stamps series and specify the number of stamps. The specified number of stamps will be attached. [**Configure Stamp Group in Workflow**](https://knowledge.leegality.com/document-execution/stamps/use-stamps?type=workflow-creation#use-stamp-group-1) - **Use Stamp Group:** Select a stamp group and enter the total stamp value required. Every time the workflow runs, stamps worth the specified amount will be automatically attached to the document. ### Upload your stamp 1. Enable the **Upload Stamp** toggle switch. The workflow creator has the following options: 1. Leave all stamp details blank. 2. Pre-fill the **State, Denomination, and First & Second Party’s Name** during workflow creation. The workflow runner will need to enter required details and upload the stamp paper. --- ## Step 4: Add Invitees To add invitee, click **+ Add Invitee**: - Each invitee’s default role is "*Signer*" with the default eSign type configured in [**Settings ➔ Department ➔ eSignature**](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#set-the-default-esign-type). The workflow creator has two options: - Leave the *Name, Email Address* and/or *Phone Number* placeholders empty, allowing the workflow runner to enter these while running the workflow. - Or, enable **Configure Invitee** and provide the *Name* and *Email Address/Phone Number* of the Reviewer. The workflow runner will not be able to modify these details. > **Info — Note** > > If **Configure Invitee** is enabled, the workflow creator must provide at least one invitee's Name and Email/Phone Number. In case of multiple invitee placeholders, the workflow runner can add details for other invitees if not configured by the workflow creator. ### Set Signing Order 1. Toggle **Request invitees to sign in fixed order**: - **Disabled:** All invitees receive the signing link simultaneously. - **Enabled:** Signing links are sent sequentially based on the specified order. > **Tip — Example** > > If there are two signers, the documents would be sent to the second signer only after the first signer has signed the document. 2. Use the up ( ↑ ) and down ( ↓ ) arrows to adjust invitee order. ### Configure Invitee Settings #### eSign Type - [**eSign Type**](https://knowledge.leegality.com/category/esign-types)**:** Choose from Aadhaar, DSC, Doc Signer, Virtual Sign, Visual Sign, or Quick Sign. #### Invitee Type - [**Reviewer:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer?type=workflow) A non-signing invitee who needs to review the document’s content and then approve or reject it. - [**Group Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/group-invitee?type=workflow) A Group Invitee allows multiple signers, but only a specified number of signers need to sign. - **For example**, if a group has three authorized signers and any two signatures are required, the document progresses once two members sign. - [**CC Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/cc?type=workflow) A CC Invitee does not sign the document but receives notifications about the document's progress. - **Invitation & Reminders:** When an invitation is sent, resent, or nearing expiry. - **Signing Progress:** When an invitee signs, a reviewer approves/rejects, or the document is completed. - **Failures & Expiry:** If signing fails due to expiry, face match, liveliness, or location issues. - **Final Documents:** Completed document and audit trail upon signing completion. #### Security Features - **Authentication:** Invitees must authenticate their identity before accessing the document to ensure only the intended recipient can proceed. - [**One-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/one-factor-authentication?type=workflow)**:** OTP verification via email or phone number. - [**Two-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/two-factor-authentication?type=workflow)**:** OTP verification via both email and phone number. - **GPS Location:** - [**Capture GPS Location:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=workflow) Record the invitee's location at the time of signing the document. - [**Accuracy-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=workflow) Don’t allow the invitee to sign if the captured location is not accurate up to a certain number of meters. - [**Location-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=workflow) Restrict signing if the signer is outside of the configured area. - **Identity Verification** - [**Face Capture:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo?type=workflow) Capture the photo of the signer before allowing them to sign the document. - [**Face Match:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match?type=workflow) Capture the photo of the signer and match it against the reference image uploaded by the sender. - **User Liveliness![External Link](https://knowledge.leegality.com/img/external-link-svgrepo-com.svg):** Ensure real-time presence of the signer. - [**Manual User Liveliness (OTP-based):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness?type=workflow) The signer needs to capture a photo of themselves while showing the OTP appearing on the screen. - [**Smart User Liveliness (AI-powered):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness) AI-based solution that ensure the person sitting in front of camera is actively present there. It detects spoofs like photo and pre-recorded videos. #### Signature Appearance - [**Invitee Name on Signature:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-in-signature?type=workflow) Choose whether to display the invitee’s name in the signature. - [**Company Seal:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal?type=workflow) Ask invitee to upload the image company (organization) seal. If the signer has a Leegality account, the company seal will auto-fill based on the preferences. - [**Invitee Name Editing:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing?type=workflow) Allow or restrict name editing during signing. #### Other Features - [**Custom Webhook and URL:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/custom-url-and-webhook/webhook-and-url?type=workflow) Enable integrations for real-time updates. - [**Supporting Documents:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents?type=workflow) The Supporting document helps you request additional documentation, which invitee needs to upload during signing journey. - [**Additional Consent Terms:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/additional-consent?type=workflow) Add custom terms and conditions alongside default consent. - [**Mask Contact Details:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/mask-contact-details?type=workflow) Hide other invitees' contact details for privacy. - [**Reject to Sign:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign?type=workflow) Provide an option to reject to sign the document. --- ## Step 5: Configure Document Settings - [**Signing Link Expiry**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/document-expiry?type=workflow)**:** Set a deadline for invitees to sign or review the document. The signing or reviewing link can expire: - After a specific number of days - Within 45 minutes - By the end of the day Once expired, the invitee cannot access the document. Sender needs to re-activate the document. - [**Custom Message**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message?type=workflow)**:** Add a personalized note to the email body. - **Auto delete document after completion:** Enabling this will result in your copy of the document being deleted from the Leegality’s servers after the duration configured in [**Document Settings**](https://knowledge.leegality.com/document-execution/settings/Department/document-security-settings#auto-delete-after-document-completion). --- ## Step 6: Notification Delivery Method Select methods for sending signing or reviewing invitation, reminders and other updates. Available delivery methods are: - Email - SMS - WhatsApp 1. Click **More Options**. 2. Enable or disable **Email, SMS, and/or WhatsApp Notifications**. > **Info — Note** > > For CC invitees, only email notifications are available. --- ## Step 7: Place Signature Coordinates A signature coordinate is where you want the invitee’s signature to be on the document. By default, signature coordinates are placed at the bottom-left corner of every page in the document. To place signature coordinates in your desired place: 1. Hover over **☰** icon and select **custom coordinate**. 2. Click on the document where you want to place the signature. 3. Use the dropdown to assign the signer. The signature placeholder size can be increased or decreased as per requirement by simply dragging from its edges. > **Info — Note** > > #### How Signatures are Placed on Multiple Stamps in a Workflow > > At the **Preview** stage, only one stamp paper is displayed—even if multiple stamp papers are attached. > > The signature coordinates you set on the reference stamp are automatically replicated across all attached stamps. This means all stamps will have the identical signature layout. --- ## Step 8: Preview and Save Once you have added the document, invitees, and signature coordinates, you can preview the workflow configuration. - Click the **View Invitees** button to review all invitees associated with the document. - Click **Save**. Your workflow is now published and ready to use. --- URL: https://knowledge.leegality.com/document-execution/workflows/run-workflow # Run a Workflow #### Via Dashboard ## Via Dashboard 1. Click on the **Workflows** in the left panel. 2. Find the workflow you want to run. (**Note:** You can search by workflow name or ID.) 3. To run the workflow; - **For a template workflow:** Click on the **Three dots (⋮)** and select **Run**. - **For a PDF workflow:** Click on the **Run** button on the right. > **Info — Note** > > Options available for you to use is the matter of [**workflow creation**](https://knowledge.leegality.com/document-execution/workflows/create-workflow). --- ### Step 1: Prepare Your Document Depending on the workflow configuration, you may need to upload a pdf or the template which was configured in the workflow creation stage will be automatically selected. 1. **Name the Document:** Enter the name of the document. The document name will appear in the email subject and body. > **Tip — Example** > > **Email Subject:** “Invitation to eSign: Service Level Agreement” 2. **Internal Reference Number:** Enter the Internal Reference Number for the document. The **Name** and **Internal Reference Number (IRN)** fields have a maximum character limit of 255. The following special characters are allowed: **| - : ( ) , _. [ ] &/**. --- ### Step 2: Add Stamps Papers Depending on the workflow configuration, you may have options to select or simply confirm the stamp settings when running the workflow. > **Info — Note** > > The options below are based on the workflow configuration. Not all workflows will allow selection or modification of stamp settings. #### Single Stamp Series **Option 1:** - You must select a stamp series from the dropdown. This selection is mandatory to proceed. **Option 2:** - The workflow creator has fixed the stamp series, which cannot be disabled or modified. #### Multiple Stamp Series #### Multiple Stamp Series **Option 1:** - You may select a stamp series and specify the number of stamps to attach. This is optional; you can proceed without making a selection. **Option 2:** - The stamp series is fixed by the workflow creator, but you must enter the number of stamps to use from that series. You cannot select any other series. **Option 3:** - Both the stamp series and the stamp quantity are fixed by the workflow creator and cannot be changed. #### Revenue Stamp #### Revenue Stamp **Option 1:** - You may select a Revenue stamp series and specify the number of revenue stamps to attach. This is optional; you can proceed without making a selection. **Option 2:** - The Revenue stamp series is fixed by the workflow creator, but you must enter the number of revenue stamps. You cannot select a different Revenue stamp series. **Option 3:** - Both the Revenue stamp series and the number of revenue stamps are fixed by the workflow creator and cannot be changed. #### Stamp Group #### Stamp Group **Option 1:** - You can select a stamp group and specify the total stamp value to be attached. Both the selection and the stamp value are mandatory to proceed. **Option 2:** - The stamp group is fixed by the workflow creator, but you must enter the stamp value. You cannot select a different stamp group. **Option 3:** - Both the stamp group and the stamp value are preset by the workflow creator and cannot be modified. --- ### Fill Template Fields (Optional) > **Info — Conditional Step** > > This step appears only when the workflow uses a template with fillable fields. If your workflow includes a template with form fields, you will have the option to fill them before proceeding. The Fill Template screen is divided into two sections: - **Left Panel - Live Preview:** Displays a real-time preview of the document as you fill in the fields. Changes made on the right are immediately reflected here. - **Right Panel - Form Fields:** Lists all available fields in the template. Enter or select values for each field as required. As you complete each field on the right, the corresponding field in the document preview on the left updates instantly, allowing you to verify your entries before continuing. > Sender can enable **Allow first invitee to fill** to allow the first invitee in the signing order to fill the template fields before signing the document. > **Tip — Best Practice** > > We recommend filling template fields at this stage rather than during the signing journey. When fields like addresses or descriptions are filled, they may expand and shift the document content downward. Since signature coordinates are placed at fixed positions on the document, filling fields beforehand ensures that signatures align perfectly with the final document layout. Once you've filled all required fields, click **Next** to proceed. --- ### Step 3: Invite Configuration > **Info — Note** > > All settings configured during workflow creation are automatically applied here. The availability of certain features depends on the workflow creator’s configuration. #### eSign Type eSign type will be enforced as defined during the workflow creation and cannot be modified. - [**eSign Type**](https://knowledge.leegality.com/category/esign-types)**:** Choose from Aadhaar, DSC, Doc Signer, Virtual Sign, Visual Sign, or Quick Sign. #### Invitee Type > **Info — Note** > > The workflow runner cannot change the invitee type. You can only enter the invitee-specific parameters—such as Name and Contact Details (Email or Phone) when running the workflow. - [**Reviewer:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer) A non-signing invitee who needs to review the document’s content and then approve or reject it. - [**Group Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/group-invitee) A Group Invitee allows multiple signers, but only a specified number need to sign. - **For example**, if a group has three authorized signers and any two signatures are required, the document progresses once two members sign. - [**CC Invitee:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/cc) A CC Invitee does not sign the document but receives notifications about the document's progress. - **Invitation & Reminders:** When an invitation is sent, resent, or nearing expiry. - **Signing Progress:** When an invitee signs, a reviewer approves/rejects, or the document is completed. - **Failures & Expiry:** If signing fails due to expiry, face match, liveliness, or location issues. - **Final Documents:** Completed document and audit trail upon signing completion. #### Security Features The availability of these security features depends on the workflow configuration. If not enabled during workflow creation, they may not be applicable. - **Authentication:** Invitees must authenticate their identity before accessing the document to ensure only the intended recipient can proceed. - [**One-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/one-factor-authentication)**:** OTP verification via email or phone number. - [**Two-factor Authentication**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/two-factor-authentication)**:** OTP verification via both email and phone number. - **GPS Location:** If Allow Workflow Runner Modifications was enabled during workflow creation then the workflow runner can input or modify the Accuracy Threshold, Latitude-Longitude, and Permissible Radius while running the workflow. - [**Capture GPS Location:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Record the invitee's location at the time of signing the document. - [**Accuracy-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Don’t allow the invitee to sign if the captured location is not accurate up to a certain number of meters. - [**Location-based restriction:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location?type=new-document-journey) Restrict signing if the signer is outside of the configured area. - **Identity Verification** - [**Face Capture:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo) Capture the photo of the signer before allowing them to sign the document. - [**Face Match:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match) Capture the photo of the signer and match it against the reference image uploaded by the sender. - **User Liveliness![External Link](https://knowledge.leegality.com/img/external-link-svgrepo-com.svg):** Ensure real-time presence of the signer. - [**Manual User Liveliness (OTP-based):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness) The signer needs to capture a photo of themselves while showing the OTP appearing on the screen. - [**Smart User Liveliness (AI-powered):**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness) AI-based solution that ensure the person sitting in front of camera is actively present there. It detects spoofs like photo and pre-recorded videos. #### Signature Appearance The features listed below are available only if configured in the workflow. - [**Invitee Name on Signature:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-in-signature) Choose whether to display the invitee’s name in the signature. - [**Company Seal:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal) Ask invitee to upload the image company (organization) seal. If the signer has a Leegality account, the company seal will auto-fill based on the preferences. - [**Invitee Name Editing:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing) Allow or restrict name editing during signing. #### Other Features The features listed below are available only if configured in the workflow. - [**Custom Webhook and URL:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/custom-url-and-webhook/webhook-and-url) Enable integrations for real-time updates. - [**Supporting Documents:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents) The Supporting document helps you request additional documentation, which invitee needs to upload during signing journey. - [**Additional Consent Terms:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/additional-consent) Add custom terms and conditions alongside default consent. - [**Mask Contact Details:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/mask-contact-details) Hide other invitees' contact details for privacy. - [**Reject to Sign:**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign) Provide an option to reject to sign the document. --- ### Step 4: Document-level configurations - [**Signing Link Expiry**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/document-expiry)**:** Set a deadline for invitees to sign or review the document. The signing or reviewing link can expire: - After a specific number of days - Within 45 minutes - By the end of the day Once expired, the invitee cannot access the document. Sender needs to re-activate the document. - [**Transfer Completed Document**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/sftp)**:** Automatically transfer signed documents via SFTP. - [**Custom Message**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message)**:** Add a personalized note to the email body. Once all necessary details are entered, click **Next** to continue. --- ### Step 5: Finalize Page This page provides a preview of the final document that will be sent out for signing. Here, you can verify the signature coordinates as configured in the workflow. - **Signature Coordinates:** - The signature placement is fixed according to the workflow configuration. - If invitee details for any signature coordinate are left blank, that signature box will remain empty. > **Tip — Example** > > In a workflow with three invitees, if the second invitee's details are not provided, the corresponding signature coordinate box will remain empty as well. - **Final Check:** - Review the preview to ensure all elements (including signature coordinates) appear as expected. - Once satisfied, click **Send**. After clicking **Send**, your workflow is executed and the document is dispatched for signing. You will be redirected to the Document Details page to monitor progress and view invitee actions. #### Via API ## Via API **Prerequisites** * [Auth token](https://knowledge.leegality.com/document-execution/settings/account-level/API/how-to-enable-api.md) * Workflow API payload To run a workflow via API, you need a request body which is called API payload. To download it 1. Click on the **Workflows** in the left panel. 2. Find the workflow you want to run. (**Note:** You can search by workflow name or ID.) 3. Click on the **three dots (⋮)** and select the **Download API Payload** option. A JSON file containing the workflow configuration will be downloaded. Use this file in a API 3.0 POST request to create an eSign request. > **Tip — **For more information:**** > > To learn how to create an eSign request using the API, refer to the [**API Reference Guide**](https://www.leegality.com/api-reference-guide/api-reference-guide). > > To explore available API 3.0 methods, check out the [**API Documentation**](https://docs.leegality.com/v3\#tag/Document-Execution-Platform). --- URL: https://knowledge.leegality.com/document-execution/workflows/excel-upload/run-workflow # Run Workflow via Excel Upload The Excel Upload is a way to send out documents for eSignature in bulk by uploading an Excel file with invitee specific information. ## Excel Upload via Dashboard > **Info — Note** > > Excel Upload only works for template-type workflows. 1. Click on **Workflows** in the left panel. 2. Locate the workflow you want to run by searching for the workflow name or ID. 3. Click on the **Upload** button on the right of the workflow. 4. In the pop-up, click on the **Download Excel** button. The downloaded Excel file will serve as a template. The workflow runner needs to fill in the following details: * **Document Details:** Document Name and IRN * **Stamp Details:** Stamp Series to be used and the number of stamp papers to be affixed * **Template Fields:** Fields required in the template * **Sending Journey Details** * **Invitee Details:** Invitee name, email address, and/or phone number > **Info** > > Here, you can learn [**how to fill an Excel template**](https://knowledge.leegality.com/document-execution/workflows/excel-upload/fill-excel-file) 5. After filling in the Excel template, click the **Upload** button. 6. A pop-up will open; upload the Excel file and click the **Upload** button. 7. After uploading, you will be redirected to the **Reports** section to check if the file was successfully uploaded. > **Warning** > > To ensure a successful upload, your Excel file must not contain: > > - **Formulas** — values must be entered directly, not as `=A1+B1` or any other formula. > - **Invisible or special characters** — extra spaces, line breaks, tabs, or hidden characters inside parameter values can cause the upload to fail silently. > > If your upload is stuck on **In Process** in the Reports section, make sure to remove any hidden characters and re-upload. ## Excel Upload via Email You can also run a workflow by emailing the Excel file as an attachment. 1. In the workflows section, find the workflow you want to run. 2. Click on the workflow name to open the detail view. 3. Here, you will see the **Upload Email Address**. You can also run a workflow by emailing the Excel file to this email address. > **Info — Note** > > The sender’s email address needs to be added as an Authorized Email address beforehand. To add an email to the Authorized Email address: 1. Click on the **Three dots (⋮)** on the right and select the **Edit** option. 2. In the pop-up, select the **Invitee Configuration** and click on **Confirm**. 3. In the next screen, click on the **Advanced option** in the bottom left corner. 4. Toggle on the Authorized Emails option and enter the email address(es) in the field, separating multiple addresses with a comma. 5. Click **Save**, then **Save and Exit** to save the workflow configuration. Now, you can send the Excel file as an attachment to the Upload Email address. Ensure the sender’s email is added as the authorized email address. --- URL: https://knowledge.leegality.com/document-execution/workflows/excel-upload/fill-excel-file # How to Fill Excel Template The Excel template is designed to streamline document sending process. Each row in the template represents a single document, ensuring that multiple documents can be processed efficiently for different groups of invitees. ### How Excel Upload Works? Every row in the spreadsheet corresponds to a distinct document that needs to be sent to a unique set of invitees. > **Tip — **Example**** > > - **Row 1:** A document sent to Invitee A, Invitee B, and Invitee C. > - **Row 2:** A separate document sent to Invitee D, Invitee E, and Invitee F. > > You can add multiple rows to send the same document to different groups separately. ## Understanding the Excel Template Before filling out the template, it is essential to understand its structure and restrictions. ### Preview of the Template When running a workflow via Excel upload, it is crucial to maintain the integrity of the spreadsheet template to ensure seamless processing. Please adhere to the following guidelines: - **Preserve the Header Row:** Do not alter the header row in the template, as changes can disrupt the workflow's functionality. - **Avoid Modifying Specific Columns:** Columns labeled **`field(n).id`** and **`field(n).name`** are essential for mapping data accurately. Refrain from making any changes to these columns. > **Info — Please Note** > > - **Color Codes for Guidance:** While reference materials may use color codes (e.g., orange) to highlight specific columns, these colors are for instructional purposes only and are not present in the actual template. - **Custom Mapping for Different Field Names:** If you're using a custom spreadsheet with field names that differ from those in the Leegality template, you'll need to set up [custom mapping](https://knowledge.leegality.com/document-execution/workflows/excel-upload/custom-mapping). This process aligns your internal spreadsheet fields with Leegality's required fields, facilitating accurate data integration. By following these guidelines, you can ensure that your workflows operate smoothly and that all necessary data is correctly processed within the Leegality platform. ## Template Fields & Data Input ### Field Components Each form field in the document has **three key components**: - **field.id**: A unique identifier for each form field. (*Do not modify this value.*) - **field.name**: The label for the field in the document. (*For reference only, do not change this.*) - **field.value**: The actual input value for the field. (*This is the field you need to fill.*) ### Field Types & Accepted Formats #### Radio Button #### Radio Button A single-choice selection from predefined options. - Each option has a separate `field.id`, `field.name`, and `field.value`. - Enter **`TRUE`** in the `field.value` for the selected option. > **Info — Note** > > Ensure only one `field.value` is marked as **`TRUE`** per radio button group. > **Tip — Example** > > Suppose there is a radio button field for **Gender**, with three options: **Male**, **Female**, and **Other**. > > Each option is a separate field with a unique `field.name`, such as `gender(Male)`, `gender(Female)`, and `gender(Other)`. > > If the user selects **Female**, then the `field.value` for `gender(Female)` should be set to `TRUE`, while the `field.value` for both `gender(Male)` and `gender(Other)` should be left empty. This ensures only one option is selected, as required for radio buttons. #### Checkbox #### Checkbox Allows multiple selections from predefined options. - Multiple options are available, each with its own `field.id`, `field.name`, and `field.value`. - Enter **`TRUE`** in the `field.value` to select an option. > **Info — Note** > > You can select multiple options by entering **`TRUE`** in multiple rows. > **Tip — Example** > > Suppose there is a checkbox field for **Preferred Communication Channels**, with three options: **Email**, **Phone**, and **WhatsApp**. > > Each option is a separate field with a unique `field.name`, such as `communication(Email)`, `communication(Phone)`, and `communication(WhatsApp)`. > > If the user selects **Email** and **WhatsApp**, then the `field.value` for `communication(Email)` and `communication(WhatsApp)` should be set to `TRUE`, while the `field.value` for `communication(Phone)` should be left empty. This allows multiple selections, as expected from checkboxes. #### Dropdown #### Dropdown A collapsible list for selecting one option. - Enter the **exact text** of the selected option in the `field.value`. > **Tip — Example** > > Suppose there is a dropdown field for **Country of Residence**, with options like **India**, **Canada**, and **Australia**. > > This is a single field with the `field.name` as `country_of_residence`. > > If the user selects **Canada**, then the `field.value` for `country_of_residence` should be set to `"Canada"`. The value must match the exact text of the selected option. #### Textbox #### Textbox A field for entering freeform text. - Enter any required text input in the `field.value`. > **Tip — Example** > > Suppose there is a textbox field for **Full Name**. > > This is a single field with the `field.name` as `full_name`. > > If the user enters **Ayesha Khan**, then the `field.value` for `full_name` should be set to `"Ayesha Khan"`. The textbox allows freeform text input. #### Date #### Date A field for entering a date. - Use the format **dd-mm-yyyy** unless specified otherwise. > **Info — Note** > > Ensure the date format matches the expected input in the document. > **Tip — Example** > > Suppose there is a date field for **Date of Birth**. > > This is a single field with the `field.name` as `date_of_birth`. > > If the user enters **12th April 1995**, then the `field.value` for `date_of_birth` should be set to `"12-04-1995"`. The date must follow the **dd-mm-yyyy** format unless specified otherwise. #### Image Upload #### Image Upload A field for storing an image as a Base64-encoded string. - Enter a **Base64 encoded URL** of the image in the `field.value`. > **Tip — Example** > > Suppose there is an image upload field for **Profile Photo**. > > This is a single field with the `field.name` as `profile_photo`. > > If the user uploads an image, the `field.value` for `profile_photo` should contain a **Base64-encoded string** representing that image — for example, `"data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."`. ## Configuring Invitees #### Invitee ### Invitee Contact Details Invitees can be designated as Signers or Reviewers. For each invitee, provide the following information: - **Invitee(0).name:** Full name of the invitee. - **Invitee(0).email:** Email address for sending notifications and signing links. - **Invitee(0).phone:** Phone number for SMS notifications and OTP verifications. ### Group Invitee Details Group Invitees allow multiple participants to sign or review a document, with a specified number required for completion. To configure a group: - **InviteeGroup(1).name:** Name of the group. - **InviteeGroup(1).completion_threshold:** Number of invitees required to complete the group's action. - **Group(1).Invitee(0).name:** Name of each invitee within the group. - **Group(1).Invitee(0).email:** Email address of each group invitee. - **Group(1).Invitee(0).phone:** Phone number of each group invitee. ### CC (Carbon Copy) Invitee Contact Details CC invitees receive updates about the document's progress but do not participate in signing or reviewing. For each CC invitee, provide: - **CC(0).name:** Full name of the CC invitee. - **CC(0).email:** Email address for receiving notifications. > **Info — Note** > > If the workflow creator has pre-configured certain invitee contact details, these will take precedence over any information provided in the Excel template. #### Stamp ### Stamp Details Leegality offers a few ways to affix stamp papers to documents digitally. Depending on your requirements, configure one of the following: #### Single Stamp Series - **Stamp Series:** Specify the stamp series number to use a single stamp paper from the selected series. > **Info — Note** > > If the workflow creator has pre-configured the stamp series, the workflow runner will not get the option to fill the stamp series details in the Excel Template. #### Multiple Stamp Series #### Multiple Stamp Series To configure multiple stamp series for a document, enter the following details in the Excel template. - **multipleStampSeries(n).stampSeries:** Specify the stamp series number. - **multipleStampSeries(n).seriesQuantity:** Specify how many stamps to affix from this series. > **Tip — Example of Multiple Stamp Series in Excel Upload** > > If a workflow includes one stamp series, the fields will be: > > * `multipleStampSeries(0).stampSeries` > * `multipleStampSeries(0).seriesQuantity` > > If two stamp series are configured, the fields will be: > > * For the first stamp series: > > * `multipleStampSeries(0).stampSeries` > * `multipleStampSeries(0).seriesQuantity` > * For the second stamp series: > > * `multipleStampSeries(1).stampSeries` > * `multipleStampSeries(1).seriesQuantity` > > Each additional stamp series follows the same pattern, with the index increasing by 1 for each new entry. > **Info — Note on Pre-Configured Stamp Series** > > - If the *workflow creator has pre-filled stamp series and quantities*, the *workflow runner will not* get the option to fill stamp details in the Excel Template. > - If *only the stamp series is pre-filled* (not the quantity), the *Excel template will have `multipleStampSeries(0).stampSeries` pre-filled*, the *workflow runner must fill in the `multipleStampSeries(0).seriesQuantity`*. > - If *one of the stamp series is fully pre-configured* and another is not: > - The pre-configured series will be hidden in the Excel template. > - The workflow runner must fill in the stamp details only for the remaining series. #### Stamp Group #### Stamp Group - **Stamp Group:** Specify the stamp group number to use a combination of stamp papers. - **Stamp Amount:** Total value of stamps to affix to the document. > **Info — Note** > > If the workflow creator has pre-configured the stamp group and stamp amount, the workflow runner will not get the option to fill the stamp details in the Excel Template. #### GPS Location ### GPS Location Settings To enhance security, you can restrict document signing based on the invitee's geographic location. Configure the following as needed: ### For Single Invitee --- #### **Geo-fencing (Latitude and Longitude Based Restriction):** - **Invitee(0).gps.allowedLatitude:** Latitude coordinate where signing is permitted. (Format: XX.XXXXX, range: -90 to 90) - **Invitee(0).gps.allowedLongitude:** Longitude coordinate where signing is permitted. (Format: XX.XXXXX, range: -180 to 180) - **Invitee(0).gps.permissibleRadius:** Radius (in meters) around the specified coordinates within which signing is allowed. > **Info — Note** > > 1. **When "Allow sender to make changes while running the workflow" is *disabled*:** > > * If **Apply location based restrictions** is enabled but the **Latitude**, **Longitude**, and **Permissible Radius** are *not* pre-filled by the workflow creator: > > → The workflow runner needs to provide the **Latitude**, **Longitude**, and **Permissible Radius** in the excel template. > > 2. **When "Allow sender to make changes while running the workflow" is *enabled*:** > > * Regardless of whether **"Location-based restriction"** is enabled or disabled: > > → The workflow runner can optionally provide **Permissible Radius** in the Excel Template. If left blank, no such restrictions will apply to the invitee. #### **Accuracy Based Restriction:** - **Invitee(0).gps.accuracyThreshold:** Required accuracy (in meters) of the captured location to proceed with signing. > **Info — Note** > > 1. **When "Allow sender to make changes while running the workflow" is *disabled*:** > > * If **Apply accuracy-based restrictions** is enabled but the **Accuracy Threshold** is *not* pre-filled by the workflow creator: > > → The workflow runner will not be able to enter this value in the Excel Template. Instead, the default value from *Settings > Department > Invitee Configs* will apply. > * If the **Accuracy Threshold** *is* pre-filled: > > → The workflow runner cannot edit this value in the Excel Template. > 2. **When "Allow sender to make changes while running the workflow" is *enabled*:** > > * Regardless of whether **"Accuracy-based restriction"** is enabled or disabled: > > → The workflow runner can optionally provide **Accuracy Threshold** in the Excel Template. If left blank, no such restrictions will apply to the invitee. #### For Group Invitee If geo-fencing is enabled for a group invitee, configure the following: - **InviteeGroup(0).gps.allowedLatitude** - **InviteeGroup(0).gps.allowedLongitude** - **InviteeGroup(0).gps.permissibleRadius** - **InviteeGroup(0).gps.accuracyThreshold** #### Company Seal ### Company Seal If the document requires a company or organizational seal: - **Invitee(0).organization.name:** Name of the signer's organization to appear as the company seal in the signature. If left blank, the invitee will be prompted to provide this information during the signing process. #### Certificate Verification ### Certificate Verification To ensure the authenticity of the signer, configure verification against official certificates such as Aadhaar or DSC (Digital Signature Certificate). #### Aadhaar Certificate Details - **Invitee(0).aadhaar.verifyPincode:** PIN code as per the invitee's Aadhaar. - **Invitee(0).aadhaar.verifyYob:** Year of birth as per Aadhaar records. - **Invitee(0).aadhaar.verifyTitle:** Last four digit of Aadhaar Number. - **Invitee(0).aadhaar.verifyGender:** Gender as mentioned in Aadhaar. - **Invitee(0).aadhaar.verifyState:** State of residence as per Aadhaar. #### DSC Token Certificate Details - **Invitee(0).dsc.verifyPincode:** PIN code associated with the invitee's DSC. - **Invitee(0).dsc.verifyState:** State as recorded in the DSC. ## Common Mistakes to Avoid ✅ **Do not modify header fields** – they are essential for processing. ✅ **Ensure required fields are filled** – missing values can cause errors. ✅ **Match data formats** – dates, dropdown values, stamp series, and others must follow specified formats. --- URL: https://knowledge.leegality.com/document-execution/workflows/excel-upload/custom-mapping # Custom Mapping The custom mapping allows you to map your internal spreadsheet to the fields available in the Leegality-generated spreadsheet, streamlining the process of uploading user-formatted spreadsheets instead of the standard Leegality template. This mapping process is a one-time setup and only needs to be revisited if there are changes in the template variable fields, prompting updates to the spreadsheet template. ## To do Custom Mapping in workflow: 1. Select **Workflows** from the left panel. 2. Locate the relevant workflow and click on the **Three Dots (⋮)** on the right. 3. Select **Custom Mapping**. 4. Upload your excel file and click **Upload**. (Supported format xls and xlsx.) Leegality will extract the column headers from your uploaded spreadsheet and present them in a dropdown menu against each field in the Leegality Excel Column Headers. 5. Each field can be mapped to a corresponding header in your internal spreadsheet. 6. Once all fields are mapped, you can use your internal spreadsheet to send out workflows seamlessly. By utilizing custom mapping, users can leverage their existing spreadsheet formats within the Leegality platform, enhancing efficiency and user experience. --- URL: https://knowledge.leegality.com/document-execution/workflows/edit-workflow # Edit a workflow Editing a workflow allows you to make changes to specific stages of your workflow configuration even after it has been created and published. You can modify document settings, adjust invitee configurations, or update signature placement without rebuilding the workflow from scratch. > **Info — Note** > > Editing a workflow does not affect documents that have already been sent. Changes only apply to documents sent using the modified workflow after the edits are saved. ## How to edit a workflow 1. Go to **Dashboard** and select **Workflows** from the left panel. 2. Locate the workflow you want to edit. 3. Click on the **Three Dots (⋮)** on the right side of the workflow. 4. Select **Edit** from the dropdown menu. 5. A dialog box appears with three options. Choose the stage you want to modify and click **Confirm**. ### Document Configuration Select this option to make changes to the document preparation stage of your workflow. You can: * Choose a different template or change template settings * Add or remove PDF files * Update stamp usage settings (stamp series, stamp groups, or uploaded stamps) * Change instructions for workflow runners ### Invitee Configuration Select this option to modify invitee-related settings. You can: * Add or remove invitees from the workflow * Change invitee roles (Signer, Reviewer, Group Invitee, CC) * Modify eSign type and configuration for each invitee * Update signing order settings * Adjust security features (authentication, GPS location, identity verification) * Configure notification delivery methods (Email, SMS, WhatsApp) * Modify signature appearance settings * Update other invitee-specific options (webhooks, supporting documents, additional consent) ### Signature Placement Select this option if you only want to change signature coordinate placement on the document. This allows you to: * Adjust the position of signature boxes on the document * Add or remove signature placements > **Tip** > > If you only need to adjust signature positions, use the Document Placement option to skip directly to that stage and save time. ## Save your changes After making your edits in the selected stage: 1. Review your changes carefully. 2. Click **Save** to apply the modifications to the workflow. ## Download API payload after editing If you use API to run workflows, you must download the updated JSON payload after editing a workflow. The previous payload will not reflect your recent changes. To download the updated API payload: 1. Go to **Dashboard** and select **Workflows** from the left panel. 2. Locate the edited workflow. 3. Click on the **Three Dots (⋮)** and select **Download API Payload**. The updated JSON file will be downloaded, containing all your recent modifications. Use this file in your API 3.0 POST requests to ensure your workflow runs with the correct configuration. --- URL: https://knowledge.leegality.com/document-execution/activity-log # Activity Logs The Activity Logs page provides a comprehensive record of all user actions within your Leegality account. Use these logs to audit account activity, track document status changes, monitor user actions, and maintain compliance records. Activity Logs give you visibility into: * All document-related activities (invitations, signatures, completions, rejections) * Stamp transactions and management actions * Workflow executions and updates * Payment and credit transactions * User authentication events (sign in, sign out) * System-level changes (contacts, templates, settings) ## How to Access Activity Logs ![Activity Log window](https://knowledge.leegality.com/img/Activitylogs.png) 1. Click **Dashboard** at the top of the page. 2. Select **Activity Logs** from the left navigation panel. ## Understanding the Activity Log Table The activity log displays entries in reverse chronological order, with the most recent activity at the top. Each log entry contains the following information: | Column | Description | | :---- | :---- | | **Date** | The exact date and time when the activity occurred (e.g., Dec 15, 2025 04:54 PM) | | **Remarks** | A detailed description of the action taken, including document ID, IP address, or device information | | **User** | The name and email address of the user who performed the activity | | **Report Type** | The category of action that occurred (see Activity Types below) | ## Filtering and Search The top section of the Activity Logs page contains filters and tools to help you quickly find specific log entries. ### Search Use the search bar to find specific text within the logs. You can search by document name, document ID, user name, or keywords from the activity description. ### Date Range Filter Click the date range selector to view logs for a specific time period. You can: * Select predefined ranges (today, yesterday, last 7 days, last 30 days) * Choose a custom start and end date using the calendar picker > **Info — Note** > > By default, logs from the last 30 days are displayed. All activity logs are retained forever. ### User Filter Filter logs by specific users to view activities performed by particular team members. Click the user filter to select one or more users from your account. ### Refresh Click **Refresh** to reload the log data and ensure you're viewing the most up-to-date activity. ## Activity Types The Report Type column categorizes each activity. Below is a comprehensive list of all activity types and their meanings: ### Document Activities | Report Type | Description | | :---- | :---- | | **Create** | A new document was created in the system. | | **Invite** | An invitation was sent to a party to sign a document. | | **You Signed** | You completed a signature action on a document. | | **Invitation Sign** | An invited party successfully signed the document you sent. | | **Complete** | The document reached its final signed status with all parties having signed, or the sender manually marked the document as complete. | | **You Rejected** | You chose to reject or decline signing a document. | | **Invitation Reject** | An invited signer rejected or declined signing the document. | | **Delete** | The document was deleted. Completed documents and drafts can be deleted after a fixed period as configured in settings, or the sender can manually delete the document anytime. | ### Invitation Management | Report Type | Description | | :---- | :---- | | **Resend** | The signing invitation was resent to an existing invitee. This can be done for active invitations if the recipient did not receive the original notification via email, WhatsApp, or SMS. Maximum 5 times including the initial send. | | **Reinvite** | A new signing invitation was sent after a previous invitation was rejected by the signer. There is no limit on reinvites until the invitation times out. | | **Invitation Timed Out** | The time limit for an invitee to sign the document expired. | ### Verification and Signing Status | Report Type | Description | | :---- | :---- | | **Verification Failed** | A verification step (OTP or identity check) required for signing failed. | | **Signed but Verification Failed** | The document was signed, but a subsequent verification check failed based on department-level eSign configuration. | | **Retry Attempt Exhausted** | The maximum number of signing attempts was reached without success. This applies only to Aadhaar eSign. | ### Stamp Activities | Report Type | Description | | :---- | :---- | | **Stamp Used** | A stamp was reserved and applied to a document for signing. | | **Stamp Reversed** | A previously used stamp was reversed and credited back. This occurs when an unsigned document with a stamp is deleted by the sender. | | **Stamp Expiry Extended** | The expiry date for a stamp series was updated and extended. | | **Stamp Create** | A new stamp series was created in the system. | ### Template and Workflow Activities | Report Type | Description | | :---- | :---- | | **Template Create** | A new document template was created and saved. | | **Workflow Created** | A new document execution workflow was designed and saved. Only admin users can create workflows. | | **Workflow Updated** | An existing workflow was modified. Only admin users can update workflows. | | **Workflow Published** | A workflow was finalized and made active for use. | | **Workflow Deleted** | A workflow was permanently removed from the system. Only admin users can delete workflows. | ### User Authentication | Report Type | Description | | :---- | :---- | | **Sign In** | A user successfully logged into the application. | | **Sign Out** | A user logged out of the application. | ### Payment Activities | Report Type | Description | | :---- | :---- | | **Payment Authorised** | Initial approval for a payment transaction was received from the signer during the signing journey. | | **Payment Captured** | Funds were successfully collected after the signer completed signing without any verification errors or rejections. | | **Payment Capture Failed** | The attempt to collect funds was unsuccessful. | | **Payment Reversed** | A captured payment was refunded or cancelled because the signer could not complete signing due to document deletion or invitation deletion. | ### Contact Management | Report Type | Description | | :---- | :---- | | **Contact Deleted** | A contact from the Contact Book was removed. | | **Contact Sent** | A contact was successfully shared with another user or system. | | **Contact Shared** | A contact was shared with another user within the platform. | > **Tip** > > Use the Report Type filter to quickly find specific categories of activities when auditing or troubleshooting. ## Download Report You can export activity logs in two ways: * **Full report:** Click **Download Report** without applying any filters to export all activity log entries. * **Customised report:** Apply filters for **Date Range**, **User**, and/or **Report Type** to narrow down the entries, then click **Download Report** to export only the filtered results. The exported file includes the date, activity description, user, and report type for each entry. > **Info — Note** > > Reports are exported as CSV files that you can open in Excel or other spreadsheet applications. ## Common Use Cases Activity Logs help you: * **Audit compliance**: Maintain records of all actions for regulatory requirements * **Troubleshooting**: Track the sequence of events when investigating issues * **User monitoring**: Review actions performed by specific team members * **Document tracking**: Follow the complete lifecycle of a document from creation to completion * **Security**: Monitor authentication events and identify unusual activity > **Tip** > > Export activity logs regularly for long-term record-keeping and compliance requirements. ## Related Features - [Audit Trail](manage-documents/document-details/audit-trail): Document-specific audit information with detailed invitee actions - [Notification Logs](manage-documents/document-details/notification-logs): Track notification delivery status across all channels --- URL: https://knowledge.leegality.com/document-execution/contact-book # Contact Book The Contact Book stores invitee contact information so you can quickly add signers and reviewers during document execution without re-entering their details each time. > **Info — Note** > > Contact Book entries are **not** login accounts or signing IDs. They are shortcuts for filling in invitee details when sending documents. The same person may appear more than once if their details (e.g., email address) were entered differently across documents. Duplicate entries do not affect document signing or user access — they exist purely for your convenience while composing new sending requests. ## Access Contact Book 1. Click **Dashboard** at the top of the page. 2. Select **Contact Book** from the left navigation panel. ## Contact Book Table The Contact Book displays all saved contacts in a table with the following fields: | Field | Description | | :---- | :---- | | **Contact Name** | The name of the invitee. | | **Email ID** | The invitee's email address. | | **Phone Number** | The invitee's phone number. | | **Label** | A tag or category assigned to the contact for easy identification. | | **Ownership** | Indicates whether the contact is owned by you or shared with you by another user. | --- ## Add a Contact 1. Click the **+ Create** button in the top right corner. 2. Enter the contact's details: - **Name** - **Email** - **Phone Number** - **Label** (optional) 3. Click **Save**. The contact will appear in your Contact Book and will be available to use during the sending journey. ### Import Contacts in Bulk You can add multiple contacts at once using an Excel file. 1. Click the **Import** button. 2. Download the sample Excel template if needed. 3. Fill in the contact details (Name, Email, Phone Number, Label) in the template. 4. Upload the completed Excel file. 5. Click **Submit**. All valid contacts from the file will be added to your Contact Book. --- ## More Actions ### Filter Contacts Use filters to narrow down contacts in the Contact Book. 1. Click the **Filter** icon in the Contact Book. 2. Apply one or more of the following filters: | Filter | Options | | :---- | :---- | | **Label** | Filter by one or more labels assigned to contacts. | | **Ownership** | **Personal** – contacts you created; **Shared** – contacts shared with you by others; **Organisation** – contacts available across the organisation. | | **Sharing** | **On** – contacts you have shared with others; **Off** – contacts not yet shared. | 3. The table updates to show only the contacts matching your selected filters. ### Send a Contact You can send contacts to other users in your organisation. 1. Find the contact you want to send and click the **Three dots (⋮)** (More Options) next to it. 2. Select **Send**. 3. Select the user(s) you want to send the contact to from the list. 4. Click **Send**. ### Edit a Contact 1. Find the contact you want to edit and click the **Three dots (⋮)** (More Options) next to it. 2. Select **Edit**. 3. Update any of the following fields: - **Name** - **Email ID** - **Phone Number** - **Labels** 4. Click **Confirm**. ### Delete a Contact 1. Find the contact you want to remove and click the **Three dots (⋮)** (More Options) next to it. 2. Select **Delete**. 3. Confirm the deletion from the popup. > **Info — Note** > > Deleted contacts are recorded in the [Activity Logs](https://knowledge.leegality.com/document-execution/activity-log). ## Use Contacts During Document Execution When the Contact Book is enabled in [**Settings → Department → Invitee Configurations**](https://knowledge.leegality.com/document-execution/settings/Department/invitee-configurations), you can select saved contacts while adding invitees during the sending journey. 1. During the sending journey, click **+ Add Invitee**. 2. Start typing the invitee's name or email in the contact field. 3. Select the contact from the suggestions that appear. The invitee's name and contact details will be auto-filled from the Contact Book. > **Info — Note** > > The Contact Book option must be enabled by your admin in **Settings → Department → Invitee Configurations** for it to appear during the sending journey. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/Profile/change-your-name # Change your name Your name is an essential part of your identity in Leegality. It appears in email notifications sent to invitees. Below example shows how your name appears in invitations sent to invitees. ![Profile Name in Notification](https://knowledge.leegality.com/img/profile_name_example.png) To change your name: 1. Click on the **Setting** icon ⚙️ on the top right. 2. From the left panel, go to **Settings > Profile**. 3. Make changes to the Name as you desire. 4. Click on the **✔** icon. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/Profile/change-your-password # Change your password You can change your password at any time. > **Info — Note** > > Leegality requires you to update your password every six months To change your password: 1. Click on the **Setting** icon ⚙️ on the top right. 2. From the left panel, go to **Settings > Profile**. 3. Under the Account Security section, click **Change Password**. 4. To set a new password, you have to verify your identity by: - Either entering your old password. - Or authenticating with a Reset Code sent to your registered email address. 5. Click **Update**. > **Info — Note** > > You will be automatically logged out after successfully changing your password. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/Profile/multi-factor-authentication # Multi Factor Authentication Multi-Factor Authentication (MFA) adds an **extra layer of security** on top of your existing login method (OTP or password) in Leegality. With MFA enabled, a user must have: 1. **Their existing login credentials** (OTP or password) **and** 2. **A one-time passcode (TOTP)** generated by a third-party authenticator app. This helps safeguard against unauthorised access — even if someone has your primary login credentials. ## How MFA Works When you log into your Leegality account with MFA activated: * After entering your **username** and **OTP/password**, you will be prompted to enter a **TOTP**. * The TOTP is generated by an authenticator app (e.g., Google Authenticator, Microsoft Authenticator) on your phone. * Each code refreshes every **30 seconds** and is valid for **60 seconds**. ## How to Enable Multi-Factor Authentication (MFA) > **Info — Note** > > MFA is a *user-level setting*. Each user in your organisation must enable it individually. 1. Click the **gear icon** (top-right corner). 2. Select **Settings → Profile** from the left-hand menu. At the bottom of your profile page, you will find **Multi-Factor Authentication**. 3. Click the **Set Up Multi-Factor Authentication** button. A pop-up will guide you through setup. 4. Install an Authenticator App. Recommended options: Google Authenticator, Microsoft Authenticator, or similar. Available on iOS and Android app stores. 5. Open your authenticator app and scan the QR code shown in the setup pop-up. This links your Leegality account to your authenticator app. 6. Enter the 6-digit code displayed in your authenticator app for Leegality: \[your email\]. 7. Click **Enable MFA**. You have now activated MFA for your account. ## Logging in with MFA Once MFA is enabled: 1. Enter your username and OTP/password as usual. 2. A pop-up will appear asking for your TOTP. 3. Open your authenticator app, find the Leegality entry, and enter the code displayed. You will be logged in once the TOTP is verified. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/document-setting/Invitation-expiry-for-sent-documents-account-defaults # Set Default Inivtation Expiry You can configure a default expiry period for eSign and review invitations sent from your account. After this period, invitees will no longer be able to access invitation via link to eSign or review the document. However, as the sender, you can reactivate the invitation and set a new expiry date. ## To Set Up Document Expiry on Account Level: 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. From the left panel, go to **Settings > Documents**. 3. Under Enforce Invitation Expiry, you have four options: - **Minimum:** Expires after 45 minutes of sending. - **End of Day Expiry:** Expires at the end of the day the document was sent. - **Custom Range:** Expires after the specified number of days (from 1 to 365 days). - **Disable enforcement of document expiry:** Allows setting the expiry during the sending process; the default is 10 days. 3. Click **Update**. > **Info — Note** > > The expiry period begins at midnight the day after the document is sent. For example, if a document is sent at 4:00 PM on January 1, 2024, with a 2-day expiry, the countdown starts at 12:00 AM on January 2, and the document will expire at 12:00 AM on January 4, 2024. > **Warning — alert** > > The document expiry cannot be changed during the sending process unless you have selected the **Disable enforcement of document expiry** option. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/document-setting/auto-save-signed-documents # Auto-Save Signed Documents The auto-save signed document toggle allows you to automatically save documents received for eSigning or review from other Leegality users to your Leegality account upon completion. Saved documents can be accessed from the Received folder. 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. From the left panel, go to **Settings > Documents**. 3. Enable or Disable **Auto-Save Signed Documents**. 4. Click **Update**. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/document-setting/invitee-notifications-and-reminders-account-default # Invitee Notifications and Reminders This setting allows you to control email, SMS, and WhatsApp notifications sent to invitees for all documents from your Leegality account. ## To Enable or Disable Invitation Reminders and Notifications 1. Click on the **Settings** ⚙️ icon on the top right. 2. From the left panel, go to **Settings > Document**. 2. Enable or disable the **Send Invitation Reminders And Notifications** toggle. - **Enabled:** Both mandatory and optional notifications are sent to invitees. - **Disabled:** Only mandatory notifications are sent. --- ## Notification Types **Mandatory Notifications** - Document completion notifications **Optional Notifications** - Invitation to eSign/Review, including re-sent invitations - Reminder notifications before expiry - eSign/Review completion notifications - Rejection notifications - Expiry notifications - Re-activation notifications - Deletion notifications > **Info — Note** > > *Document completion notifications* are sent to all invitees as required by ASP regulations. The CCA mandates that Leegality (ASP) send the completed signed document to each signer. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/API/how-to-enable-api # Leegality API By default, APIs are deactivated for every account and must be manually activated. You need to enable API in order to generate Auth Token and Private Salt. ## How to Enable API To activate API in your account: 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. From the left panel, go to **Settings > API**. 3. Click the **Enable API** button. This will generate the two API credentials; Auth Token and Private Salt. > **Warning** > > Do not share your Auth Token and Private Salt with anyone. Your Auth Token and Private Salt are sensitive credentials that grant access to your Leegality account and verify API calls and webhook requests. Sharing these credentials compromises the security of your account and exposes your data to unauthorized access and potential misuse. ## How to get Auth Token The Auth Token is a unique identifier that allows Leegality to validate API calls. It must be passed in the X-Auth-Token header parameter while making API calls (refer to [API documentation](https://docs.leegality.com/v3)). You can get the Auth Token to by clicking the “Copy” icon. You can also generate the new Auth Token by clicking the “Refresh” icon next to the Auth Token field. > **Tip** > > If you suspect that your Auth Token has been compromised, regenerate it immediately and take necessary security measures to safeguard your account. ## How to get Private Salt The Private Salt is used to verify the webhook calls made by Leegality. To verify webhook calls using the Private Salt, refer to the ‘mac’ parameter in our webhook documentation. Private Salt can only be regenerated by disabling and enabling the API. ## How to Disable API To disable your API access for your account, click the “Disable API” button, and Leegality will delete the associated auth token, private salt, and whitelisted IP addresses. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/API/how-to-whitelist-ip # How to Whitelist IP Addresses You can the Whitelist IP feature to restrict IP addresses that can make API calls to Leegality. You can add up to 10 IP addresses to this list. To whitelist an IP address: 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. From the left panel, go to **Settings > API**. 3. Enter a valid **IPv4 address** and click the **+** icon. > **Info — Note** > > The IPv4 address needs to be input in x.x.x.x format, where the value of x can range from 0-255. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/overview # Overview The Wallet section offers management of your account's financial activities, including purchasing, tracking usage, and managing billing information. Here’s what you can do: - **Purchase eSign Credits and Stamps**: Easily buy eSign credits and stamp papers directly from your account. - **View Purchase History**: Access a detailed history of all your eSign credits and stamp paper purchases. - **Monitor Consumption History**: Track the usage of eSign credits and stamp papers, giving you insights into your consumption patterns and remaining balances. - **Manage Billing Profiles**: Set up and maintain multiple billing profiles, making it easy to manage different payment methods or departments within your organization. - **Configure Low Balance Notifications**: Set up alerts for low eSign credit and stamp paper balances to ensure you’re never caught without the necessary resources. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/manage-billing-profiles # Manage Billing Profiles ## Create a Billing Profile 1. Click on the Setting icon ⚙️. 2. In the left navigation panel, go to **Wallet > Billing Profiles**. 3. Click **+ Create Billing Profile**. It will open a pop-up Add New Billing Profile. 4. Provide information as required. 5. Click **Create**. > **Info — Note** > > Billing Profile information will be displayed in the invoice. You can create multiple billing profiles following the same steps. ## Edit a Billing Profile To edit a billing profile: 1. Click on the **Edit** option. 2. Modify details as you desire. 3. Click **Update**. ## Delete a Billing Profile To delete a billing profile: 1. Click on the **Delete** option. 2. Confirm your action by clicking on the **Delete** button. > **Warning** > > Deleting a Billing Profile cannot be undone. ## Set a Default Billing Profile To set a default billing profile for all your purchases, you need to click on **Set as default** option. The default billing profile will be selected automatically while purchasing eSign credits and stamps. However, you can switch the billing profile while making the purchase. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/purchase # Purchase eSign and Stamps 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. Go to **Wallet > Purchase**. 3. In Transaction Items, click **+ Add Items** to add desired products like eSign and Stamps. 4. Add quantity for each product as needed. 5. Click **Add Balance** on the bottom right. You will see the total base cost here. 6. Review the selected items and quantities in the Confirm Order screen. Click **Edit** to make changes or **Confirm** to proceed. 7. Click **Pay** and choose payment methods like UPI, Credit/Debit Card, Net Banking, and Wallet. 8. Alternatively, you can pay directly into our bank account using NEFT, RTGS, or IMPS. Click **View Bank Details** for more information. > **Info** > > Before purchasing Stamps, create a related Stamp Series. Learn [**how to create a Stamp Series**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/create-a-stamp-series). Depending on your chosen payment method, processing may take a few hours. Once payment is successful, eSign credits will be added to your account. If you've purchased stamp papers, we'll initiate the stamp procurement process. Now the eSign credits are in your account, you are all set to send your first document for eSign. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/download-invoice # Invoices The Invoice section allows you to access, view, create, and download all invoices for your purchases. ## Accessing and Download Invoices 1. Click on your **profile icon** in the top right corner of the dashboard 2. Select **Wallet** from the left navigation menu 3. Click on the **Invoice** tab to view all invoices generated for your purchases In the invoice list view, you will see: - **Invoice number** for each transaction - **View button** to open and view the complete invoice details ### Invoice Information Each invoice contains: - Invoice number and date - Billing address - Item and description (credits purchased) - Amount breakdown - Tax details (GST, if applicable) - Payment method From the Invoice tab, you can access the following invoice types: - Tax Invoice / Bill of Supply (B.O.S) - Proforma Invoice (accessible in the Proforma Invoice tab) ## Understanding Invoice Types Leegality generates different types of invoices depending on the transaction stage and your tax registration status: ### Proforma Invoice A proforma invoice is a preliminary document issued **before payment** is made. It serves as: - A quotation or estimate for the purchase - A reference for the amount due - A document for internal approval processes **How it's generated:** A proforma invoice is automatically created when you add eSign credits for relevant products to your cart. Right before payment, the proforma invoice is generated and can be accessed in the **Proforma Invoice tab**. **When you receive it:** Before completing the payment for credits or subscriptions. ### Tax Invoice A tax invoice is the official document issued **after payment** is completed. It includes: - Complete transaction details - GST/tax breakdown (if applicable) - Payment confirmation - Legally valid proof of purchase **When you receive it:** Immediately after successful payment completion. ### Bill of Supply (B.O.S) A Bill of Supply is issued instead of a Tax Invoice when the transaction is exempt from GST or when the seller is not registered under GST. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/notifications-for-low-balance-of-esign-and-stamp # eSign & Stamps Low Balance Reminder This feature allows you to set a low balance threshold for eSign credits and stamp papers in your account. When the threshold is reached, a notification is triggered and sent to the configured email addresses. > **Tip — Notification Recipients** > > Notifications will be sent to the email addresses configured in the notifications section. To add more recipients for low-balance notifications, navigate to Manage Notifications. ## Setting the Low Balance Notification Threshold 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. In the left navigation panel, go to **Wallet > Low Balance Configs**. 3. Choose either the **default threshold** or set a **custom threshold** to trigger notifications. ### Option 1: Default Low Balance Notification Thresholds: Selecting this option sets notifications at the following consumption levels: **50%**, **75%**, **90%**, and **100%** of the most recent purchase. - **eSign Credits**: Notifications are triggered when 50%, 75%, 90%, and 100% of your most recent eSign credits are consumed. - **Stamp Papers**: Notifications are triggered at 50%, 75%, 90%, and 100% of your most recent stamp paper purchase. > **Info — Example** > > If you purchased 1,000 eSign credits: > > * Notification at **500 credits** consumed. > * Notification at **750 credits** consumed. > * Notification at **900 credits** consumed. > * Notification at **1,000 credits** consumed. --- ### Option 2: Set Custom Low Balance Notification Thresholds This option allows you to set custom threshold percentages. You can set different thresholds for eSign credits and stamp papers. **Single Percentage Limit**: Unlike the default, you can set only one percentage limit. When this threshold is reached, a notification is triggered. **Example:** If you set a custom threshold at **95%** and recently purchased 1,000 eSign credits: * You will receive a notification when **950 credits** are consumed. > **Info — Note** > > Setting a custom threshold deactivates default notifications, and only custom notifications will be sent. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/purchase-history # Purchase History The Purchase History shows you the record of all purchases made for your Leegality organization. To Access Purchase History, 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. In the left navigation panel, go to **Wallet > Purchase History** option. ## eSign Purchase History The eSign Purchase History tab displays records of all purchases made for eSign credits, including: - **Purchase Date:** Date when the purchase transaction was initiated or completed - **Expiry Date:** Date until which the purchased credits remain valid for use. - **Purchase Value:** Number of credits purchased - **Consumed:** The quantity of credits that have been used for signing documents. - **Expired Credits:** The quantity of credits that have reached their expiry date and are no longer usable. - **Balance:** The remaining balance indicates the number of eSign credits that are still available for use after considering the consumed and expired credits. > **Info — Note** > > eSign credits are consumed on a FIFO (First in First Out) basis. > When eSign credits are consumed on a FIFO basis, the credits are used starting with the earliest purchase first. > > **Example:** > > - On **August 1, 2024**, you purchased 500 eSign credits. > - On **August 15, 2024**, you purchased an additional 300 eSign credits. > > **Usage:** > > - On **August 30, 2024**, you used 400 eSign credits. According to FIFO: > - 400 credits are deducted first from the August 1 purchase (leaving 100 credits remaining from this batch). > - The August 15 purchase batch still has 300 credits. > > - On **September 5, 2024**, you used another 200 eSign credits. FIFO dictates: > - 100 credits are taken from the remaining August 1 batch (which now depletes this batch completely). > - The remaining 100 credits are taken from the August 15 batch (leaving 200 credits still available from this batch). > > **Remaining Credits:** > > - **August 1 Purchase** – 0 credits remaining. > - **August 15 Purchase** – 200 credits remaining. ## Stamps Purchase History The "Stamps Purchase History" tab shows records of all purchases made for Stamps, including: - **State:** State for which stamps are purchased. - **Denomination:** Denomination refers to the face value of each stamp. - **Series:** Stamp Series for which stamps are purchased. - **Purchase Amount:** The total cost spent on purchasing the stamps. - **Purchase Quantity:** The total number of stamps purchased in the transaction. - **Used:** The number of stamps that have been affixed to documents. - **Expired:** The number of stamps that are expired and are no longer valid for use. (**Note:** You can [**extend the expiry date of expired stamps**](https://knowledge.leegality.com/document-execution/stamps/stamp-series/extend-expiry-of-stamps.mdx), making them available for use again.) - **Unused:** The number of stamps that have not yet been used or affixed to the document. - **Under Process:** The number of stamps that are currently being procured and digitized. These stamps are in the process of being prepared for use but have not yet been made available for application. --- URL: https://knowledge.leegality.com/document-execution/settings/Wallet/consumption-history # Consumption History To access your consumption history; 1. Click on the **Settings** ⚙️ icon on the top right. 2. Select **Wallet > Consumption History** History in the left panel. #### eSign and Subscription Consumption History ## eSign and Subscription Consumption History | Transaction Type | Description | | ---- | ---- | | **Credit** | When eSign credits are purchased, they are recorded under "Credit" with the date of the addition. | | **Reserve** | Number of eSign credits are put on hold when an invitation is sent, based on the invitee’s role and eSign type. | | **Debit** | When a document is signed, the reserved eSign credits are debited from the account. | | **Release** | Reserved eSign credits are either debited upon signing or refunded if the invitation expires without a signature. | > **Info — Note** > > Reserved **eSign credits will not be refunded** if certificate verification (Aadhaar eSign, NeSL, DSC) fails due to mismatched details, even if the document remains unsigned. ### Transaction Details * **Transaction type:** Whether the transaction was a credit, debit, release, or reserve. * **Date and Time:** The date and time of the transaction. * **Remark:** A brief summary, including the associated invitation hash. * **Debit or Credit:** Shows whether the transaction resulted in a debit or credit of eSign credits. * **Balance:** The remaining balance after the last transaction. ### Filters You can filter transactions by: * **Date Range:** View transactions within a specified time frame. * **Transaction Type:** Filter by Credit, Debit, Reserve, Release, or Reduce. > **Note:** Ensure the resulting selection contains less than 10,000 transactions. * **Balance Type:** Filter by eSign Balance or Subscription Balance. #### Stamps Consumption History ## Stamps Consumption History You can access the Consumption History by clicking on the **Stamp** tab. This section provides detailed records of stamp usage. Use **Series** dropdown to choose a stamp series and view its consumption history. ### Transaction Type | Transaction Type | Description | | ---------------- | ----------- | | **Credit** | Stamps are added to the series, and the date of addition is recorded. | | **Reserve** | Stamps are deducted from the account, holding them for documents sent for signing. The document ID and reservation date are noted. | | **Debit** | Stamps are deducted from the account after a document is signed, with the document ID and transaction date recorded. | | **Release** | Stamps are refunded back to the account if a document remains unsigned and has expired or been deleted. | ### Stamp Consumption Details The Stamp Consumption History provides the following information: - **Series Number:** Identifies the stamp series for which consumption history is being viewed. - **Transaction:** Details whether the transaction is a credit, debit, reserve, or release. - **Reference ID:** Document IDs associated with stamp usage. (**Note:** Document IDs may repeat if invitations are revoked or expired.) - **Date:** The date of each transaction. - **Remark:** Additional details regarding each transaction. - **Release Date:** Indicates when stamps are released from reserve, whether credited or debited. - **Debit:** The number of stamps deducted from the account for the transaction. - **Credit:** The number of stamps credited to the account through release or purchase. - **Balance:** The remaining number of stamps in the account for the specified series after the last transaction. ## Download Consumption Report Apply the relevant filters on either tab and click **Download Consumption Report** to export the filtered records as a CSV file. The downloaded report includes the transaction type, date and time, remark, debit/credit, and balance for each entry. --- URL: https://knowledge.leegality.com/document-execution/settings/Admin/admin # Admin The Admin section provides controls for managing your Leegality account, the people in it, and how they work in Document Execution. > **Info — Access required** > > The Admin section is visible only to users with the **Admin** role. If you cannot see it, contact your account administrator to grant you Admin role access. ## What Admins can do - **Manage users and roles** — add, edit, and lock users and assign Admin, Billing, or User roles. - **Access other users' accounts** — use Impersonator Mode to view documents and act on a user's behalf. - **Control workflows, templates, and stamps** — create, edit, and management access (other roles get run-only or use-only access). - **Configure account-wide settings** — branding, department-level configurations, and notification setup. - **Manage billing and credits** — buy eSign credits and stamps, manage billing profiles, and view purchase and consumption history. --- # User Roles URL: https://knowledge.leegality.com/document-execution/settings/Admin/user-roles > A user role determines the set of permissions and actions available to a user. The admin assigns roles to users when they are added to an account. There are thr A user role determines the set of permissions and actions available to a user. The admin assigns roles to users when they are added to an account. There are three organizational roles in Leegality. - Admin - Billing - User Each role has different permissions within the system. Refer to the table below. ## Roles and Permissions Table | Permission | Admin | Billing | User | |-------------------------------------------|-------|---------------|-------------| | **New Document Flow** | ✔️ | ✔️ (if granted) | ✔️ (if granted) | | **Workflows** | ✔️ | Run only | Run only | | **Templates** | ✔️ | Use only | Use only | | **Stamps** | ✔️ | Use only | Use only | | **Buy eSign Credits and Stamps** | ✔️ | ✔️ | ❌ | | **User Management** | ✔️ | ❌ | ❌ | | **Configure Notifications** | ✔️ | User-level | User-level | | **Impersonator Mode Access** | ✔️ | ❌ | ❌ | | **Profile (Name and Password)** | ✔️ | ✔️ | ✔️ | | **API Use** | ✔️ | ✔️ | ✔️ | | **Set Default eSignature and Seal** | ✔️ | ✔️ | ✔️ | | **Enforce Invitation Expiry** | ✔️ | ✔️ | ✔️ | | **Branding** | ✔️ | ❌ | ❌ | | **Department Level Settings** | ✔️ | ❌ | ❌ | --- URL: https://knowledge.leegality.com/document-execution/settings/Admin/user-management # User Management ## Create a New User You can add users to your account in accordance with your subscription plan. 1. Click on the **Settings** ⚙️ icon on the top right corner. 2. Go to **Admin > New Users**. 3. Provide the following information. - **Name:** Name of the user. - **Email Address:** This email address will be used as login credentials. - **User Role:** Select the role for the user (Admin, Billing, or User). - **Department:** Choose the department. - **New Document Access:** Whether you want to allow this user to use new document flows. 4. Click **Create**. An email will be sent to the user’s email address to activate their Leegality account. > **Info — Note** > > The number of users allowed per account depends on the subscription plan. ## Edit User and Lock User ### To edit a user’s details. 1. Click on the **Settings** ⚙️ icon on the top right corner. 2. Go to **Admin > Users**. 3. You need to search for the user you want to edit. 4. Hover your mouse over it and click the edit icon **🖉** on the right. 5. In the pop-up box, you can edit Name, Role, and Enable/Disable New Document Access. 6. Click **Save** Changes after making the desired changes. ### To Lock a user 1. Go to **Admin > Users**. 2. You need to search for the user you want to lock. 3. Hover your mouse over it and click the lock icon 🔒 on the right. A locked-out user will see this error message: *"Your account has been locked by your organization. Please contact your administrator."* Follow the same steps to unlock a locked user. ## Ghost User A Ghost User is a deactivated user in an organization who has been removed from active access but is retained in the system. This preserves the integrity and audit trail of those completed documents while ensuring the user can no longer interact with the org. > **Info** > > To convert a user into a Ghost User, reach out to our support team at support@leegality.com. **How can I delete a user account permanently?** > User accounts cannot be deleted from the dashboard due to legal reasons. To delete a user account and profile permanently, you need to approach support@leegality.com. --- URL: https://knowledge.leegality.com/document-execution/settings/Admin/impersonator-mode # Impersonator mode Impersonator mode allows you to access other users' accounts to view their documents and perform actions on their behalf. This is useful for managing documents when users are unavailable. ## Use impersonator mode 1. Click the profile icon in the top-right corner. 2. Select **Switch Account** and choose the user whose account you want to access. You will enter impersonator mode. The header displays the email address of the user whose account you're accessing. To exit impersonator mode, click **Switch back to my account** in the top-right corner. ## Available actions in impersonator mode When in impersonator mode, you can: - View other users' dashboards - Download documents - Access user activity logs - Reactivate expired invitations - Delete invitations - Copy invitation URLs - View document details - View and download attachments - Re-invite rejected invitations - Resend notifications - Mark documents as complete ## Grant impersonator access to users You can grant impersonator mode access to specific users, allowing them to access another user's documents. 1. Click the Settings icon ![Settings Icon](https://knowledge.leegality.com/img/Icon=settings.svg) in the top-right corner. 2. Navigate to **Admin > Users**. 3. Locate the user whose documents you want to share. 4. Click the share icon ![Share user's documents icon](https://knowledge.leegality.com/img/Icon=share-2.svg). 5. In the **Add team members** dropdown, select the users you want to grant access to. 6. Click **Confirm**. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/branding # Branding Branding in Leegality allows you to personalise the eSigning experience for invitees. You can use branding controls to reinforce your organization's identity and reassure signers that documents sent through Leegality originate from your organization. With branding, you have control over the styling of email notifications sent to invitees and the signing view. The brand settings configured here will be reflected in all eSign invitations sent by users in your department. ## Set your Brand Name, Colour, and Logo 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. Go to **Department > Branding** and provide the following details: - **Brand Name:** This name will be used in email and SMS communications sent to invitees. - **Brand Colour:** Provide the color using hexcode. The selected colour will be displayed in the Header of email communications and signing view. The same colour will be used for buttons like sign and proceed. - **Brand Logo:** Displays your brand logo in the email notifications and signing view when invitees open your documents to view and sign/review. You can preview how provided branding information is displayed on the right in real-time. 3. Once satisfied, click **Update**. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/document-config # Document Configuration ## Enforce PDF Flattening **What is PDF Flattening?** PDF flattening is the process of converting a dynamic or interactive PDF document into a static one by merging all the layers and interactive elements. This ensures that the visual appearance of the document remains consistent across different viewing platforms and prevents further editing of its contents. **Why enforce PDF Flattening?** When a PDF is digitally signed and then flattened after filling form fields, the signature and the filled form fields become part of the static image of the document. This process ensures that both the signature and the filled form fields are preserved and cannot be altered or tampered with without invalidating the signature. Flattening the PDF ensures that the signed document and the filled form fields are locked in place. This prevents anyone from modifying the contents of the document or the filled form fields without invalidating the signature. It helps maintain the integrity and authenticity of the signed document. **What happens if PDF flattening is not enabled?** If PDF flattening is not enabled, it means that the form fields remain editable even after the document has been digitally signed. This presents a significant risk because it allows anyone with access to the document to modify the variable fields without invalidating the signature. As a result, the integrity and authenticity of the document are compromised, as it becomes susceptible to tampering. ### To Enable PDF Flattening 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Department > Document Configs**. 3. Enable **Enforce PDF Flattening toggle**. 4. Click **Update**. --- ## Automatically Delete Draft Documents You can use this feature to automatically delete all the documents in the draft after a pre-specified time duration. > **Info — note** > > By default, documents in the Draft will be deleted after 30 days of the creation date. For draft documents with affixed stamps, the stamps remain reserved and cannot be used in another document until the draft is deleted. ### To automatically delete documents in Draft 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Departments > Document Configs**. 3. Enable **Enforce auto-deletion of draft documents** toggle. Provide the number of days for document retention. (Days can range from 1 to 365) 4. Click **Update**. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/document-security-settings # Document Security Settings ## Invitee authentication before accessing document This feature adds an extra layer of security to protect your documents from unauthorized access. They dictate whether invitee authentication is required before accessing the document. Once enabled, invitees undergo an OTP authentication process before viewing the document. ### Enforce invitee authentication before accessing document If enabled, these settings will apply to all of the documents sent from the account. 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. Go to **Department > Document Security**. 3. There are two levels of authentication and you can choose any one: #### 1-Factor Authentication Invitees authenticate via OTP sent to their email address or phone number, as configured by the sender. #### 2-Factor Authentication Invitees authenticate via their email address as well as phone number. The sender provides both during the invitation process. > **Tip — 2-Factor Authentication Example** > > - The sender has provided the invitee's email address as well as phone number. > - The invitation link is sent via both email and SMS. > - If the invitee accesses the document link via email, the OTP is sent to the phone number for authentication. > - If the invitee accesses the document link via SMS, the OTP is sent to the email address for authentication. --- ## Auto Delete after Document Completion For enhanced security and automated document management, you can configure your account to automatically delete documents after they are completed. ### To set auto-delete document time duration: 1. Click on the **Setting** ⚙️ icon on the top right corner. 2. From the left navigation menu, go to **Department > Document Security**. 3. Enable **Enforce auto-delete after Document Completion** toggle. 4. Enter the number of days (from 7 to 365) that you wish to retain documents after completion before they are permanently deleted. > **Info — How it works** > > - If you enable auto-delete right now, it will only apply to documents you send from this point forward. It will not affect any documents that are already completed. > - If **enforce auto-delete on complete** is *Disabled* under **Department > Document Security** and a sender enables auto-delete from the **Signing Journey Options**, the completed document will be deleted after a default period of 7 days. > **Warning — Irreversible Action** > > Documents removed by the auto-delete feature are **permanently erased and cannot be recovered**. Please ensure you have downloaded and stored all necessary documents before the retention period ends. > **Info — note** > > Documents larger than 7 MB will not be shared as attachments via email. Instead, you will get a link in the email to download the signed agreement copy and audit trail. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings # eSignature Settings When senders create a document for signature, they need to select a signature type for each invitee. The signature types available to a sender depend on the account configuration. You can use the eSignature Settings page to choose the signature types available for an account. ## Enable eSign Types for senders 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Department > eSignature**. This will show you all available eSign types. 3. Use the toggle switch to add them to the sending journeys. 4. Some eSign types have sub-types, for example, Aadhaar eSign has OTP, Biometric, IRIS, and Face. You can add them individually. All toggled-on eSign types are now available to senders when they create a new document. ### Set the Default eSign Type You can set the default eSign type to apply to signers when senders have not specified any during the sending journey. Only one signature can be assigned as a default. 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Department > eSignature**. 3. Find the signature type you want to set by default and click on the **✔** icon right next to it. 4. A confirmation message will show in the top right corner. The default eSign type will be pre-selected during every new document journey. However, the sender can choose others as required. ## Configure Certificate Verification Settings You can configure how Leegality verifies signer information against their digital signature certificate. This includes setting verification parameters, choosing between AI-based or text-based name matching, and defining actions for verification failures. > **Info — Prerequisites** > > Ensure that the eSign type (Aadhaar eSign or DSC Token) is enabled in your department settings before configuring verification parameters. #### Aadhaar eSign ### Configuring Aadhaar eSign Verification **Steps to Configure:** 1. Click the **Settings (⚙️)** icon on the top right corner. 2. Go to **Department > eSignature**. 3. Click the **⚙️ icon** next to **Aadhaar eSign** to open the configuration panel. **Configure Verification Parameters:** The configuration panel displays available verification types and their corresponding acceptance conditions. Available verification types for Aadhaar eSign: - Name - Gender - Year of Birth - Pincode - State - Title (Last 4 digits of Aadhaar number) For each verification parameter, select one of the following actions: - **Reject if failed (Default):** The signature is rejected if the parameter does not match the certificate details. - **Accept but respond with result:** The signature is affixed even if the parameter does not match, but the result is included in the details page and API response. **Smart Name Verification:** Configure how the system verifies the name on the Aadhaar certificate against the invitee's name. - **Name Matching Type:** Select between AI-Based name matching and Text-Based name matching. - **Match Threshold:** Define the required percentage match for name verification. - **Acceptance Condition:** Choose the action upon failure (Reject if failed / Accept but respond with result). **Save Your Configuration:** - Click **Save** to apply your changes. - Click **Close** to exit without saving. - Click **Reset to Default** to revert to system defaults. #### DSC Token ### Configuring DSC Token Verification **Steps to Configure:** 1. Click the **Settings (⚙️)** icon on the top right corner. 2. Go to **Department > eSignature**. 3. Click the **⚙️ icon** next to **DSC Token** to open the configuration panel. **Configure Verification Parameters:** The configuration panel displays available verification types and their corresponding acceptance conditions. Available verification types for DSC Token: - Name - Pincode - State For each verification parameter, select one of the following actions: - **Reject if failed (Default):** The signature is rejected if the parameter does not match the certificate details. - **Accept but respond with result:** The signature is affixed even if the parameter does not match, but the result is included in the details page and API response. **Smart Name Verification:** Configure how the system verifies the name on the DSC certificate against the invitee's name. - **Name Matching Type:** Select between AI-Based name matching and Text-Based name matching. - **Match Threshold:** Define the required percentage match for name verification. - **Acceptance Condition:** Choose the action upon failure (Reject if failed / Accept but respond with result). **Save Your Configuration:** - Click **Save** to apply your changes. - Click **Close** to exit without saving. - Click **Reset to Default** to revert to system defaults. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/invitee-configurations # Invitee Configurations Invitee configurations allow admins to determine which invitee-level options are accessible to senders during the document sending process. Once activated, these options become available for senders to use as needed during the document sending journey. 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Department > Invitee Configs**. 3. Enable or disable the option as required: - **Reviewer Role:** When enabled, the sender will be able to use Make Reviewer. - **Disable OTP authentication for Reviewer:** Select this and the sender will have the option to enable and disable OTP authentication for the reviewer. - **Group Invitees:** When enabled sender will have the option to create group invitees during the sending journey. - **CC Notifications:** When enabled sender will have the option to add CC invite(s) to the document during the sending journey. - **GPS location and accuracy based restrictions in the signing journey:** When enabled, senders can enable geo-fencing for invitees. You can also specify the default permissible radius and allowed accuracy deviation (in meters). - **Rejection in Signing Journey:** When enabled sender will be able to allow invitees to decline to sign a document. The sender can also require invitees to provide a reason why they are declining to sign. - **Contact Book:** When enabled, the sender will be able to use contacts saved in the contact book. - **Local Language Support:** When enabled, the sender can enable local languages for the invitees. - **WhatsApp Pings:** When enabled, the sender will have the option to send eSign notifications via WhatsApp. - **Face Match Verification:** When enabled, senders can enable face match verification for invitees. - **Acceptance percentage:** The minimum threshold required for successful face match verification. - **Failure treatment:** Configure how to handle verification failures. Select **Reject if Failed** to block the signing process, or **Accept but respond with results** to allow signing while recording the verification result. - **Smart User Liveliness:** When enabled, senders can enable smart user liveliness verification for invitees. - **Acceptance percentage:** The minimum threshold required for successful smart user liveliness verification. - **Mask PII data for Invitees:** When enabled the sender will have the option to enable PII masking for invitees during sending journeys. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/payment-collect # Payment Collect The Payment Collect feature allows Leegality users to collect payments from signers during the signing journey. Payment will be collected via a payment gateway Razorpay or BillDesk. ## Prerequisites - A Razorpay or BillDesk account with KYC completed. - A bank account should be linked with the payment gateway account. ## Create a Payment Collect Profile You need to connect your payment gateway account with Leegaity in order to use the Payment Collect feature. 1. Click on the **Settings** ⚙️ icon on the top right corner. 2. Go to **Department > Payment Collect**. 3. Select the any one Payment Gateway from dropdown **(Razorpay or BillDesk)** and click on **“+”** icon. ### Option 1: Connect Razorpay 1. Enter a suitable **Profile Name** and click on **Link** button. 2. You will be redirected to a Razorpay where you need to login to your Razorpay account and Link Leegality with it. 3. Click on checkbox **☑** and agree with **Terms & Conditions**. 4. After that, click on **Authorize**. Your Leegality and Razorpay account are now linked and can be used for collecting payments from invitees. ### Option 2: Connect BillDesk 1. Enter a suitable **Profile Name**. 2. Provide **Client ID, Merchant ID**, and **HMAC Key**. You will get these from BillDesk. 3. Click on the **Link** Button. Your Leegality and BillDesk account are now linked and can be used for collecting payments from invitees. > **Tip** > > You can set multiple Payment Collect profiles and use anyone to collect payments during the sending journey. ## Enable Payment Collect for Sender Toggle on **Payment Collection in signing/reviewer journey**, this will allow the sender to use the Payment Collect feature during the sending journey. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/sftp # SFTP (Secure File Transfer Protocol) ## Why SFTP is Required? If you want to store the documents on your server then you need to add an SFTP profile to ensure the secure transfer of documents from the Leegality server to your server. ## Steps to add SFTP Profile #### Password 1. Click on the **Settings** ⚙️ icon on the top right corner. 2. Go to **Department > SFTP**. 3. Click the **Add New SFTP** button. 4. Provide the following information. - **SFTP Profile Name:** This profile name will be visible to the sender during the sending journey. - - **Authentication Method:** Select **Public Key**. - **Host URL:** This is the host URL of the server where completed documents will be sent. - **Destination:** This is the path of the folder where completed documents will be sent. - **Port:** Port number required to establish the connection. - **Username:** Username that will be used to connect with the server. - **Password:** Password that will be used to connect with the server. 5. Click **Save**. #### Public Key 1. Click on the **Settings** ⚙️ icon on the top right corner. 2. Go to **Department > SFTP**. 3. Click the **Add New SFTP** button. 4. Provide the following information. - **SFTP Profile Name:** This profile name will be visible to the sender during the sending journey. - **Authentication Method:** Select **Public Key**. - **Host URL:** This is the host URL of the server where completed documents will be sent. - **Destination:** This is the path of the folder where completed documents will be sent. - **Port:** Port number required to establish the connection. - **Username:** Username that will be used to connect with the server. 5. Click **Save**. Copy the **Public Key** and share it with SFTP server admin. You can also regenerate the **Public Key** by clicking on the **Regenerate Key Pair** option. A test file will be sent to the configured SFTP server, if the file is sent successfully only then the SFTP profile will be saved. You can create multiple SFTP profiles and select the one you would like to use during the sending journey. > **Info — Note** > > While Editing, you cannot change the password of the SFTP profile. ## Use SFTP Document Transfer in Sending Journey Toggle ON **Allow SFTP in document sending journey** to get the option to send the completed document on the server via SFTP. A zip file of the completed document and audit trail will be sent to the configured server after all invitees sign the document. The file transfer could take up to 15 minutes. An email/SMS notification will be triggered if the transfer via SFTP fails. --- URL: https://knowledge.leegality.com/document-execution/settings/Department/stamp-settings # Stamp Settings In Stamp Setting, admins can set user permissions to create stamp series and stamp groups. Also, allow the user to use stamp series, stamp group, upload stamps, and revenue stamps during the sending journey. 1. Click on the Setting ⚙️ icon on the top right corner. 2. Go to **Departments > Stamp**. - **Stamp Series:** Activate this to allow the user to create stamp series. - **Stamp Group:** Activate this to allow the user to create stamp groups. - **Allow Self-Upload:** Activate this to allow the user to manually upload a stamp paper. - **Revenue Stamps:** Activate this to allow revenue stamp series access for your organisation. 3. Click **Update** after making the changes. --- URL: https://knowledge.leegality.com/document-execution/settings/Notifications/notification # Notifications The notifications tab lets you control the various notifications that are sent by Leegality. You can configure the user-level and organization-level notifications. You can access the notification configuration. 1. Click on the **Settings** ⚙️ icon on the top-right. 2. Select **Notifications** from the left panel. ## User Level Notifications > **Info — Who receives these notifications** > > The **sender** of a document automatically receives all event notifications below — no opt-in needed. To send these notifications to anyone else (admins, teammates, or any other user), add them as a recipient under [Manage Recipients](#manage-and-configure-recipients-of-notifications). > > **Example:** An admin who wants alerts for *any* document signed in the organisation (not just the ones they sent) must add their email under Manage Recipients for the relevant notification. ### Document These are document event notifications. - **Completion Notifications:** Sent when a document is completed i.e. signed/reviewed by all invitees. - **Signing Updates:** Sent when an invitee signs the document and the reviewer approves or rejects the document. - **Failure Updates:** Sent when a document signing is failed for an invitee. The possible scenarios reasons are; - Invitation expired/timed out. - Invitee rejected signing the document. - Aadhaar eSign retry attempts exhausted. - Mismatched certificate details. - **Self-Sign Notification:** Sent for documents where you’re the sender and invitee. Notifications are received when you sign and approve or reject the document. - **Auto-Deletion Notification:** Sent before a document's scheduled deletion date. ## Organisation Level Notification > **Info — note** > > Only admins can configure Organization-Level notifications. ### eSign Credits Low Balance - **Low Balance Notification:** Sent when eSign credits balance is low. You can set a [low eSign balance threshold for receiving these notification](https://knowledge.leegality.com/document-execution/settings/Wallet/notifications-for-low-balance-of-esign-and-stamp). ### Downtime You will get these notifications from `support@leegality.com` - **NSDL Updates:** Sent when there are updates regarding NSDL. - **Virtual Sign Downtime:** Sent when there are updates regarding Virtual Sign. - **NeSL Updates:** Sent for NeSL updates, including downtime and article code updates. ### SFTP - **SFTP Failure Notifications:** Sent when a completed document transfer fails via SFTP. ### General - **Payment Gateway Notifications:** Sent when the payment gateway account linked to your Leegality account is unlinked. - **eSign Credits and Stamps Expiry Notifications:** Sent when eSign credits and stamps are about to expire. Notifications are sent 30, 15, 3, 2, and 1 day before the expiration date. ### Stamp Procurement Updates - **Order Updates Notification:** Sent at key stages of your stamp paper procurement. - **Order Placed:** When a stamp order is created in Leegality. - **Order Delayed:** When the Leegality stamp team revises the due date for an order. - **Order Completed:** When all stamp papers in the order go live for the customer. - **Courier Updates Notification:** Sent for dispatch and delivery of physical stamp paper shipments, including tracking details. - **Courier Dispatched:** When the Leegality team dispatches the courier to the customer. - **Courier Delivered:** When the courier partner marks the shipment as delivered. ## Manage and Configure Recipients of Notifications 1. Click on the **Manage Recipients (n)** option. 2. Enter the Recipient's **name, email address and/or phone number**. 3. Click on the ✔ icon. Use the same steps to add, remove and edit the recipients of other types of notifications. > **Info — Note** > > - You can add a maximum of **3 recipients** per notification type. > - Recipients can be added using **either an official or a personal email address** — there is no restriction on the email domain. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/document-level/document-expiry # Set expiry of signing link Set expiry of signing link allows you to set the expiry timeline of the document. ## Configuring Expiry Duration When setting the expiry duration for a document, the following options apply: - **Minimum Expiry (45 minutes):** Set by entering `-1`. - **Same-Day Expiry:** Entering `0` sets the invite to expire at 11:59:59 PM on the day it is sent. - **Custom Expiry (1+ Days):** Entering any number greater than `0` specifies the number of days the invite will remain valid. > **Info — Note** > > Expiry days must be set to 365 or less. ## How to Set Expiry > **Info — Note** > > If no expiry duration is specified, the eSign invitation will default to a validity of 10 days. You can extend/reduce the expiry of an active sent document. ## Invitee Experience Once the document is expired, the email/SMS notification will be sent to the invitee. > **Info — Note** > > Document expiry reminders are sent 3, 2 & 1 days before the documents expire. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/document-level/reference-attachments # Reference Attachments for Invitees The **Upload Reference Attachments for Invitees** feature allows senders to include additional attachments with the document being sent to invitees. These reference attachments are accessible to invitees during their signing journey, providing them with supplementary information or context related to the document. ## Use a Reference Attachment > **Info — Note** > > A reference attachment size should be less than 5MB. ## Accessing Reference Attachments During the Signing Journey Invitees can view and download reference attachments provided by the sender during their signing journey. To access reference attachments: 1. Click the **Attachment** icon (📎) located on the top-left side of the screen. 2. A list of all reference attachments will appear. 3. Click **Preview** to view the attachment or **Download** to save it to your device. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/document-level/sftp # Transfer Completed Document using SFTP SFTP, or Secure File Transfer Protocol, is a file transfer mechanism that uses secure shell encryption to provide a high level of security for sending and receiving file transfers. It builds on the File Transfer Protocol (FTP) and includes Secure Shell (SSH) security components. SFTP transfers files securely using SSH and encrypted FTP commands to avoid password sniffing and exposing sensitive information in plain text. Since the client needs to be authenticated by the server, SFTP also protects against man-in-the-middle attacks. Secure File Transfer Protocol helps in providing secure file access, file transfer, and file management of signed documents and audit trails. > **Info — Note** > > Note: The transfer of this zip file is triggered within 15 mins upon document completion. ## Steps to activate SFTP 1. Once the document is created or while creating the workflow, on the invitee page click on **Signing journey options**. 2. Toggle on **Transfer Completed Document using SFTP**. 3. Choose an **SFTP Profile** from the drop-down. > **Info — Note** > > The completed document and audit trail will be transferred to the selected SFTP profile once the document is completed. If SFTP is configured for a document, once all signatories sign the document, the completed document and audit trail will be transferred via SFTP as a single zip file. An email/SMS notification will be triggered if the transfer via SFTP fails. ## Name Format of Transferred Document > **Info** > > - Zip file: IRN_DocumentID.zip > - Signed Document: 1_Document Name.pdf > - Audit Trail: 1_Audit Trail.pdf The Document Name and Audit Trail are indexed to prevent the transfer of duplicate documents. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message # Custom Message The **Custom Message** feature allows senders to personalise the signing invitation by including a tailored message. When you enable the **Send custom message with signing link** option, you can configure a unique message that will accompany the signing invitation sent to invitees. This helps provide additional context or instructions to the notification. > **Info — Note** > > The custom message is included only in email invitations, not in SMS or WhatsApp. ## Use Custom Message ## Signing Journey The invitee will receive the custom message in their email notification. Refer to the image below for details. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer # Reviewer A **Reviewer** is a non-signing invitee who is responsible for approving or rejecting a document. This feature ensures that documents undergo a review process, allowing the reviewer to validate and approve the content before it proceeds to the designated signatories for signing. ## Activate Reviewer Role > **Info — Note** > > - If the Record the Reviewer’s Response option is enabled, all security check information will also be mentioned in the audit trail upon document completion. > - Signing order is mandatory if at least one invitee is a Reviewer. ## Reviewer Journey 1. The invitee receives a notification to review the document. 2. Click **Review** to be redirected to the Reviewer journey page. 3. Preview the document. - If you are the first invitee and the **Allow first invitee to fill** option is enabled for a template document, you can fill out the template fields before proceeding. 4. After reviewing, click **Proceed**. 5. Complete OTP authentication, if required. 6. Choose to either: - **Approve** the document. - **Reject** the document. 7. Click **Submit**, check the consent box, and confirm the action by clicking **Approve Document** or **Reject Document**. > **Info** > > If the Sender is the Reviewer, they cannot reject the document. ## Post Review ### Upon Approval - The next invitee in the signing order will receive their invitation. - The sender will be notified of the approval. ### Upon Rejection - The next invitee will not receive their invitation. - The sender can manually activate the next invitee's invitation from the Details page if needed. - On the Public Details page, the invitee card of the reviewer who rejected the document will display a View Message button (if the reviewer entered a message). Clicking it will open a side menu with: - The reviewer's message content. - Additional invitee-related information. > **Info — eSign Credit Consumption** > > eSign credits are deducted when the document is approved. No credits are deducted if the document is rejected by a reviewer. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/cc # CC Invitee A CC (Carbon Copy) Invitee is someone added to a document to stay updated on its progress. They receive notifications to ensure they are informed about the invitee and document's status. #### When to Use a CC Invitee CC invitees can be used in scenarios where individuals need to: - Receive notifications when invitations are sent to other invitees. - Stay informed about actions such as signing, approving, or rejecting by other invitees. - Be updated when the document is completed. - Be alerted about failure events like verification failure, expired invitations, or document deletions. ## Activate CC Invitee > **Info — Note** > > CC email notifications are not related to the Invitee Level email notification settings. > **Info — Note** > > The sender can *delete* a CC invitee at any point and effective immediately any further notifications will not be sent to that invitee. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/group-invitee # Group Invitee Group Invitee allows the sender to send signing invitations to a group of authorized signatories. Using this feature, anyone or all signers in one group can sign the document, thus, reducing the dependency on a single signer. The Group Invitee feature eliminates this bottleneck, enabling faster document processing and ensuring that the document can proceed as soon as the required signatures are gathered. > **Tip — Example** > > Suppose on an offer letter, you need signatures of 2 out of 3 HR executives, you can create a group with all 3 HR executives and set the signer threshold to 2. Any 2 invitees can sign the document at their convenience, and once 2 signatures are collected, the group signing is complete. ## Activate Group Invitee > **Info — Note** > > The eSign types and Invitee Group level options will be applicable to everyone in the group. > **Info — Note** > > Invitee Groups are also compatible with the “Reviewer Role”. ## Signing Journey for Group Invitee Once the signing invite is sent with the group invitee configured, the signer can sign the document. During the signing journey, the signer can see the group invitees by clicking on the **invitees** option Proceed with the signing of the document. Once the document is signed by any of the group invitees(depending on the threshold set while configuring the group invitee), the document gets completely signed. Once the document is completed, the signed document will be sent to all configured invitees in the group. > **Tip — Example** > > If the Group has 3 invitee and threshold is set as 2, the invitation for other signers gets expires once 2 invitees sign the document. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/one-factor-authentication # One Factor Authentication **One Factor Authentication** adds an essential layer of security to the signing process by requiring invitees to authenticate their identity via OTP sent to their Email ID or Phone Number (as configured during document setup). This ensures that only the intended recipient can access and view the document, safeguarding against unauthorized access due to mistaken forwarding of signing invitations. ## Use One Factor Authentication > **Info — Note** > > One Factor Authentication does not work with Quick Sign. ## Signing Journey 1. Click the **Sign** button in the email invitation or the eSign link received via SMS. 2. Provide the OTP sent to the email address or phone number associated with the eSign invitation. 3. Check your email or SMS for the OTP. 4. Input the OTP and click **Proceed**. 5. Access the document and proceed with the signing/reviewing process. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/two-factor-authentication # Two Factor Authentication **Two Factor Authentication** enhances document security by requiring invitees to authenticate using OTPs sent to both their Email ID and Phone Number before accessing the document. This ensures an additional layer of protection, preventing unauthorized access even if the signing invitation is mistakenly forwarded. To enable this feature, both the Email ID and Phone Number must be configured during document creation. ## How Two Factor Authentication Works 1. **Signing Link Accessed via Email or Phone Number:** - **Via Invitee Email:** If the signing link is accessed through the invitee's email, this counts as one authentication. The invitee will only need to complete OTP authentication for their mobile number. - **Via Invitee Phone Number:** If the signing link is accessed through the invitee's phone number, this counts as one authentication. The invitee will only need to complete OTP authentication for their email. 2. **Signing Link Accessed via Other Sources:** - If the signing link is accessed through any other source, both OTP authentications will be required—one for the email and one for the phone number. ## Use Two Factor Authentication > **Info — Note** > > 2-factor authentication doesn't work with Quick Sign > **Info — Note** > > Organisation Admins can enforce Two-Factor Authentication (2FA) for all documents sent from their accounts to enhance security. To learn how to enable this setting, [**click here**](https://knowledge.leegality.com/document-execution/settings/Department/document-security-settings) --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location # Capture GPS Location If the security feature "Capture GPS location" is enabled, the signers will need to allow access to their location coordinates before being permitted to sign the document. The GPS coordinates captured will be reflected in the audit trail. Geofencing is similar to creating a virtual barrier around a certain area. This fence designates the area we want to monitor, manage or control. In case of Leegality - Signing your clients documents within a designated area. ## Activate Capture GPS location > **Info — Note** > > In order to successfully capture a location, the **Accuracy Threshold** and **Permissible Radius** should be set at a greater range (2000 - 4000 m instead of 1000 m). This is because location capture depends on the device (e.g., laptops/computers have poorer accuracy compared to mobile devices). ## Signing Journey of Capture GPS location During the signing journey, the GPS location will be captured, and click on “proceed”, the captured location will appear in the audit trail. > **Info — Note** > > Signer has to give the location access to the browser for capturing GPS location while signing the document. ### Scenario A: Successful GPS Capture The flow will continue to operate as it does now if the invitation was signed or evaluated and did not violate the location-based or accuracy-based constraints and the document will be signed successfully. ### Scenario B: Failed GPS Capture Set configurations will be reviewed by the system and if there are any breaches then the invitee will be allowed to retry the signing or reviewing attempt. ​ 1. If **Accuracy-based Restriction** fails, the message *Your GPS accuracy is low. Please check your device’s location service and try again.* is displayed. Refer to the image below. 2. If **Location-based Restriction** fails, the message *You are outside the permissible area. Please try again from a different location.* is displayed. Refer to the image below. > **Info — Note** > > Accuracy-based restrictions function best on mobile devices and tablets, which have the necessary hardware for precise GPS capture. Laptops and desktops may not provide highly accurate GPS location data. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo # Capture Photo If the security feature "Capture photo" is enabled, the signer will need to grant access to their camera for live photo capture. The signer will not be allowed to sign the document until the live photo capture is completed. ## Activate Capture photo ## Signing Journey 1. During the signing journey, the signer is presented with a set of on-screen instructions to follow. 2. After ensuring the prerequisites mentioned on the instruction page are met, click **Proceed**. The signer must grant camera access for photo capture. 3. Click **Capture** to take the photo. 4. Review the captured photo. If satisfied, click **Proceed**; otherwise, click **Retry** to retake the photo. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match # Face Match The **Face Match** feature enhances document security by leveraging facial recognition technology to verify the signer's identity. It matches the signer's face image, captured during the signing journey, with a reference image—such as an uploaded identity document or face verification photo—provided by the sender when sending the document. This ensures that only the intended recipient is authorized to sign, offering an additional layer of identity verification. ## Activate Face Match ## Signing Journey 1. During the signing journey, the signer is presented with a set of on-screen instructions to follow. 2. After ensuring the prerequisites mentioned on the instruction page are met, click **Proceed**. The signer must grant camera access for photo capture. 3. Click **Capture** to take the photo. 4. Next, - **Successful Face Match:** The invitee will see a success message and can proceed to sign or review the document. - **Failed Face Match:** If the captured face does not match or no face is detected, the invitee will be prompted to retry. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness # Manual User Liveliness This feature prompts the signer to do a face capture along with an OTP verification (the OTP will appear on the screen) in order to proceed with the signing process. ## Activate Manual User liveliness ## Signing Journey 1. During the signing journey, the below instructions will appear on the screen which has to be followed. - Capture a 5-second video clip of yourself - Displaying OTP in front of you - Sit in well-lit place - Only 1 person before the camera - Remove accessories such as spectacles and headphones. 2. After having the prerequisites as mentioned on the instruction page click on “Proceed”. 3. The signer will need to allow access to their camera for capturing the short live video and show the OTP that is appearing on the screen. - **Two ways to show OTP during liveliness:** - **QR Code:** Scan the QR code in the phone camera which will lead to the OTP page in the phone browser which the signer has to show in front of the camera and capture the photos. - **On blank page:** Write down the OTP on the blank page and show it in front of the camera and capture the photos. 4. Once the photos are captured, click on “Proceed” to proceed with the signing of the document. > **Info — Note** > > The signer will not be allowed to sign the document until the system verifies the OTP appearing on the screen that is written on paper or shown on the phone. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness # Smart User Liveliness Smart User Liveliness ensures that the signatory is actively present during the eSigning process using AI-based facial recognition. It detects and rejects spoofing attempts such as photos and recorded videos. By analysing facial cues and other behavioural patterns, Smart User Liveliness ensures signer identity, enhancing the security and integrity of electronic signatures. ## Enable Smart User Liveliness in Department-Level Settings You can enable Smart User Liveliness in the Department-level settings, depending on your subscription plan. > **Info — Note** > > The availability of Smart User Liveliness in Department-level Settings depends on your subscription plan. > > If included in your plan, only one version (either Smart User Liveliness Version 1 or Version 2 Beta) will be active for your Leegality account at any given time. 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to the **Department > Invitee Configs**. 3. Toggle Enable **Smart User Liveliness** (**Note:** Version 1 or 2 will be shown based on your subscription). 4. Set the **Acceptance Percentage**. The Acceptance Percentage indicates the confidence score at which Smart User Liveliness confirms the authenticity of the document signer. (We recommend setting this percentage to around 65%.) 5. Click **Update** to save settings. > **Info — note** > > OTP-based (Manual) User Liveliness will not appear in Department settings but you will get it in the Sending Journey if included in your plan. ## Use Smart User Liveliness This section guides you through the process of sending a document with Smart User Liveliness enabled. Follow the same steps for workflow-based sending journeys (Excel and Dashboard) as well. 1. Click on **+ Create** and start a new document journey or select a template. 2. On the Invite screen, click on **Invitee level options** of those invitees for whom you want to enable Smart User Liveliness. 3. Toggle **Enable security features**. After that, enable **Capture photo**, and then enable **Liveliness**. 4. Select the **Smart User Liveliness** option. > **Info** > > Smart User Liveliness replaces Old User Liveliness in the sending journey if enabled in department-level settings. 5. Set the **number of retry attempts** allowed by the signer for Smart User Liveliness. The drop down offers options ranging from 0 to 3. “0” signifies no retry attempts, while each increment from 1 onwards represents an additional retry attempt beyond the original. 6. Click **Save** and send your document. > **Info** > > Smart User Liveliness is unavailable for Automated eSign (Virtual & Doc Signer) & Doc Signer. ## Signing Journey Here, we outline the signing process with Smart User Liveliness. The signer needs to follow the steps mentioned below to complete the Liveliness check in their signing journey. > **Info — Note** > > These instructions must be followed strictly for successful signer’s verification. 1. The invitee receives the invitation via email, SMS, or WhatsApp. Start the journey by clicking signing link/button. 2. Preview the document and click on the **Proceed** button 3. Read and follow the instructions carefully and click on Proceed at the bottom right. 4. Next, a camera preview will be shown to the signer. Here they can switch between front or back cameras and also ensure the face is properly visible. 5. Once satisfied with the preview, click Capture to **continue**. 6. The signer must align their face within the oval frame within 15 seconds. ### Case I: Success - The signer will see a success message with 3 captured photos. - If the signer is unsatisfied with the outcome, they can click on **Retry** for another face capture attempt. ### Case II: Failure - The signer encounters a failure message (e.g., Time Out or Threshold not matched). - In case of Time out, the signer needs to retry the face capture attempt and place their face in the oval within the set time frame. - In case, the Threshold is not matched, the signer needs to retry the face capture (If additional attempts are allowed) and make sure they are in a well-lit environment with no accessories on like spectacles, headphones, etc. 7. Click **Proceed** in the bottom right corner to eSign the document. ## Face Match + Smart User Liveliness If you have configured both Smart User Liveliness and Face Match then the process of both will be carried out simultaneously in a single face capture. The signer will not be required to separately perform Face Match and Smart User Liveliness. The results of both will be shown on a single screen as well. > **Info — note** > > If Smart Face Liveliness fails then Face Match will not happen at all and only the liveliness result will be shown. If both Liveliness and face match are successful, a success screen will be shown. The remaining attempts displayed will reflect the lower count between Smart Face Liveliness and Face Match. Once attempts for either verification are exhausted, the signer cannot retry both liveliness and face match. For example, Face Match has 2 retry attempts and Smart Face Liveliness has 3 retry attempts. Then, After 2 retry attempts the signer cannot do both, neither Face Match nor Liveliness. ## Best Practices for Signers - Smart User Liveliness The signer can optimise their confidence score by adhering to these best practices during the liveliness check. - Make sure the signer is in a well-lit place. - Only one intended person should be in front of the camera. - Remove accessories like spectacles, masks, hats, headphone, etc. - Set the display’s screen brightness to a maximum level. - The surrounding environment should have fairly uniform light, and not too dark or too bright. - Lighting on the face should be flat, avoiding varied lighting such as shadows. - The signer’s face should have neutral facial expressions with mouth closed and little to no smile. - Minimum video recording resolution: 320x240px. ## Details Page: View Remaining Retry Attempts To check the remaining retry attempts for Smart user liveliness and/or face match verification for a signer: 1. Go to the details page of the document. 2. Hover over the info icon ⓘ next to the specific invitee. 3. A tooltip will display the remaining retry attempts for smart user liveliness and face match for that invitee. In the event of a timeout (where the system couldn’t detect your face within the oval in approximately 40 seconds), the number of retry attempts will not decrease. However, if the Smart User Liveliness check is unsuccessful, the number of attempts will decrease by 1. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/email-notifications # Email Notifications Email notifications keep invitees informed about key events in the document signing journey, including status updates and required actions, ensuring timely and efficient completion of tasks. For a full list of optional and mandatory notification types — including reminder notification frequency — see [Invitee Notifications](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications). If email notifications are **disabled**, invitees will not receive optional notifications. Some notifications are always sent regardless of this setting. See [Invitee Notifications](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications) for the complete breakdown. ## Use Email Notifications --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/sms-notifications # SMS Notifications SMS notifications keep invitees informed about key events in the document signing journey via their phone number. For a full list of optional and mandatory notification types — including reminder notification frequency — see [Invitee Notifications](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications). If SMS notifications are **disabled**, invitees will not receive optional notifications. Some notifications are always sent regardless of this setting. See [Invitee Notifications](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications) for the complete breakdown. ## Use SMS Notifications #### New Document Journey SMS notifications are enabled by default but can be disabled if not needed. 1. On the **Invitee Card**, click **Invitee Level Options**. 2. Enable or Disable **Send SMS Notifications**. 3. Click **Save**. #### Workflow Creation All notifications are disabled by default during workflow creation. 1. On the **Invitee Card**, click **More Options**. 2. Enable **Send SMS Notifications**. 3. Click **Save**. The workflow runner cannot disable notifications if enabled by the workflow creator, and vice versa. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/whatspp-notifications # WhatsApp Notifications In addition to SMS and Emails, communications can be sent to the invitees via WhatsApp messages as well. WhatsApp provides a better experience and robust delivery. WhatsApp can be activated for the invitees with their phone numbers. For a full list of optional and mandatory notification types — including reminder notification frequency — see [Invitee Notifications](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications). ## Use WhatsApp Notifications ## How WhatsApp Notifications Work? On Invitee Card, when **Activate WhatsApp** toggle is Enabled for an invitee: - Mandatory notifications, like document completion notifications and manual reminders, will always be sent via both SMS and WhatsApp, regardless of whether you’ve enabled WhatsApp or SMS notifications in the invitee level options. - Non-mandatory notifications, like automatic reminders, will be sent to invitees based on the selection of WhatsApp and SMS notifications in the invitee level options. The table below illustrates all combinations of SMS Notifications and WhatsApp Notifications, along with the corresponding notification delivery scenarios. | Invitee Level Options | | Non Mandatory Notifications | | | ----- | :---- | ----- | :---- | | **SMS Notification** | **WhatsApp Notification** | **SMS** | **WhatsApp** | | Off | Off | No | No | | Off | On | No, except when WhatsApp notifications failed to deliver. | Yes | | On | Off | Yes | No | | On | On | Yes, along with WhatsApp notification | Yes, along with SMS Notification | --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-in-signature # Invitee Name in Signature By default, the signer’s name configured during the invitee setup or entered by them during the signing journey appears inside the signature box. Enabling the option *Don't show invitee name in signature appearance* removes the invitee's name from the signature box. ## Show or Hide Invitee's Name in Signature > **Info — Note** > > This feature cannot be enabled for Automated eSign and NeSL. ## Signature Example The signer's name will appear within the signature, as shown in the image below. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal # Company Seal from Invitee An eSignature seal is a digital version of the traditional rubber stamp. It is used to authenticate signatures. Enable the option **Require company seal from invitee** while sending the document to get an organizational signature. Leegality will create a digital impression of a rubber seal and apply it on the signature of the signer. Configure your eSignature seal here. When a sender requests your signature with a seal, the one you have set up will be automatically pre-selected. To set up the eSignature seal for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Default eSignature Seal section, you can choose between three types of eSignature seals: - **Authorised Signatory:** Requires organization's name. - **Director:** Requires organization's name. - **Upload Physical Seal:** Upload an image of the physical seal. (Supported image formats are .jpg, .jpeg, and .png) > **Info** > > The company seal feature is available in every signing method, including **Aadhaar eSign**. When using Aadhaar eSign with a company seal, the signature will display your company seal instead of the Aadhaar logo. 4. You can see the preview of the eSignature seal on the right. 5. Click **Update** to save your settings. ## Requiring a Company Seal from Invitees ## Example of Company Seal with Signature --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing # Invitee Name Editing Enabling the option “Don't allow invitee from editing name in signing journey” restricts the invitee (signer/reviewer) from editing their name while signing the document. ## Allowing Invitee Name Editing in Signing Journey > **Info — Note** > > This feature cannot be enabled for Automated eSign and NeSL. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/custom-url-and-webhook/webhook-and-url # Add custom URLs and webhooks Custom URLs and webhooks provide a flexible way to manage signer journeys and receive document-related updates based on specific events during the eSign process. These configurations allow organizations to redirect signers to specific pages or receive structured payloads for enhanced tracking and integration with external systems. ## Use Custom URLs and Webhooks > **Info — Note** > > The URL must not exceed 255 characters. > **Info — Note** > > To know about custom webhook headers, [click here](https://docs.leegality.com/webhooks_resources) --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/custom-url-and-webhook/webhook-authentication # Webhook Authentication Webhooks enable the communication of invitation status and signed documents to your application. Previously, a standard webhook structure was available for such needs. You may also add additional header parameters to the webhook calls for authentication purposes. You can add the following to the Webhook headers: - Basic authentication parameters (like username and password) - Bearer/Token authentication parameters (fetching token or code from an API request and adding it to the webhook headers) - Any other static or dynamic (values fetched real-time from APIs) parameters. Steps to configure authentication parameters to webhooks headers Share your authentication requirements with Leegality Support Team from your registered admin email ID at support@leegality.com over a secure email. > **Info — Note** > > Please ensure the response gets parsed in the destination system properly and all access and permissions are set up if third-party integrations are implemented on your side. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents # Supporting Documents By enabling the option “Require invitee to upload supporting documents” you can request the signer/reviewer to upload documents while signing/reviewing the document. ## Use Supporting Documents > **Info — Note** > > Sender can ask for upto 50 supporting documents from the invitee. ## Signing Journey 1. After reviewing the document, click the **Proceed** button. 2. The list of required supporting document(s) will be displayed. 3. Click on the document name to upload the corresponding file. 4. Once the upload is complete, click **Proceed** to continue the signing journey. - **Allowed file types:** `.png`,`.pdf`,`.jpg`,`.jpeg` - **Maximum file size:** 2 MB > **Info — Note** > > The invitee cannot Proceed until all required supporting documents are uploaded. ## Access Supporting Document --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/additional-consent # Additional consent terms Enabling the feature “ Set additional consent terms” will help in adding custom consent which will be added in the signing journey along with the default Leegality consent which can contain further Specific consent requirements to be agreed upon. ## Use Additional Consent > **Info — Note** > > Both Leegality's default consent and any custom consent must be agreed to before proceeding with the document signing. > **Info — Note** > > The custom consent field has a character limit of 1000. ## Signing Journey 1. Open the signing link sent via email, SMS, or WhatsApp. 2. Review the document and click **Proceed**. 3. Choose your preferred signature type and click **Proceed**. 4. Provide consent for the **default** and **additional terms**. 5. Click **Sign Document** to finalize the signing process. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign # Reject to Sign This feature allows the signer to reject the document while viewing the document for signing. ## Activate Invitee Rejection > **Info — Note** > > Invitee rejection option cannot be enabled for automated sign and Nesl sign > **Info — Note** > > The invitee rejection option works with CC, reviewer, and group invitee feature. ## Invitee Rejection Journey 1. Open the signing link received via email, SMS, or WhatsApp. 2. Review the document and if you do not want to sign the document click **Reject**. 3. Authenticate using the OTP. 4. After entering the OTP, click **Proceed to Rejection**. 5. Provide the reason for rejection and click **Reject Document**. The document is now rejected. > **Info — Note** > > Once the document is rejected by the signer, the signing link would not be accessible and Signer receives an email. > **Info — Note** > > Sender of the document receives the email once the document is rejected by the signer ## Re-Inviting an Invitee Who Rejected to Sign 1. Click **Documents** on the top bar. 2. Go to the **Sent** folder on the left navigation panel. 3. [Find the document](https://knowledge.leegality.com/document-execution/manage-documents/find-documents) containing the invitee who rejected to sign the document. 4. In the **Invitee List**, you can see all active including one who rejected to sign. > The invitee's status will be `Unsigned` and `Rejected`. 5. Click **Re-Invite**, optionally add a message, and confirm to send the invitation. The signer will receive the signing invitation again via email or phone. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/mask-contact-details # Mask Contact Details Mask Contact Details is a feature designed to protect the contact details of invitees (signers and reviewers). When enabled, this feature ensures that an invitee cannot view the contact details (name, phone number, and email address) of any invitee during and after the signing journey. This option helps maintain privacy and security by preventing the exposure of contact details to unauthorized parties. ## Masking Method The Mask Contact Details feature partially obscures invitees' contact information by replacing some characters with asterisks (\*). For example: | | Unmasked | Masked | | :---- | :---- | :---- | | **Phone** | 9876543210 | 9\*7\*5\*3\*1\* | | **Email** | abhishek@gmail.com | a\*\*\*\*\*\*\*@gmail.com | | **Name** | Abhishek Sharma | Ab\*\*\*\*\*\* Sh\*\*\*\* | ## Use Contact Details Masking ## Signing Journey - Mask Contact Details In the Invitee List, names, emails, and phone numbers will be partially hidden, with some characters replaced by asterisks (*). #### What Invitees See in the Audit Trail (When Masking is Enabled) Only invitees for whom the Mask Contact Details option was enabled will receive an audit trail where the contact details of other invitees are protected. All invitees’ names, email addresses, and phone numbers will be masked. If an invitee has signed the document using Aadhaar eSign, their Name and street address will be masked from the Certificate Details. #### Details Page When Contact Masking Is Enabled When contact masking is enabled, invitee names, email addresses, and phone numbers are hidden from the document details screen. The masking applies across the following sections: * **Invitee cards** (including individual details) * **Activity log** panel on the right * **Supporting Documents** and **Reference Attachments** section * **CC** (Carbon Copy) section --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/payment-collect # Payment Collect Leegality Payment Collect is a feature that will allow Leegality users to collect payments within the signing journey from their invitees. This happens through a payment gateway which needs to be linked with the client’s bank account. ## Activate Payment Collect > **Info — Note** > > Payment Collect is available for **Signer** and **Reviewer** invitee types. This feature does not work for **Group invitee** and **CC** invitee types. --- ## Sending a Document via Workflow There are two ways to run the workflow. ### Running a Workflow via Dashboard 1. First let’s also cover a scenario where the workflow runner has to enter an amount while running the workflow. 2. If Enforce Payment Collection is turned on while configuring a workflow, the user will have to enter an amount to be collected. 3. If maximum and minimum amount isn’t entered, then by default the minimum value is Rs. 10 and the maximum value is Rs. 1,00,000. ### Sending a document(s) via Excel Upload If you are not familiar with using Leegality’s excel upload functionality, use this Guide to learn more about Sending a document(s) using Excel Upload - Running a Workflow - Via Excel Upload 1. After configuring a workflow, an excel template for the same can be downloaded from the dashboard 2. In case an amount to be collected is preconfigured in a workflow for a particular invitee, any new amount entered in the excel file will be ignored by Leegality and the value set at the time of configuring the workflow will be used. In this case, the value under the header ‘Invitee(0).amount’ can be left blank. 3. If Enforce Payment Collection is turned on while configuring a workflow and the amount to be collected isn’t preconfigured, the user will have to enter a value for the column. `Invitee.amount` (for that particular invitee). 4. Excel Upload won’t work in the following situations- if the amount to be paid entered in the excel spreadsheet is more than the maximum amount configured or less than the minimum amount configured for that invitee in the workflow. ## Signing Journey 1. You as an invitee will receive a signing link to the document. 2. You can preview the document they will be eSigning/ reviewing. 3. Before eSigning/ reviewing, you will have to complete payment (amount as set by the sender). 4. Click on the ‘Pay Online’ button as shown below- 5. Enter mobile number and email address and click on ‘Proceed’. 6. Select the mode of payment and proceed to pay. 7. After a successful payment, you can proceed to eSigning/ reviewing the document. Details of the payment will be sent to the payer and the sender. The payment gateway and bank may also send separate notifications. 8. Complete the signing journey within 5 days of payment, else payment will be reversed. Payment reversal is notified via email- 9. Payment reversal takes time and funds typically will hit the bank account of the payer in 7 to 12 business days. 10. After a reversal, if the signing journey is attempted again - then the signer will have to pay again (since the previous amount was reversed) ## Payment Status of Invitees - Details Page 1. The sender can check the status of payment on Document Details page. 2. Click on the **View Payment Logs** icon. 3. The dialog box shows the date of payment by the invitee, the payment ID, amount paid and status of payment. ### Status Meaning - **Authorized:** Payment has been completed by the signer, but the sign/review itself is not completed. Funds have been deducted from the payer’s bank account but have not yet been earmarked for deposit in the recipient’s bank account. - **Capture:** Payment as well as eSigning/ reviewing has been completed. The amount is earmarked for depositing into the recipient's bank account. Note that funds take some time to reach the recipient’s bank account. To know how settlement works, visit https://razorpay.com/settlement/ ## Payment Logs - **Payment Authorised:** This log is created when the payment is made by the invitee but the document is not signed by the invitee. > **Info — Note** > > Payment will be reversed if the document is not signed. - **Payment Captured:** This log is created when the payment is made by the invitee and also document is signed by the invitee. - **Payment Refunded:** This log is created when the payment is refunded to the invitee. ## Refund scenarios Paid amount is refunded if the signing/ reviewing journey is not completed within 5 days of the payment, including by way of expiry of the documentation. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/local-language # Local Language Local Language support allows invitee to complete the signing or reviewing process in their native language. Languages being provided in Local Language Support- - Hindi - English - Marathi - Gujarati - Bengali - Telugu - Tamil - Kannada - Malayalam - Odia - Punjabi --- ## Use Local Language ## Signing Journey 1. **Allow Signers to Select Language:** If the sender has configured “Allow Signers to Select Language” while sending the document, the signer will get the option to select their local language. 2. **Set a Default Language:** If the sender has configured “Set a Default Language” while sending the document, the signer will not get the option to select a language instead the signing journey will start with the default language selected by the sender. > **Info — Note** > > The selected language can be changed during the signing journey by clicking on the regional language icon. Once everyone has signed the document, the audit trail will have the consent in the selected language. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/signature-coordinate/signature-coordinate # Signature Coordinate The **Signature Coordinates** functionality allows you to configure the exact placement of signatures on the document being sent for signing. ## Steps to Configure Signature Coordinates 1. After configuring the invitee(s), proceed to the **Finalize** page. > **Info — Note** > > By default, the signature coordinates will be placed on the bottom-left on every page in the document. 2. You can **Set Custom Coordinates:** - Click **Custom Coordinates** to enable placement mode. The cursor will change to the Leegality logo when hovering over the document. - Click on the desired location in the document where the signature is to be placed. 3. **Assign Signer:** Select the appropriate signer for the signature from the dropdown menu within the signature box. 4. **Apply to All Pages:** To apply the signature placement across all pages of the document, click the **All** option. 5. **Clear Coordinates:** To delete any configured custom coordinates, click **Clear Coordinates**. 6. **Send Document:** Once the signature coordinates are set, click the **Send** button to send the document to the invitee(s). > **Info — Note** > > If any invitee does not have "Custom Coordinates" configured, their signatures will automatically be placed in the bottom-left corner (default placement) of every page. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/signature-coordinate/coordinate-picker # Coordinate Picker Coordinate Picker is an API-only functionality that is supported only through the 2.1 API., This functionality allows you to configure signature coordinates (placement) on a document without logging into the Leegality dashboard or passing coordinates in the API call. When using our 2.1 API to create eSign requests, you can customise the placement of signatures on the document in two ways: - You can pass the eSign coordinates in the appearances array of the payload. This approach requires you to calculate the x-y coordinates for all signatures on your application and pass the values in the API payload. - Alternatively, you can leverage our pre-built screens for placing signatures, which allow an easy to use, drag and drop interface. The pre-built screens can be opened inside your app using our Web/Android/iOS SDKs. To use this flow, you need to pass the “coordinate_picker” parameter as TRUE in the 2.1 API payload. When you pass the “coordinate_picker” parameter as TRUE, you will receive a Coordinate Picker URL in response. This URL can be used to set signature placements. The functionalities of our pre-built signature placement screens are set out below: Note for developers: If you wish to receive the signURLs generated after setting coordinates for managing the signURLs inside your application, you should also pass a webhook URL in the “coordinate-picker_webhook” parameter of the 2.1 API payload. ## Signature Placement Process 1. When you open the Coordinate Picker URL, you will be shown a preview of the document on which you can place the signature positions. , Scroll down to the end of the document and wait for all the pages of the document to load > **Info — Note** > > The document is in the “Draft” stage at this point in the journey. In case no coordinates were configured before triggering the coordinate picker URL, the default coordinates will appear on the document for each invitee. In case, Custom coordinates were configured in the API call, those will appear in the document 2. Click on the “Click and Drop Signature Box” button to initiate the signature placement module Your cursor will now change into the Leegality logo when hovered on the document 3. Click anywhere on the document to place a signature box 4. You can select which signature belongs to which signer by selecting the desired signer from the dropdown in the signature box 5. You also have the option to copy a signature placement across all pages of the document by pressing the following button - In case Leegality’s “Dynamic Stamping” feature was used to create the document (i.e. there are multiple papers attached to the document - only 1 paper will be visible for the signature placement process and any signature coordinate placed on that page will be replicated across all the stamp papers. Note 1: If the “All” option is selected when placing the signature coordinate on the stamp paper it will be replicated across all pages of the document, whereas if the signature is simply placed on the stamp paper without explicitly replicating it on “All” pages it will only appear on the stamp paper attached. Note -2: Coordinates for stamp papers and the document function independently unless the “All” option is selected in signature placement options which will replicate the concerned signature placement across all pages 6. In case you want to delete the new coordinates set by you or clear the already configured custom coordinates, simply click on the “Delete Custom Coordinates” Button 7. Clicking on the “Delete Custom Coordinates” Button will delete any newly configured (set by you) and/or existing custom coordinates (set via API) 8. Once you are done configuring the coordinates, click on the “Send Document” button >> Confirm that you want to send the document. > **Info — Note** > > In case any of the invitees do not have “Custom Coordinates” configured, Leegality will automatically place their signatures on the “Bottom-Left corner” (default placement) of every page --- URL: https://knowledge.leegality.com/document-execution/esign-type/aadhaar/aadhaar # Aadhaar eSign Aadhaar eSign is a type of electronic signature in India that uses a person's Aadhaar number to verify their identity and sign documents digitally. It is considered legally valid and enforceable in India under the Information Technology Act, 2000. ## Types of Aadhaar eSign - OTP - Biometric Thumb - Iris - Face ## Use Aadhaar eSign > **Info — Note** > > If multiple Aadhaar eSign methods are selected, the signer can use any one of the available options to sign the document. ## Signing a Document Using Aadhaar eSign The signer may receive the invitation to sign the document via Email, SMS, or WhatsApp, based on the sender's configuration. ## ESP Errors During Aadhaar Signing This section lists common errors you may encounter on the eSign Service Provider (ESP) page while signing documents using Aadhaar eSign, along with their causes and solutions.
Problem Error Message on ESP Cause Solution
OTP request limit exceeded NSDL "Failure: You have exceeded Send/Resend OTP Limit. Please try again!" The signer requested more than three OTPs without submitting any. A signer can request up to three OTPs. Attempting to request a fourth will result in an error. Restart the eSign process from Leegality platform. System will automatically route to an available ESP.
CDSL "The eSign Service Provider (ESP) could not complete the eSign request. Message from ESP – OTP Validation Limit Exceeded"
Invalid OTP entered repeatedly On ESP Page: "Invalid OTP! Please enter correct OTP which was received. X attempt(s) remaining for submitting the OTP." After 3 failed attempts (redirected to Leegality): "The eSign Service Provider (ESP) could not complete the eSign request. Message from ESP – Invalid OTP. No Of Retry Attempt Exhausted!!" The signer submitted an incorrect OTP three times consecutively. Each signer gets three attempts to enter the correct OTP before the session is terminated. Restart the signing process using the signing link.
Expired Virtual ID (VID) used during signing On ESP Page: "Expired VID is used in input" The 16-digit Virtual ID (VID) entered, or saved in the browser/application, has expired. Aadhaar VIDs are temporary and expire after a certain period or when a new VID is generated. Enter a valid VID to proceed, or use the Aadhaar number directly instead. To generate a new VID:
  1. Visit [myaadhaar.uidai.gov.in](https://myaadhaar.uidai.gov.in) or open the mAadhaar app.
  2. Go to the VID Generator service.
  3. Log in using the Aadhaar number and the OTP sent to the registered mobile number.
  4. Select Generate VID to receive a new 16-digit VID via SMS.
Face authentication failure On ESP Page: "authentication failed! please contact admin" Intermittent issue with Face authentication on the ESP. Retry after some time. This is typically a transient error and resolves on its own.
--- URL: https://knowledge.leegality.com/document-execution/esign-type/aadhaar/maximum-signing-attempts # Maximum Aadhaar Signing Attempts Maximum Aadhaar Signing Attempts is a invitee-level feature that allows senders to limit how many times a signer can attempt to complete the Aadhaar eSign process. When enabled, senders can define the maximum number of additional attempts a signer receives beyond their initial signing attempt. This prevents indefinite retry loops and provides clarity on when a document needs to be reactivated. ## Understanding signing attempts A signing attempt is counted when a signer actively cancels the signing process on the ESP (eSign Service Provider) page by clicking the "Cancel" button. ### What counts as a failed attempt - Clicking "Cancel" on the ESP page ### What does NOT count as a failed attempt - Closing the browser tab - Refreshing the page ## Configuring maximum signing attempts To enable this feature: 1. Navigate to the invitee-level options when creating or configuring a document 2. Enable **Define maximum signing attempts allowed (only for Aadhaar eSign)** 3. Enter the number of additional attempts beyond the initial attempt (e.g., entering "1" gives the signer 2 total attempts) > **Info — Total attempts calculation** > > Total attempts = 1 (initial attempt) + number entered in the field > > For example, if you enter "1", the signer gets 2 total attempts. > **Info — If disabled** > > If this option is disabled, the signer gets unlimited signing attempts until the document expires. ## What happens when attempts are exhausted After all attempts are exhausted, the following occurs: ### For the signer The signer is redirected to the Leegality page with the following message: > **Warning — Error occurred** > > Retry attempt exhausted. The signer cannot attempt to sign the document again until it is reactivated by the sender. ### For the sender On the Leegality Dashboard, the document and invitee status changes: - **Invitee status**: Expired, Active, and Unsigned - **Document status**: Expired - **Document location**: Appears in the Expired and Failed folder - **Available action**: Re-activate document option ## Reactivating a document after exhausted attempts To allow the signer another opportunity to sign: 1. Navigate to the document details page from the Expired and Failed folder 2. Click the **Re-activate** option 3. Set a new expiry date for the document 4. Save the changes Once reactivated, the signer will receive one additional attempt to complete the signing process. --- URL: https://knowledge.leegality.com/document-execution/esign-type/aadhaar/prioritise-aadhaar-for-invitee # Prioritise Aadhaar for Invitee This section provides instructions for prioritizing the Aadhaar eSign option over other eSign methods for an invitee during the document signing process. By prioritizing Aadhaar eSign, you ensure that it is presented as the first signing option to the user, even if you have enabled multiple other eSign methods for the document. This configuration provides flexibility by offering the user various choices while directing them to your organization's preferred method first. #### New Document Journey ## New Document Use the following steps to configure Aadhaar eSign priority when initiating a new document. 1. While initiating a document, go to the **Invitee level options**. 2. Toggle on **Prioritise Aadhaar for Invitee**. - If enabled, the invitee will see the Aadhaar eSign options first. Other selected eSign options are displayed only after the configured Aadhaar eSign attempts are exhausted. 3. Toggle on **Order Level Retry Count** (Optional) - Enable this setting to define a specific display order for the different Aadhaar verification subtypes (such as OTP, Biometric, Face Auth or Iris scan). - When enabled, retries are counted collectively for all subtypes with the same Order number. The system proceeds to the next Order priority only after maximum attempts for the current Order group are exhausted. 4. Set the number of **retry attempts** for each subtype. This is the maximum number of attempts an invitee has for a specific subtype after the initial unsuccessful attempt. 5. Set the **Order** for each subtype to specify the priority in which it should appear to the invitee. 6. Click **Save**. #### Workflow Creation ## Workflow Creation Use the following steps to configure Aadhaar eSign priority within a workflow configuration. **Prerequisite:** Before you begin, enable Aadhaar under Signature type. 1. While initiating a document, go to the **More Options**. 2. Toggle on **Prioritise Aadhaar for Invitee**. - If enabled, the invitee will see the Aadhaar eSign options first. Other selected eSign options are displayed only after the configured Aadhaar eSign attempts are exhausted. 3. Toggle on **Order Level Retry Count** (Optional) - Enable this setting to define a specific display order for the different Aadhaar verification subtypes (such as OTP, Biometric, Face Auth or Iris scan). - When multiple subtypes are arranged in a specific order, The system will only proceed to the next Order priority group after the invitee has exhausted the maximum retry attempts set for the preceding subtype. - If a specific order is not configured, the OTP method is displayed first by default. > **Info — NOTE** > > The Order level retry count is fixed and cannot be changed while running the workflow. To make changes you need to edit the workflow. 4. Set the number of **retry attempts** for each subtype. This is the maximum number of attempts an invitee has for a specific subtype after the initial unsuccessful attempt. > **Info — Retry limit** > > The retry limit must be between 0 and 5. > - A limit of 0 grants the User only the original attempt. > - A limit between 1 and 5 allows the User the original attempt plus the configured number of additional retries. 5. Set the **Order** for each subtype to specify the priority in which it should appear to the invitee. 6. Click **Save**. ## How Prioritization Affects the Signing Journey When Aadhaar eSign prioritization is enabled, the invitee's signing experience is structured to present Aadhaar verification methods first, before any other eSign options become available. This section explains how the signing flow changes with prioritization enabled. ### Standard Signing Flow vs. Prioritized Flow **Without Prioritization:** When multiple eSign methods are enabled (such as Aadhaar OTP, DSC, Quick Sign), the invitee can freely choose any available option to sign the document immediately upon reaching the signing page. **With Prioritization Enabled:** The invitee must first attempt signing using the Aadhaar eSign methods in the configured order and exhaust the allowed retry attempts before other eSign options become visible. ### Invitee Signing Experience When an invitee receives a document with Aadhaar prioritization enabled, the signing journey follows this flow: 1. The invitee receives the invitation via email, SMS, or WhatsApp and clicks the signing link. 2. After previewing the document and clicking **Proceed**, they are presented with the available Aadhaar eSign methods. 3. The Aadhaar verification subtypes (OTP, Biometric, Face Auth, or Iris) appear in the order configured by the sender. 4. The invitee selects an available Aadhaar method and proceeds with the verification. ### How Retry Attempts Work The retry attempt configuration determines how many times an invitee can attempt each Aadhaar verification subtype: - **Initial Attempt:** The invitee makes their first signing attempt with the chosen Aadhaar method. - **Retry Attempts:** If the verification fails (e.g., incorrect OTP, biometric mismatch, face authentication failure), the invitee can retry based on the configured retry limit (0-5 additional attempts). - **Exhausted Attempts:** Once all retry attempts for a subtype are exhausted, the system proceeds according to your configuration: - If other Aadhaar subtypes are available in the next order group, those options appear next. - If all Aadhaar retry attempts are exhausted, other eSign methods (if enabled) become available. ### Order Level Retry Count Behavior When **Order Level Retry Count** is enabled, the retry attempts are counted collectively for all Aadhaar subtypes that share the same order number: - **Collective Retry Count:** The system counts retry attempts collectively across all subtypes in that order number. - **Progression:** The system only moves to the next order priority after the maximum retry attempts for any subtype within the current order group are exhausted. ### When Other eSign Methods Become Available If you have enabled multiple eSign types (e.g., Aadhaar, DSC, Quick Sign) and have prioritized Aadhaar: 1. The invitee initially sees only Aadhaar eSign options in the configured order. 2. They must exhaust all configured Aadhaar retry attempts across all order groups. 3. Only after all Aadhaar attempts are exhausted do the other eSign methods (DSC, Quick Sign, etc.) become visible and selectable. This ensures your preferred verification method (Aadhaar) is attempted first while still providing alternative signing options if needed. > **Info — NOTE** > > The invitee can still complete the signing process even if Aadhaar verification fails, as long as you have configured alternative eSign methods. --- URL: https://knowledge.leegality.com/document-execution/esign-type/aadhaar/esp-auto-switch # ESP Auto Switch ESP Auto Switch is an intelligent backend feature that automatically switches between Aadhaar eSign Service Providers (ESPs) based on real-time performance monitoring. This ensures signers are always routed to the best-performing ESP, eliminating customer drop-offs due to ESP downtime and maintaining business continuity without manual intervention. ### Key Benefits - **Automatic ESP prioritisation** based on real-time success rates - **Multiple backup ESPs** for maximum reliability - **Reduced turnaround time** for transactions ### The Problem: ESP Downtime #### What is ESP Downtime? ESP downtime occurs when an eSign Service Provider experiences technical issues, outages, or performance degradation that prevents users from completing their eSign transactions. This can happen due to: - Server maintenance or upgrades - Technical failures or system crashes - Network connectivity issues - High traffic loads exceeding capacity - Third-party service dependencies ### How ESP Auto Switch Works ESP Auto Switch operates as an intelligent backend system that continuously monitors ESP performance and automatically adjusts routing priorities to ensure optimal signing success rates. #### Continuous Monitoring Leegality continuously monitors the health and performance of all connected ESPs: - **Check frequency**: Every 10 minutes - **Success rate tracking**: Real-time monitoring against predefined thresholds - **Automatic evaluation**: Compares performance across all available ESPs - **Smart prioritisation**: Automatically adjusts ESP priority order when performance drops #### Intelligent Routing Logic The system uses different routing strategies for OTP and Biometric authentication: ##### OTP-Based Authentication - Auto-switching applies to all OTP-based transactions - ESP priority adjusts automatically based on success rate monitoring - Organisations with custom ESP configurations need to manage priorities manually ##### Biometric Authentication (Fingerprint) - Auto-switching extends to biometric (fingerprint) flows - **Device-based routing**: ESP selection considers device compatibility with ESPs - Example: If a device supports only NSDL and CDSL, the signer is routed accordingly, skipping incompatible ESPs like Verasys #### NSDL as Super Priority NSDL (Protean) is set as the default first-priority ESP due to its consistently high success rate: - **Maintains priority** as long as success rate remains above 40% - **Automatically de-prioritized** if success rate falls below 40% - **Regains priority** automatically once performance is restored above the threshold ### Signing Experience ESP Auto Switch operates primarily in the background, making the process seamless for signers while ensuring they always interact with the best-performing ESP. #### For the Signer When a signer clicks on the eSign link: 1. **Automatic routing**: The signer is automatically directed to the ESP webpage that is performing best at that moment. 2. **Streamlined process**: The signer sees no indication of auto-switching—they simply land on the ESP authentication page. 3. **Standard signing flow**: The signer proceeds with OTP or biometric authentication as usual. #### If Authentication Fails If a signer encounters an error during the authentication process: 1. The signer needs to **start the signing journey again** by clicking the eSign link. 2. On the next attempt, the system routes them to the **next best-performing ESP** in the priority order. > **Tip — For Signers** > > If you encounter an error during signing, simply click on the eSign link again to retry. The system will automatically route you to an alternative ESP to help ensure successful completion. --- ### Frequently Asked Questions #### 1. Why is my ESP (E-Sign Service Provider) auto-switching not happening? If your ESP is not automatically switching during a low-success period, it is likely due to one of the following configuration settings: **Potential Causes for Auto-Switch Failure:** * **Manual Priority Configuration:** If your organisation has a **Manual ESP Order** configured, it takes precedence over the global auto-switch logic. * *Example:* If you have manually set CDSL as P1 and NSDL as P2, the system will **always** attempt CDSL first for every invitee, even if CDSL’s success rate is currently low. The performance-based "Auto-switch" will not trigger because the manual rule is being enforced. * **Single ESP Setup:** The system requires at least two providers to perform a switch. * *Example:* If your organisation has only one ESP configured (e.g., only NSDL), the invitee will land on that same ESP every time. Since there is no secondary provider available, a switch cannot occur regardless of the ESP's status. * **First-Attempt Logic:** The auto-switch system functions as a performance-based rerouting. * *Note:* Even with auto-switching enabled, the system will still attempt your primary (P1) provider on the first try. It cannot bypass a hard-coded manual sequence for the initial landing unless that sequence is removed from your settings. **How to Resolve:** If you are experiencing issues with ESP switching, you can take the following steps depending on your needs: * **To Enable Performance-Based Switching:** If you want the system to automatically choose the best-performing provider, you must request to have **Performance-Based Auto-Switching** enabled for your organisation. * **To Monitor Downtime:** If you prefer to stay with your current configuration, you can wait for your primary ESP to recover. You can monitor real-time service status at any time here: [**Leegality Aadhaar Tracker**](https://www.leegality.com/aadhaar-tracker). * **To Change Your Configuration:** Since ESP priority and switching logic are managed at the system level, please contact [support@leegality.com](mailto:support@leegality.com). Our team can: * Provide details on your organisation's specific ESP configuration. * Update your ESP priority order. * Transition your account from a Manual Priority to an Auto-Switching setup. --- URL: https://knowledge.leegality.com/document-execution/esign-type/doc-signer-certificate # Doc Signer Organizational Document Signer Certificate or Doc Signer is a Digital Certificate which is procured in the name of the organization, and is used to indicate organizational approval of a document. Such a Certificate can be procured from providers such as SafeScrypt. The organization will have to install Leegality’s utility on their server and place the procured Certificate along with it. Leegality’s application will allow you to set a Signature level ID and Password, and program the API to automatically digitally sign the document before or after the a signatory or similar Authenticates it. ## Setting up Document Signer Certificate (DSC) To set up a Document Signer Certificate for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In Document Signer Certificate, click on **Setup**. 4. Enter the **eSign Name**. It can be anything. 5. Choose where you want to store the Document Signer Certificate: | Hosting Option | What You Need to Do | Key Considerations | | :--- | :--- | :--- | | 🖥️ **Host on Your Server** | 1. Provide a publicly accessible **Profile Access URL**. 2. **Whitelist Leegality's IP addresses** for secure access (we will provide these). 3. Follow the instructions to [**download and install the Leegality Doc Signer Utility**](https://gitlab.com/leegality-public/docsigner) on your server. | Choose this if you have the technical infrastructure and prefer to manage the certificate hosting in-house. | | ✨ **Host on Leegality's Server** _(Recommended)_ | 1. Upload your certificate (`.pfx` file). 2. Enter the password for the `.pfx` file. | This is the simplest, hassle-free option. Leegality manages all the technical infrastructure, so you can get started right away without any setup. | 6. Provide the **Email Address(es)** for receiving certificate expiry notifications. Leegality sends expiry reminder emails to users 30 days, 15 days, and 1 day before their Doc Signer expires, giving them sufficient time to update or replace it. Only if you are hosting on Leegality server. 7. Click **Save** to complete the setup. ## Sending Journey The Document Signer Certificate is used to sign documents on behalf of the organization. It is mainly intended for users within the organization and is primarily used in automated signature processes. 1. Hover over the **Signature Type** dropdown. 2. Enable **Automated Sign**. 3. Use **Choose Automated Sign profile** drop to select the signer's automated eSign profile. > **Tip** > > Use the eSign ID and Name to identify the profile. 4. Enter the password and click **Save**. > **Tip — Can multiple users share the same Doc Signer?** > > A single Doc Signer certificate can be shared across multiple Leegality users. Each user must configure it independently in their own account using the steps above. ## Signing Journey When the invitation for an automated signer is activated, the document will be signed automatically within a few seconds. > **Info — Note** > > Leegality will be logging the Sender's Public IP from which the Document Request was created - for both Dashboard and API use cases in the Audit Trail for Doc Signer. --- URL: https://knowledge.leegality.com/document-execution/esign-type/dsc-token # DSC Token A USB token-based DSC (containing the Digital Signature Certificate), can be for eSigning the document. In Leegality, you can use DSC Token to sign multiple documents in bulk. ## Use DSC Token in Sending Journey 1. Hover over the **Signature Type** dropdown. 2. Enable **DSC**. 3. In the right panel, toggle on **Verify details with Certificate Details** (Optional). Fields to enable are; * Verify Name * Smart Name Verification * PIN Code * State Toggle on the adjacent switch to Enable any of the fields listed above. > **Info — NOTE** > > Enabling a variable automatically makes the verification mandatory for that field. 4. Click **Save**. > **Info — INFO** > > **Smart Name Verification Threshold**: The Smart Name Verification Threshold must be configured on your account prior to enabling **Smart Name Verification** in the sending journey. This threshold is configured in the main Settings page, under **Department** > **eSignature**. The process of enabling the DSC token eSign type for an invitee remains the same for both the **New Document Journey** and **Workflow**. ## Signing Journey ### Prerequisites 1. Download and install the Leegality DSC Utility on your computer. **Download link:** https://gitlab.leegality.com/leegality-public/dsc-utility/raw/master/leegality-dsc-client-setup.exe?inline=false This is also available for download in the signing journey. 2. Anyone of the following ports should be available for use by Leegality's DSC utility: 8009, 9800, 2048, 3900. 3. Java run-time environment (JRE) 1.7 or above to be installed on the local machine. Recommended: JRE 1.8 4. The token driver should be installed and running as administrator You can download the same from here - https://app1.leegality.com/resources 5. Leegality's DSC Utility will support signing from the following Tokens, irrespective of the Certifying Authority (Indian or Foreign) has issued the same: Epass2003, Safenet, Aladdin, Watchdata, Trustkey, Mtoken, Moser Baer > **Info — Note** > > DSC Token signing is limited to PC only. ### Sign a single document using DSC 1. After opening the signing link and clicking on **Proceed**, run the Leegality DSC utility. 2. Once the signing page recognizes the utility. 3. Once the signer has successfully input the DSC Token and the requisite utilities and drivers are running, a pop-up appears highlighting the certificates contained in the token. Select the relevant certificate and click **OK**. > **Info — Note** > > If both the signature certificate and encryption certificate appear, choose a signature type certificate. 4. Once the signer selects the certificate, the utility recognizes your DSC certificate details. After successful detection of the certificate, click **Proceed**. 5. Check the consent box and click **Sign Document**. 6. After clicking the sign button, a pop-up asking for the DSC-Token PIN appears. Enter the token PIN and click **Login**. 7. Upon correct input of the PIN/Password, the document will be signed. ### Bulk Sign using DSC Token Within the Leegality account, you can use the DSC Token to bulk sign the multiple documents (up to 500) in one go. 1. Go to the **Documents** section using the top bar. 2. Select **Received** from the left panel. 3. Click **Activate Bulk Sign** button. 4. Select **DSC Token** as the bulk signing option. 5. All the documents available to sign with DSC Token will appear in the list. 6. Use the checkbox to select documents that you want to sign. 7. Click on the **Sign** button. > **Info — note** > > Leegality DSC Token must be installed and DSC Token must be properly connected to the computer. 8. Check the consent box. 9. Click on the **Sign** button. 10. Choose the certificate for signing the document and click **Select**. 11. Verify the signature details and click **Sign**. 12. Enter the **User PIN** of the DSC Token and click **Login**. If the entered User PIN is correct, the signing process will begin immediately. Based on the total number of documents the process may take up to few seconds. --- URL: https://knowledge.leegality.com/document-execution/esign-type/virtual-sign/virtual-signature # Virtual Signature A Virtual Signature is a secure, valid and legally binding method of entering into agreements in India., By setting up a Virtual Signature in the Account you can use this directly while self-signing or can automate this authentication during a document flow. This is an electronic authentication mechanism powered by a ‘One Time Password’ verification of the Email or Phone Number. This is a reflection of the user’s consent and intention to approve the contents of an electronic document. This approval appears on the document by way of a user-generated virtual sign or by the user choosing a template mark, along with the Leegality generated time-stamp. Choose these for your agreements with Merchants, Employees, Users and Business Partners. The virtual sign saved while setting up the virtual sign will automatically show up as a pre-filled sign in the draw box when a Leegality user is signing the document. ## Setting up Virtual Sign in Leegality By setting up a Virtual Signature in your account, you can also use for automated signing of documents. To set up a Virtual Signature for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Virtual Sign section, click on the **Setup**. A side menu will appear on your screen with three options: - **Draw:** Draw your signature on the screen and save it. - **Choose a pre-built virtual sign:** Select a pre-built virtual signature from the available options. - **Upload a photo of your signature:** Upload an image of your hand-drawn signature. (Supported image formats are .jpeg, .jpg, and .png) 4. Select your preferred option and click **Save**. ## Sending Journey 1. On the invite page 2. Hover over Signature type dropdown 3. Enable **Virtual Sign** 4. Click **Save**. The process of enabling the Virtual sign eSign type for an invitee remains the same for both the New Document Journey and Workflow. > **Info** > > Learn how to [**enable and use Virtual Sign for automated signing.**](https://knowledge.leegality.com/document-execution/esign-type/automated-esign.md) ## Signing Journey Access your email or phone (per the invitation details) and click **Sign** (email) or the signing link (text message) to begin. You'll be redirected to the Leegality eSign Gateway, where you can view the full document. 1. Preview the document and click **Invitees** to view other parties and download the latest version. 2. Enter the OTP received on your email or phone, then click **Proceed**. > **Info — OTP via Call** > > If the invitee's phone number is linked, they can receive the OTP via a phone call. The **Resend via Call** button will appear on the OTP screen 30 seconds after the first code is sent. 3. Select the virtual sign type: - **Draw** Choose **Draw**, sign using your mouse or finger, and click **Proceed**. Use **Full screen** to enlarge the signature pad or **Clear** to erase input. - **Select** Click **Select** to choose a computer-generated signature, then click **Proceed**. - **Physical Signature** Choose **Upload** to either: - Upload an image from your device, or - Capture an image using your camera (sign on white paper). Leegality will extract the signature from the image. > **Info — Guidelines for quick approval** > > - Accepted formats: PNG, JPEG, JPG, HEIC > - Ensure proper lighting; avoid shadows > - File size must not exceed 5MB > - Use plain white paper with blue/black ink Click **upload/drag & drop** to select a saved image, or click **Capture** to take a new photo. After uploading, rotate and crop the image as needed, then click **Proceed**. You'll then be given three options for the uploaded signature. **Note:** If the uploaded signature is unsatisfactory, click **Try fixing it** to repeat the process. 4. After clicking **Proceed**, check the consent box and click **Sign Document** to sign. --- URL: https://knowledge.leegality.com/document-execution/esign-type/virtual-sign/fingerprint-capture # Fingerprint Capture - Virtual Sign Affix fingerprint type is the third subtype of Leegality’s Virtual Signature type that allows for users to sign using their fingerprint via a registered biometric device connected to a Windows PC or Android Mobile phone. ## Sending Journey 1. On the invite page 2. Hover over Signature type dropdown 3. Enable **Virtual Sign** 4. Click gear icon and enable **Allow invitee to affix fingerprint image**. ## Signing Journey ### Prerequisites - Fingerprint capture device - **Mantra MFS500** biometric device for mobile application signing journey - **Mantra MFS100 and MFS500** biometric device for web-based and mobile application signing journey - Leegality Helper app > **Caution** > > - Mantra has **discontinued support for the MFS100 AAR** for mobile applications. As a result, MFS100 devices are no longer supported for Virtual Fingerprint flows in the Leegality Helper App. > **Info — Note** > > Fingerprint Virtual Sign is not supported for Mac OS or iOS. ### Signing Journey 1. On the signature page, depending on the activated virtual sign types, select **Affix Fingerprint** or proceed directly to the fingerprint capture page. 2. When you reach the fingerprint capture page, Leegality detects whether the biometric device is connected. 3. If the device is detected, press **Capture Fingerprint**. 4. Based on the fingerprint capture result, one of the following screens appears: - If the capture is unsuccessful, retry the fingerprint capture. - If the capture is successful, you can either: - Click **Proceed**, or - Delete and re-capture the fingerprint. 5. After clicking **Proceed**, check the consent box and click **Sign Document**. The document will be successfully signed. > **Info — Note** > > The signature appearance includes an image of the captured fingerprint. --- URL: https://knowledge.leegality.com/document-execution/esign-type/quick-sign # Quick Sign 'Quick Sign' is a fast eSigning method with a three-click process, no OTP verification, and no third-party integrations. It prioritizes speed and simplicity, ideal for situations where additional security features are not required. ## Setting up Quick Sign in Leegality To Set up Quick Sign for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Quick Sign section, click on the **Setup**. A side menu will appear on your screen with three options: - **Draw:** Draw your signature on the screen. - **Choose a pre-built virtual sign:** Select a pre-built signature from the available options. - **Upload a photo of your signature:** Upload an image of your hand-drawn signature. (Supported image formats are .jpeg, .jpg, and .png) 4. Select your preferred option and click **Save**. ## Sending Journey 1. On the invite page 2. Hover over Signature type dropdown 3. Enable **Quick Sign** 4. Click **Save**. The process of enabling the Quick sign eSign type for an invitee remains the same for both the New Document Journey and Workflow. > **Info** > > Learn how to [**enable and use Quick Sign for automated signing.**](https://knowledge.leegality.com/document-execution/esign-type/automated-esign.md) ## Signing Journey 1. Open the invite received by email/SMS/whatsapp. Click on ‘Sign’ 2. View the document. Click on ‘Proceed’ to sign the document. 3. Select the type of signature and then click on ‘Proceed’ 4. Provide consent and click on ‘Sign Document’ and the document will be signed > **Info — Note** > > In the signing journey, the audit trail shows the name of the signer. It does not consist of the email or phone number of the signer. --- URL: https://knowledge.leegality.com/document-execution/esign-type/visual-sign # Visual Sign Impression Visual Sign Impression is a new eSign type that offers a non-digital signature without timestamps. Unlike traditional digital signatures, Visual Sign Impression captures an image of a hand-drawn signature, computer-generated signature, uploaded signature, or fingerprint image and affixs it to the document. This feature is designed to address specific use cases where timestamped digital signatures are not suitable. ## Setting Up Visual Sign in Leegality 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Visual Sign section, click on the **Setup**. A side menu will appear on your screen with three options: - **Draw:** Draw your signature on the screen. - **Choose a pre-built virtual sign:** Select a pre-built signature from the available options. - **Upload a photo of your signature:** Upload an image of your hand-drawn signature. (Supported image formats are .jpeg, .jpg, and .png) 4. Select your preferred option and click **Save**. ## Sending Journey > **Warning** > > Do not upload previously digitally signed documents for Visual Sign Impression. Existing signatures will be invalidated once a document is signed using Visual Sign. 1. Select the **Visual Sign** option under the **Signature Type** dropdown. 2. Allow invitee to: - Draw signature - Choose computer-generated signature - Affix fingerprint image - Upload physical signature 3. Click **Save** The process of enabling the Quick sign eSign type for an invitee remains the same for both the New Document Journey and Workflow. > **Info — Important Note** > > - Other eSign types cannot be selected with Visual Sign Impression for an invitee. Selecting Visual Sign will automatically toggle off other eSign types and vice versa. > - Visual Sign invitees must be added before any other eSign types. > - Only reviewers can be added before the Visual Sign invitees. > - NeSL is not supported with Visual Sign. > - Signing orders for documents containing Visual and Automated Visual signs will always be enforced. ## Signing Journey The signed document will only show the signature appearance. Details like Leegality Document ID and timestamps will not be shown. In the audit trail, only the signature type will be shown. > **Info — Note** > > PDF readers will not detect Visual Sign Impression as a digital signature. --- URL: https://knowledge.leegality.com/document-execution/esign-type/automated-esign # Automated eSign This feature allows you to automatically sign the documents using Virtual Sign, Quick Sign and Doc Signer Certificate without manual intervention. Before proceeding, ensure that your eSign for which you want to automated sign is already set up in your account. ## Account-Level Configuration To Set Up automated sign in your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. For the desired eSign type, click on the **edit** icon on the right side. 4. Toggle the **Automated Sign** option to enable it. 5. Check the consent box to agree to the terms of using Automated Sign. 6. Set a password. (this password must be provided by the sender to enable Automated Sign for an invitee). > **Info** > > Automated Sign can be enabled for *Virtual Sign, Quick Sign and Document Signer Certificate*. ## Sending Journey #### New Document Journey 1. Hover over the **Signature Type** dropdown. 2. Enable **Automated Sign**. 3. Use **Choose Automated Sign profile** drop to select the signer's automated eSign profile. > **Tip** > > Use the eSign ID and Name to identify the profile. 4. Enter the password and click **Save**. #### Workflow Creation 1. Hover over the **Signature Type** dropdown. 2. Enable **Automated Sign**. 3. Use **Choose Automated Sign profile** drop to select the signer's automated eSign profile. > **Tip** > > Use the eSign ID and Name to identify the profile. 4. Enter the password and click **Save**. > **Info — Note** > > Automated Sign cannot be used for Group Signing. ## Signing Journey When the invitation for an automated signer is activated, the document will be signed automatically within a few seconds. The automated signer can be positioned anywhere in the signing order. > **Tip — Example** > > Consider a document with two signers where the second signer is automated and a signing order is enforced. Once the first invitee signs the document, the automated signer's invitation is activated. Within a few seconds, the automated signer completes the signing process, and the document is signed. ### Manual Retry of Automated Signature In some cases, an automated signature may be delayed or fail due to technical issues. When this happens, you can manually retry the automated signing process without waiting for the system to attempt it again. #### How to Retry 1. Navigate to **Documents > Received** or **Documents > Action Required**. 2. Open the document details page for the relevant document. 3. Click the **Retry Automated Sign** button to re-initiate the automated signing process instantly. #### Availability The manual retry option is available for all active automated eSign invitations that have not yet been completed. > **Info — Supported eSign Types** > > The retry option is available for **Virtual Sign, Visual Sign, Quick Sign, and Document Signer Certificate**. > **Info — Legacy UI** > > The automated retry option is only available in the **Legacy UI**. --- URL: https://knowledge.leegality.com/document-execution/security-compliance # Security, Compliance, and Certifications At Leegality, we prioritize the integrity of your digital transactions. As an authorized Application Service Provider (ASP), we operate under the legal framework of the Information Technology Act, 2000, holding formal authorizations from Esign Service Providers (ESPs). To ensure your data and our platform operations remain resilient against evolving threats, we maintain a robust suite of globally recognized certifications and attestations. ## Core Security & Privacy Certifications Leegality employs industry-standard controls and governance practices to protect customer data. Our commitment is supported by the following internationally recognized standards and attestation: | Certification | Focus Area | Impact on You | | :---- | :---- | :---- | | **ISO 27001:2022** | Information Security (ISMS) | Ensures a comprehensive system is in place to identify, manage, and mitigate security risks through continuous monitoring. | | **ISO 27017** | Cloud Security | Validates that our cloud-hosted environment follows strict protocols for secure administration, data segregation, and access management. | | **ISO 27018** | PII Protection | Confirms specialized privacy controls are in place to handle Personally Identifiable Information (PII) securely within our cloud environment. | ## Operational Excellence & Trust Beyond data security, we focus on the reliability and effectiveness of our business operations. The goal is to ensure operational resilience and service continuity, keeping your business running even during disruptive events or incidents. - **SOC 2 Type II Attestation:** An independent, third-party validation of our internal controls. Unlike a basic point-in-time check, a Type II report confirms that Leegality's controls regarding Security, Availability, and Confidentiality have operated effectively over an extended audit period. - **ISO 22301: Business Continuity (BCMS):** Resilience is a core pillar of our service. This certification demonstrates that Leegality maintains structured disaster recovery and business continuity processes. These certifications and attestation are not just badges; they represent our promise to provide a secure, legal, and uninterrupted digital documentation experience. By aligning to these global benchmarks, Leegality ensures that your sensitive business data is governed by the highest levels of international compliance. --- URL: https://knowledge.leegality.com/document-execution/validate-a-digital-signature # Validate a Digital Signature After a document has been signed, you can validate the digital signature in Adobe Acrobat to confirm that the signature is authentic and the document has not been modified since it was signed. This guide walks you through validating a signature by adding the signer's digital certificate to your list of trusted identities. ## How to Validate a Digital Signature in Adobe Acrobat ### Step 1: Open the Signature Panel First, open the document and access the signature details. 1. In Adobe Acrobat, open the PDF document containing the digital signature. 2. Click the **Signature Panel** button, which is often located in the blue ribbon at the top of the document or as an icon in the right-hand toolbar. > **Info — Check Initial Status** > > This is the step where you will see the initial, unverified status of the signature. It will likely be marked with a yellow warning triangle and the text **"Signature validity is unknown."** This is normal before you complete the validation process. ### Step 2: Begin the Trust Process Now, you will begin the process of telling Adobe to trust the signature. 1. In the Signature Panel on the left, right-click on the signature that has the "validity unknown" status. 2. Select **Show Signature Properties** from the context menu. 3. In the "Signature Properties" window, click the **Show Signer's Certificate** button. ### Step 3: Add to Trusted Certificates This is the most critical step, where you explicitly add the signer's identity to your trusted list. 1. In the "Certificate Viewer" window, navigate to the **Trust** tab. 2. Click the **Add to Trusted Certificates** button. Acknowledge the Adobe Acrobat pop-up by clicking **OK**. > **Info — What and Why: Adding to Trusted Certificates** > > **What it is:** This action takes the signer's digital ID (their certificate) and adds it to a special list within your Adobe software known as "Trusted Identities." > > **Why it's mandatory:** This is a crucial security step. You are manually confirming to the software that you trust the identity of the signer. This prevents Adobe from automatically trusting a potentially fraudulent signature and ensures that only the certificates you have personally vetted are considered valid. ### Step 4: Set Trust Permissions Specify what you want to trust this certificate for. 1. In the "Import Contact Settings" window, check the box next to **Certified documents**. This is the most important option for signature validation. 2. Click **OK** to confirm. 3. Click **OK** again to close the "Certificate Viewer." ### Step 5: Validate the Signature Finally, close the properties window and re-validate the signature. 1. Click **Validate Signature** at the bottom of the "Signature Properties" window. 2. A pop-up will show the validation results. You should now see the green checkmark. 3. Click **Close**. The signature in the document and in the Signature Panel will now display the green checkmark, confirming it is fully validated and trusted. ## Understanding Signature Details After validation, you will see a green checkmark. This is your confirmation. To see the specific digital signature certificate details such as Aadhaar-linked details, click on the now-valid signature. When you click on **Signature Properties** and **Show Signer's Certificate**, you can view an exhaustive list of details that provide comprehensive proof of the signature's authenticity. ### Signature Properties Details This window gives you information about the signature itself and its effect on the document. - **Signed by:** Displays the name of the person who signed the document. - **Signing Time:** Shows the exact date and time the signature was applied, based on the clock of the signer's computer or a trusted time-stamping authority. - **Reason:** The signer can state the purpose of their signature (e.g., "I approve this document," "I am the author of this document"). - **Signature Validity:** A summary that states if the signature is valid. After validation, this will say, "Signature is valid." - **Document Modification:** Confirms that "The document has not been modified since this signature was applied." - **Signer's Identity:** Confirms whether the signer's identity is valid and trusted. - **Certificate Source:** Tells you where the certificate came from (e.g., the Windows Certificate Store, a file). ### Signer's Certificate Details This window provides deep technical details about the digital ID used to create the signature, acting like a digital passport. - **Issued To:** The common name (CN) of the certificate holder (the signer). - **Issued By:** The name of the Certificate Authority (CA) that issued and verified the digital ID (e.g., CDSL, Protean, or Veraysys). - **Validity Period:** The "Valid from" and "to" dates, showing the time frame during which the certificate is considered active and trustworthy. - **Intended purposes:** Lists what the certificate is approved for. - **Serial Number:** A unique number assigned to the certificate by the issuing CA. - **Public Key:** The public portion of the signer's cryptographic key pair. --- URL: https://knowledge.leegality.com/document-execution/Glossary/glossary # Glossary 📖 This list explains terms you might see while using Leegality. It helps you understand the specific terminology and jargon with easy-to-follow definitions. ## Regulatories --- #### ASA (Authentication Service Agency) ASAs are agencies that have established secured leased line connectivity with the CIDR compliant with UIDAI's standards and specifications. ASAs offer their UIDAI-compliant network connectivity as a service to requesting entities (such as AUAs/KUAs) and transmit their authentication requests to CIDR. #### ASP (Application Service Provider) Application Service Provider (ASP) - an entity that provides front-end tools and services that allow signers to Aadhaar eSign documents. #### AUA (Authentication/Aadhar User Agency) Authentication User Agency (AUA) is an entity engaged in providing Aadhaar Enabled Services to Aadhaar number Holder, using the authentication as facilitated by the Authentication Service Agency (ASA). #### CA (Certifying Authorities) The Certifying Authorities (CAs) issue digital signature certificates for electronic authentication of users. Digital Signature Certificates (DSC) are issued by Certifying Authorities (CA) upon successful verification of the identity and address credentials of the applicant. #### CCA (Controller of Certifying Authorities) CCA provides license and regulates the working of Certifying Authorities. The CCA also maintains the Repository of Digital Certificates, which contains all the certificates issued to the CAs in the country. #### eGRAS Online Government Receipts Accounting System (e-GRAS) is an e-Governance Initiative of Government of Rajasthan. e-GRAS facilitates collection of tax/non tax revenue in both the mode online as well as manual. #### ESP (eSign Service Provider) eSign Service Provider (ESP) - the central entity that facilitates the Aadhaar eSign transaction between the signer, the UIDAI and the Certifying Authority. Under India’s regulatory framework - the eSign Service Provider or “ESP” must be owned and operated by a Certifying Authority. #### KUA (e-KYC User Agency) Acronym for KYC User Agency, the KUA fetches the KYC details from the UIDAI server. The KYC checks are carried out in the UIDAI server by collecting Aadhaar Number and OTP / Biometrics (Fingerprint / Iris / Face). #### NeSL NeSL is India’s first Information Utility and is registered with the Insolvency and Bankruptcy Board of India (IBBI). The primary role of NeSL is to serve as a repository of legal evidence holding the information pertaining to any debt/claim, as submitted by the financial or operational creditor and verified and authenticated by the parties to the debt. #### UIDAI UIDAI (Unique Identification Authority of India) is the government agency responsible for implementing and managing the Aadhaar program, which provides a unique 12-digit identification number to Indian residents based on biometric and demographic data. --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/overview # v4 Workflow v4 is an advanced workflow system that provides more flexibility and control when sending documents for eSignature. It enables multi-document packs, selective document assignment, and enhanced configuration options. ## What is v4? v4 is a workflow created by Leegality for your specific use cases. As a workflow runner, you use these pre-configured workflows to send documents for eSignature. Leegality creates v4 workflows based on your requirements. Once created, you can run these workflows repeatedly to send documents to invitees. ## Key capabilities ### Send multiple documents as a pack Create document packs containing multiple primary documents. Each primary document can contain one or more sub-documents. Assign specific primary documents to individual invitees based on their roles. **Example:** Send a loan agreement, property documents, and insurance policy together. Assign all documents to the borrower, only loan agreement to the guarantor, and only property documents to the bank officer. ### Multi-document signing in one journey Invitees sign multiple primary documents in a single unified session. They receive one notification, access one signing link, and complete all assigned documents in one flow. ### Flexible stamping options Configure stamps at the primary document level with two options: - **Stamps for merged document:** One stamp at the beginning of all sub-documents - **Separate stamps for sub-documents:** Dedicated stamps before each sub-document Different primary documents can have different stamping configurations. ### Selective document assignment Assign specific primary documents to each invitee. Each person sees and signs only the documents relevant to them, maintaining privacy and reducing confusion. ### Document pack processing Configure pack-level settings including pack name, internal reference number, folder selection, auto-deletion timeframe, and SFTP transfer for signed documents. ### Enhanced invitee configuration Set signing order, configure eSign types, and customize security settings, notifications, and other invitee-level options for each invitee. ## Document structure v4 uses a three-level hierarchy: **Sub-documents:** - Individual PDF files you upload - Building blocks of primary documents **Primary documents:** - One or more sub-documents combined - Signed independently with own audit trail - Assigned selectively to invitees **Document pack:** - Collection of all primary documents - Sent together in unified journey - Single sending action for all documents | Role | Responsibilities | |------|------------------| | **Workflow creator** | Creates v4 workflows based on your requirements. Configures workflow structure and boundaries. | | **Workflow runner** (Document Sender) | Runs workflows to send documents. Adds sub-documents, configures invitees, assigns documents, sets signature coordinates, and sends packs. | | **Invitees** | Receive and complete assigned documents in a unified signing journey. | ## v4 vs current workflows Both v4 and current workflows coexist. v4 will gradually replace the current system over the next few years. **Use v4 when you need:** - Multiple documents sent together with selective assignment - Different stamping options (merged vs separate stamps) - Flexible stamping per workflow run (enable/disable as needed) - Enhanced document organization with primary/sub-document structure - Unified signing experience for multiple documents **Use current workflows when:** - Your existing workflows meet your needs - You have simple document sending requirements **Note:** You cannot convert existing workflows to v4 at this time. ## Getting started with v4 To use v4 workflows: 1. Identify use cases requiring v4 capabilities 2. Request workflow creation from Leegality 3. Review and test the configured workflow 4. Run the workflow to send documents > **Info — Note** > > v4 workflows are created by Leegality based on your specific requirements. Contact your account manager to request a v4 workflow. ## Next steps - [Learn how to run v4 workflows](https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack) - [Understand pack and document structure](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents) --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents # Packs and documents v4 workflows organize documents in a three-level hierarchy. This guide explains the structure. ## Document hierarchy ```mermaid graph TD A[Document Pack] --> B[Primary Document 1] A --> C[Primary Document 2] A --> D[Primary Document 3] B --> E[Sub-document A] B --> F[Sub-document B] C --> G[Sub-document A] D --> H[Sub-document A] D --> I[Sub-document B] style A fill:#e1f5ff style B fill:#fff4e6 style C fill:#fff4e6 style D fill:#fff4e6 style E fill:#f0f0f0 style F fill:#f0f0f0 style G fill:#f0f0f0 style H fill:#f0f0f0 style I fill:#f0f0f0 ``` ### Sub-documents **Individual PDF files** you upload when running a workflow. - The basic building blocks - Can be any PDF document - Combined to form primary documents **Example:** loan_terms.pdf, repayment_schedule.pdf, property_details.pdf ### Primary documents **One or more sub-documents** that function as a single document. - Each primary document is signed independently - Has its own audit trail - Generates its own signed copy - Can be assigned selectively to invitees **Example:** Loan Agreement (primary document) = loan_terms.pdf + repayment_schedule.pdf ### Document pack **Collection of all primary documents** sent together in one workflow run. - Contains one or more primary documents - Sent to invitees in a single action - Enables unified signing journey - Tracked as one pack with individual document status ## How it works ### Each primary document signed independently Invitees sign each primary document separately: - Loan Agreement → Signed once (covers all sub-documents) - Property Documents → Signed once - Insurance Policy → Signed once Each primary document has: - Own audit trail - Own signature coordinates - Own completion status - Own signed PDF ### One signing session for all While primary documents are signed separately, invitees complete everything **in one session**. ## Key points > **Info — Important concepts** > > **Sub-documents:** > - You upload these PDF files > - Multiple sub-documents can form one primary document > - Signers don't see sub-document boundaries—they see one combined primary document > > **Primary documents:** > - This is what gets signed > - Each has independent audit trail > - You can assign different primary documents to different invitees > > **Document pack:** > - All primary documents together > - One sending action > - Unified tracking ## Next steps - [Learn about document assignment](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/document-assignment) - [Understand distributed stamping](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/distributed-stamping) - [Learn how to run a workflow](https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack) --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/document-assignment # Document assignment v4 allows you to assign specific primary documents to each invitee. This guide explains selective document assignment. ## What is document assignment? Document assignment lets you control which documents each invitee receives from your document pack. Instead of sending all documents to everyone, you selectively assign specific primary documents to each invitee. **How it works:** - You create a document pack with multiple primary documents - You add invitees - For each invitee, you choose which primary documents they should receive and in what order - Each invitee previews and signs/reviews only their assigned documents **Example:** A loan document pack contains Loan Agreement and Property Documents. You assign both documents to the Borrower, but only the Loan Agreement to the Guarantor. The Guarantor never sees the Property Documents. > **Info — Key point** > > You assign **primary documents**, not sub-documents. All sub-documents within a primary document go together. ## How to assign documents When configuring invitees in the Invite step: 1. Click **Assign Documents** on the invitee card 2. Select which primary documents this invitee should receive 3. Each invitee must be assigned at least one primary document ## Assignment example ```mermaid graph LR Pack[Document Pack] --> D1[Loan Agreement] Pack --> D2[Property Documents] D1 --> B[Borrower Signs both] D2 --> B D1 --> G[Guarantor Signs 1] D2 --> O[Bank Officer Reviews 1] style Pack fill:#e1f5ff style D1 fill:#fff4e6 style D2 fill:#fff4e6 style B fill:#d4edda style G fill:#d4edda style O fill:#d4edda ``` **What each person sees:** - Borrower: "You have 2 documents to sign" - Guarantor: "You have 1 document to sign" - Bank officer: "You have 1 document to review" ## What invitees see Invitees see only their assigned documents in the signing interface and notifications. They don't see other documents in the pack. ## Next steps - [Understand pack structure](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents) - [Learn about distributed stamping](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/distributed-stamping) - [Learn how to run a workflow](https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack) --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/distributed-stamping # Distributed stamping v4 allows you to attach stamps to each sub-document within a primary document. This guide explains distributed stamping. ## What is distributed stamping? Distributed stamping lets you attach a stamp before each sub-document within a primary document, instead of placing one stamp at the beginning for all sub-documents combined. **Example:** Primary Document A has 3 sub-documents. With distributed stamping, you attach a stamp at the beginning of each sub-document, distributing stamps throughout the primary document such that the serial number and ID of the stamp will only be affixed on its corresponding sub-document, thus mapping the stamp with the sub-document. If you have multiple primary documents in a pack, you can independently configure distributed stamping for each primary document. ## Stamping options ### Stamps for merged document Places all stamps at the beginning, followed by all combined sub-documents in a primary document. ### Separate stamps for sub-documents (Distributed stamping) Places a dedicated stamp before each sub-document within a primary document. This is distributed stamping. ## Configuring stamping When creating primary documents in the Create step: 1. Enable **Attach Stamping** for the primary document 2. Choose stamping option: - **Stamps for merged document:** One stamp for all sub-documents combined - **Separate stamps for sub-documents:** Distributed stamping - one stamp before each sub-document 3. Each primary document can have a different stamping configuration > **Info — Flexibility per run** > > You can enable or disable stamping each time you run the workflow, if allowed by the workflow creator. This allows you to handle situations where stamps are sometimes required and sometimes not. ## Next steps - [Understand pack structure](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents) - [Learn about document assignment](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/document-assignment) - [Learn how to configure stamping](https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack#step-1-create) --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack # Run a v4 workflow This guide explains how to run a v4 workflow to send documents for eSignature. ## Access your workflow To access v4 workflows: 1. Navigate to **Workflows** from the left sidebar 2. Go to the **V4 Workflows** tab 3. Find your workflow in the list 4. Click the **Run** button on the right side of the workflow The workflow configuration opens with three steps: Create, Invite, and Finalise. ## Step 1: Create In the Create step, configure your document pack. ### Understanding document structure **Sub-documents:** - Individual PDF files you upload - Can be combined to form a primary document **Primary documents:** - A set of one or more sub-documents - Each primary document is signed as an individual document - Has its own audit trail - Appears as a separate tab in the interface **Document pack:** - Collection of all primary documents - Sent together to invitees in a unified journey Signers sign each primary document separately but in the same signing journey. ### Add primary documents To add a primary document: 1. Click **+ Add Document** to create a new primary document tab 2. The primary document tabs appear at the top of the screen You can add multiple primary documents to create a document pack. ### Configure each primary document For each primary document: #### 1. Upload sub-documents 1. Use the upload PDF box or the placeholder sub-document upload box to add sub-documents 2. Upload multiple sub-documents in the upload PDF box, if needed. > **Info — Note** > > Only a single PDF can be uploaded in the placeholder sub-document upload box. 3. Drag sub-documents to rearrange their order #### 2. Set document details 1. Enter **Document Name** (the primary document name) 2. Enter **Internal Reference Number** 3. Select a **folder** for the document #### 3. Configure stamping (if needed) Enable **Attach Stamping** and choose an option: **Stamps for merged document:** - Attaches stamp paper at the beginning of all combined sub-documents - Example: Stamp → Sub-document A + Sub-document B **Separate stamps for sub-documents:** - Attaches dedicated stamp paper to each sub-document - Example: Stamp → Sub-document A → Stamp → Sub-document B #### 4. Add reference attachments (optional) Enable **Reference Attachment** to add reference documents for invitees. Invitees can access and refer to these documents while signing. > **Tip** > > You can also add reference attachment after sending the document from details page. 🔄 Repeat this process for all primary documents in your pack. ### Configure document pack settings Configure pack-level settings in the right panel. These settings apply to the entire document pack: **Pack Details:** - **Pack Name:** Name for the entire pack - **Pack Internal Reference Number:** Reference for tracking - **Folder:** Select folder for the pack **Document Deletion:** - Set auto-delete time interval - Uses settings configured in **Settings > Department > Document Security** **SFTP:** - Choose SFTP profile for automatic transfer of signed documents - Documents transfer automatically after completion After completing all configurations, click **Proceed** to move to the Invite step. ## Step 2: Invite Configure invitees and their settings. ### Add invitees **Add signers and reviewers:** 1. Click **Add invitee** 2. Use the dropdown at the top left of the invitee card to select role: - Signer - Reviewer - Group Signer - Group Reviewer **Add CC invitees:** 1. Click **Add CC** at the bottom 2. Provide CC invitee details ### Configure invitee details For each invitee, enter: - **Name** - **Email address** - **Phone number** ### Set signing order 1. Click and hold invitee cards to drag and reorder 2. Enable **lock signing order** to enforce the sequence Invitees receive notifications and can sign only in the specified order when locked. ### Configure invitee settings Select an invitee card to view their settings in the right panel: **eSign type:** - Choose the eSignature type for this invitee - Available options depend on your account configuration **Invitee-level options:** - Security settings (authentication, GPS, photo capture, etc.) - Notification preferences - Custom consent messages - Signing retry attempts - Other invitee-specific configurations All changes save automatically as you configure settings. ### Assign documents to invitees Each invitee must be assigned at least one primary document: 1. Click **Assign Documents** on the invitee card 2. Select which primary document(s) this invitee should sign 3. Invitees see and sign only their assigned documents **Example:** - Borrower: Assigned Loan Agreement and Property Documents - Guarantor: Assigned Loan Agreement only - Bank Officer: Assigned as CC on Property Documents only This selective assignment maintains privacy and relevance. 🔄 Repeat the configuration process for all invitees. Click **Proceed** when done to move to the Finalise step. ## Step 3: Finalise Set signature coordinates and send the pack. ### Preview documents 1. Use the tabs at the top to switch between primary documents 2. Review each document before setting coordinates 3. Verify document content and structure ### Place signature coordinates By default, signature coordinates appear at the bottom of each page. To customize: 1. In the **Coordinate Placement** panel on the right, find the invitee 2. Click the invitee's **signature button** 3. The signature coordinate attaches to your cursor 4. Click on the document where you want the signature to appear 5. The coordinate is placed at that location Repeat for each invitee who needs to sign this primary document. ### Copy coordinates across pages After placing a signature coordinate, copy it to multiple pages: **All pages within this sub-doc:** - Copies coordinates to all pages of the current sub-document only - Example: 5-page sub-document A1 → coordinate copied to all 5 pages **All pages across all sub-docs:** - Copies coordinates to all pages of all sub-documents in the primary document - Example: Sub-doc A1 (5 pages) + Sub-doc A2 (10 pages) → coordinate copied to all 15 pages Configure coordinates for all primary documents in your pack. ### Send the pack After configuring all signature coordinates: 1. Click **Proceed** 2. If the pack is processed within 10 seconds, then you will be redirected to the Details Page 3. If the pack takes more than 10 seconds to process, you'll see: "Document pack is being processed. This may take a few seconds." 4. Your pack is queued for processing **During processing:** - Continue using the dashboard normally - View status in the **Processing Queue** if needed - Documents will be sent automatically to invitees once processed Once processing completes, invitees can begin signing. ## After sending **Track progress:** - Monitor pack completion status from details page - View which invitees have completed signing - Check individual document status ## Next steps - [Understand signing journey](https://knowledge.leegality.com/document-execution/workflows/v4/signing-experience/multi-document-signing) - [Learn about pack structure and concepts](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents)\ --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/signing-experience/multi-document-signing # v4 Document Pack Signing Journey When you send a v4 document pack, invitees sign multiple primary documents in a single unified session. This guide explains what invitees experience. ## Invitation notification Invitees receive the invitation via **email, SMS, and/or WhatsApp**. ### What the email shows The email notification includes: - **Sender information:** Who (person or entity) sent the document and requested signing - **Expiry details:** Exact date and time when the invitation expires - **Document count:** How many documents need to be signed (one or more) - **Document names:** Names of all documents assigned to this invitee - **Sequence information:** If multiple documents, they're shown in sequential order **Example email:** **View example email** > ### eSign Invitation > > Hi John, > > ABC Company(`test@email.com`) has invited you to eSign document(s). This invitation will expire on Sat Nov 15 23:59:59 IST 2025. > > | S.No. | Document Name | > |-------|---------------| > | 1. | Loan Agreement | > | 2. | Sanction Letter | > > **[Sign Document(s)]** ## Signing journey ### Step 1: Preview first document After clicking the signing link received on email/SMS/WhatsApp, invitees see a preview of the **first document** in the sequence. **What invitees see:** - Full document preview - List of other invitees who will sign this document - Download option (can download document in current state) Click **Proceed** button to continue ### Step 2: Review remaining documents After clicking **Proceed**, invitees see the preview of the **second document** (if any). This process continues until **all assigned documents are reviewed** by the invitee. Click **Proceed** to move to next document ### Invitee actions during preview While previewing documents, invitees may need to complete certain actions. The workflow runner determines which actions are required. **Options during preview:** - View list of other invitees - [**Local Language Selector**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/local-language#signing-journey): Change signing journey language - [**Custom Message**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/custom-message#signing-journey): View additional message from sender - [**Reference Attachment**](https://knowledge.leegality.com/document-execution/leegality-features/document-level/reference-attachments#accessing-reference-attachments-during-the-signing-journey): View and download reference documents **Other invitee actions:** - [**Upload Supporting Documents**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/supporting-documents#signing-journey): Upload additional documentation if requested by the sender - [**Company Stamp/Seal**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/company-seal#example-of-company-seal-with-signature): Add authorized signatory seal, director seal, or company seal - [**GPS Location**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-gps-location#signing-journey-of-capture-gps-location): Capture current GPS location, location with accuracy threshold, or sign within geofenced area > **Info — GPS Capture in Multi-Document Sessions** > > GPS capture is required for each signing session. If an invitee captures their GPS location, signs one document, then exits and returns later to sign the remaining documents, they must capture their GPS location again. Both GPS captures will appear in the Audit Trail. - **Face Capture:** - [**Capture Photo**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/capture-photo#signing-journey): Take real-time photo - [**Face Match**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/face-match#signing-journey): Photo compared with identity information - **Liveliness Detection:** [Manual Liveliness](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/manual-liveliness) (OTP-based) or [Smart User Liveliness](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/smart-user-liveliness) (AI-based) - [**Name Editing**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/esignature-appearance/invitee-name-editing): Edit the name that appears on the signature if allowed - [**Payment Collection**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/payment-collect#signing-journey): Complete required payment before signing - [**Reject to Sign**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/other-features/reject-to-sign#invitee-rejection-journey): Reject the document if permitted > **Info — Note** > > Not all actions are required for every signing journey. The document sender configures which actions are mandatory based on the document requirements. ### Step 3: Sign or review documents Based on your role, proceed as follows: #### Signer After successful authentication: 1. **Select an eSign Type:** - Available options can be: - [**Aadhaar**](https://knowledge.leegality.com/document-execution/esign-type/aadhaar/?type=otp#signing-a-document-using-aadhaar-esign) - [**DSC Token**](https://knowledge.leegality.com/document-execution/esign-type/dsc-token) - [**Virtual Sign**](https://knowledge.leegality.com/category/virtual-sign) - [**Visual Sign**](https://knowledge.leegality.com/document-execution/esign-type/visual-sign) - [**Quick Sign**](https://knowledge.leegality.com/document-execution/esign-type/quick-sign) 2. Agree to the default and any additional consent terms 3. Click **Sign Document** On successful signing, you will receive a confirmation via email or SMS. Once all invitees have signed the document pack, you will receive the fully signed documents and an audit trail via email. You will also be redirected to the **Public Details Page**, where you can monitor the progress and view invitee actions. #### Reviewer After successful authentication: 1. Review the documents 2. Choose to either **Approve** or **Reject** the document pack 3. Click **Submit**, check the consent box, and confirm your action > **Info** > > Refer to [**Reviewer Journey**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer#reviewer-journey) for more details. ## Document completion Once all invitees in the signing order have signed, the document pack is **completed**. **All invitees receive:** - The completely signed documents - Audit trail for the entire pack --- URL: https://knowledge.leegality.com/document-execution/workflows/v4/details-page/pack-details # Document details page (v4) After sending a v4 document, the details page helps you track progress, manage invitees, and access documents. Understanding the page structure is key to effectively monitoring your packs. ## Understanding the page structure The details page has two levels of tabs: **Top-level tabs (horizontal bar):** - **Document Pack tab:** Overview of the entire pack - **Primary Document tabs:** One tab for each primary document in your pack ```mermaid graph TD A[Details Page] --> B[Document Pack Tab] A --> C[Primary Document 1] A --> D[Primary Document 2] B --> B1[Invitee List All invitees across all documents] B --> B2[Document List All primary documents] C --> C1[Invitee List Invitees for Document 1 only] C --> C2[Document List PDF Document 1] D --> D1[Invitee List Invitees for Document 2] D --> D2[Document List PDF Document 2] style A fill:#e1f5ff style B fill:#fff4e6 style C fill:#e8f5e9 style D fill:#e8f5e9 ``` > **Info — Key difference** > > The **Document Pack tab** shows the big picture (all documents, all invitees). Each **Primary Document tab** shows details for that specific document only. ## Accessing the details page After sending a pack: - Click on the document name from your **Sent documents** list ## Document Pack tab The Document Pack tab provides a complete overview of your entire pack. ### Pack information At the top of the page: - **Pack name:** The name you gave the pack when sending - **Pack ID:** Unique identifier for this pack - **Status:** - **In Progress:** One or more primary documents are not completed - **Completed:** All primary documents in the pack are completed ### Pack-level actions Click the **three dots (⋮)** next to the pack name: #### Complete the pack Manually complete the entire pack in its current state. **What happens:** - The pack is marked as complete - All primary documents in the pack are completed - Invitees who signed receive the signed documents and audit trail - Invitees who haven't signed will not be able to sign anymore **When to use:** - Some invitees are unresponsive and you need to proceed - Business requirements changed and remaining signatures aren't needed - You want to finalize what's been signed so far **Example:** Your pack has 3 primary documents. Two documents are fully signed, but one document is still waiting for a signature. You can complete the pack, and all three documents will be marked complete in their current state. #### Delete pack Permanently delete the entire pack and all documents within it. **When to use:** - The pack was sent in error - The pack is no longer needed - You want to remove all records of this pack > **Warning** > > This action cannot be undone. All primary documents and pack data will be permanently deleted. ### Invitee List in Document Pack Shows **all invitees** across **all primary documents** in the pack. Each invitee has a card showing: - Name - Contact details (email and/or phone number) - Status (Invited, Opened, Signed, Approved, Rejected, Expired, Failed) - **Document tags:** Primary documents assigned to this invitee You can see at a glance which invitees have access to which documents. If an invitee is assigned multiple documents, all document names appear as tags on their card. ### Document List in Document Pack Shows **all primary documents** in the pack. Each primary document has a card showing: - Document name - Document ID - Status: **In Progress** or **Completed** You can also **Preview Document** to see the current state of the document. For each document, you can perform following action using the **Three dots (⋮) menu:** #### Complete document Manually complete this specific primary document. **What happens:** - Only this selected primary document is marked as complete - Other documents in the pack remain unaffected #### Delete document Permanently delete this primary document. > **Warning** > > This removes the document from the pack. This cannot be undone. #### Reference Attachment View and upload reference attachments for invitees who is signing this primary document. ### Document Pack Audit Trail Once the document pack is completed (all documents signed by assigned signers), you can download a comprehensive audit trail for the entire pack. **How to download:** - Navigate to the **Document Pack tab** - Click the **Download Audit Trail** button on the right side Document pack audit trail contains all documents' information. ## Primary Document tabs Each primary document in your pack gets its own dedicated tab. The tab appears next to the Document Pack tab. ### Primary document information At the top of each primary document tab: - **Document name:** Name of this primary document - **Document ID:** Unique identifier for this document - **Status:** In Progress, Completed, or Expired ### Document-level actions Click the **three dots (⋮)** next to the document name: - **Complete:** Complete this document only - **Delete:** Delete this document only - **Reference Attachment:** View and upload reference attachments for this document ### Invitee List in Primary Document Shows **only invitees assigned to this specific primary document**. > **Info — Important distinction** > > This Invitee List may shows fewer invitees than the Document Pack tab's Invitee List. You only see invitees who were assigned this particular document. Each invitee card shows: - Invitee Name - Contact details (email address or/and phone number) - Status When viewing the Property Documents tab, you might see only Rajesh (if he's the only one assigned to Property Documents). ### Document Shows **a combined PDF of all sub-documents** within this primary document. > **Info — Important distinction** > > The Document Pack's Document List shows **primary documents**. This Document List shows **sub-documents** (the PDFs that make up this primary document). Here, sender can: - **Preview Document:** View the document - **Download Document:** Download the document to your device ## Activity Logs The right side of the page shows the activity logs. **What it shows:** All activities and actions performed by sender and invitees. **When viewing Document Pack tab:** - Shows activities for **all primary documents** in the pack - Complete timeline of the entire pack **When viewing a Primary Document tab:** - Shows activities for **that document only** - Filtered timeline specific to that document ## Next steps - [Understand the signing journey](https://knowledge.leegality.com/document-execution/workflows/v4/signing-experience/multi-document-signing) - [Learn how to run workflows](https://knowledge.leegality.com/document-execution/workflows/v4/run-workflow/run-a-pack) - [Understand pack structure](https://knowledge.leegality.com/document-execution/workflows/v4/understanding-v4/packs-and-documents) --- # Document Execution API URL: https://knowledge.leegality.com/document-execution/api/document-execution-api > Welcome to the Leegality Document Execution API documentation. This API lets you integrate Document Execution into your application. Use it to create signing requests, track document status, and retrieve signed documents and audit trails. Welcome to the Leegality Document Execution API documentation. This API lets you integrate Document Execution into your application. Use it to create signing requests, track document status, and retrieve signed documents and audit trails. ## What can you do with this API? - **Create eSigning requests** — Send documents for signing via based on pre-configured workflow. - **Track status** — Check the entire document status or specific invitee details. - **Retrieve signed documents** — Download the signed PDF and audit trail once all invitees have signed. - **Real-time updates** — Use Webhooks to receive real-time notifications on signing events. ## Environments | Environment | Dashboard | Base URL | |---|---|---| | Sandbox | https://sandbox-dashboard.leegality.com | `https://sandbox.leegality.com/api/` | | Production | https://dashboard.leegality.com | `https://app1.leegality.com/api/` | ## Testing with Postman A Postman Collection is available with pre-configured requests for common scenarios: [Download Postman Collection](https://drive.google.com/file/d/1EpJItMuIQPMFKgtmjHmjs7JKGqs3I4Dl/view) Import the collection into Postman and add your Auth Token to begin testing. ## Need Help? Reach out to [support@leegality.com](mailto:support@leegality.com) for any questions about your integration. You can also review our [Terms of Service](https://leegality.com/tnc).
Security Scheme Type: apiKey
Header parameter name: X-Auth-Token
--- URL: https://knowledge.leegality.com/document-execution/api/authentication # Authentication The Auth Token authenticates all API requests to Leegality. This section explains how to generate the token from your dashboard. When you enable the API, you receive two credentials: 1. **Auth Token**: Required in the `X-Auth-Token` header for all API requests 2. **Private Salt**: Used to verify webhook authenticity via HMAC-SHA1 signature. Learn more about [webhooks](https://knowledge.leegality.com/document-execution/api/webhooks/webhook-event-types) 1. Log in to your Leegality Dashboard - **Production:** https://dashboard.leegality.com - **Sandbox:** https://sandbox-dashboard.leegality.com 2. Click the **Settings** ⚙️ icon in the top right corner 3. Navigate to **Settings > API** from the left panel 4. Click the **Enable API** button to generate your credentials. 5. Click the **Copy** icon next to **Auth Token** > **Info — Environment Separation** > > Sandbox and Production have separate *auth token* and *private salt*. ## Using Your Auth Token Include `X-Auth-Token` and `Content-Type` headers in every API request: ```bash curl --location 'https://app1.leegality.com/api/v3.0/sign/request' \ --header 'X-Auth-Token: your_auth_token_here' \ --header 'Content-Type: application/json' \ --data '{}' ``` > **Warning** > > Do not use an `Authorization: Bearer` header — Leegality uses `X-Auth-Token` exclusively. Including both will cause authentication to fail. --- URL: https://knowledge.leegality.com/document-execution/api/quick-start # Quick Start Get up and running with the Leegality API in four steps. ### 1. Create a Workflow Workflows define your document sending configuration — signers, signature types, signing order, and notifications. Create one in the Leegality dashboard before making your first API call. [Learn how to create a workflow →](https://knowledge.leegality.com/document-execution/workflows/create-workflow) ### 2. Download Request Payload Once your workflow is ready, download its API payload from the dashboard — this gives you the exact JSON structure to use in your API request, including the `profileId` and all workflow-specific fields. [Learn how to download the request payload →](https://knowledge.leegality.com/document-execution/workflows/run-workflow?type=via-api) ### 3. Send a Document for eSigning Use the Create eSigning Request API to send a document programmatically. The request body includes your workflow ID (`profileId`), the document as a Base64-encoded PDF, and the invitee details. [See the full API reference →](https://knowledge.leegality.com/document-execution/api/create-an-e-signing-request) ### 4. Track Document Progress After sending a document, you need to know what's happening with it — whether an invitee has signed, who's still pending, and where to find the final signed document. Leegality gives you two mechanisms for this, and most integrations use both: **[Webhooks](https://knowledge.leegality.com/document-execution/api/webhooks/webhook-configuration)** for real-time event notifications, and the **[Document Details API](https://knowledge.leegality.com/document-execution/api/check-document-details)** for the full document state on demand. #### Webhooks Webhooks are HTTP POST requests Leegality sends to a URL you configure on each invitee in the workflow. The moment an invitee completes a signing action — signs, approves, rejects, or fails certificate verification — Leegality fires a webhook to the corresponding URL. Each payload tells you: - Which document the event belongs to (`documentId`) - What happened (`webhookType`: `"Success"` or `"Error"`) - Whether the overall document is still `"Sent"` or now `"Completed"` (`documentStatus`) - The invitee's name, email, action taken, and signing URL (`request`) - A `mac` field — an HMAC-SHA1 signature using your Private Salt — to verify the request came from Leegality Webhooks cover six event types across success and error flows. See [Webhook Event Types](https://knowledge.leegality.com/document-execution/api/webhooks/webhook-event-types) for the full list, and [Verify Webhook Request](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request) for how to validate the `mac` field. > **Warning** > > Always verify the `mac` field before processing a webhook payload. This confirms the request genuinely came from Leegality. **What webhooks do not include:** The webhook payload does not contain the signed document or the audit trail. Once you receive a webhook confirming document completion, use the [Check Document Details API](#check-document-details-api) to retrieve those. For endpoint requirements, configuration steps, and retry timing, see [Webhook Introduction](https://knowledge.leegality.com/document-execution/api/webhooks/webhook-configuration). #### Check Document Details API The [Check Document Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) returns the full state of a document in a single GET request. This is a much richer data source than any individual webhook payload — not a fallback, but a complementary tool that serves different needs. A single call can return: - **Signed file and audit trail** — CDN URLs for the completed PDF and the audit trail (expires in 15 seconds — download server-side immediately) - **Every invitee's status** — name, email, signing timestamp, current invitation status, and rejection messages where applicable - **Certificate and verification data** — the signer's certificate details, verification configuration, and match results (name, face match, liveliness) - **Document metadata** — workflow name and type, template details, folder, sender, account/organization info - **Stamp paper details** — group name, number, stamp series, and associated document IDs - **NeSL transaction data** — for documents with NeSL-type signers The response is opt-in by field group — you pass boolean query parameters (`file=true`, `auditTrail=true`, `invitations_certificateData=true`, etc.) to request only the data you need. Fields you don't request are omitted entirely. Send a `GET` request to `/v3.3/document/details` with your `documentId` and `X-Auth-Token` header. See the [Check Document Details API reference](https://knowledge.leegality.com/document-execution/api/check-document-details) for the full parameter list and response schema. #### How They Work Together A typical integration uses both: 1. **Webhooks trigger your business logic** — when Leegality fires a `"Signer Signs Document"` webhook, your server records the event and can take immediate action (send a confirmation email, update a database, unlock a next step) 2. **Check Document Details provides the complete picture** — once the document is complete, call the API with `file=true` and `auditTrail=true` to fetch the signed PDF and audit trail for storage or downstream processing 3. **Check Document Details as recovery** — if a webhook is missed or your endpoint was temporarily down, the API gives you the full current state of the document at any time --- URL: https://knowledge.leegality.com/document-execution/api/security/ip-whitelisting # IP Whitelisting IP whitelisting ensures secure communication between your infrastructure and Leegality by restricting network access to specific IP addresses. IP whitelisting works in two directions: 1. **Whitelisting Your IPs in Leegality**: Restrict which of your servers can make API calls to Leegality 2. **Whitelisting Leegality IPs in Your Infrastructure**: Allow Leegality to send webhooks and access your endpoints ## Whitelisting Your IPs in Leegality Dashboard Configure which IP addresses from your infrastructure can access Leegality APIs. #### Add Your Server IPs 1. Log in to your Leegality dashboard 2. Navigate to **Settings** > **API** 3. In **Whitelisted IPs** enter your server's public IP address 4. Click **+** to add the IP address. Repeat for all servers that need API access. > **Caution — Important** > > Once enabled, only API requests from whitelisted IPs will be accepted. Ensure all necessary server IPs are added before enabling. #### IP Address Format The Leegality dashboard accepts **valid IPv4 addresses only**. **Format**: `xxx.xxx.xxx.xxx` **Example**: ``` 203.0.113.10 ``` **To whitelist multiple servers**: Add each server's IP address separately by clicking the **+** button after each entry. ## Whitelisting Leegality IPs in Your Infrastructure If your infrastructure has IP-based firewall rules, whitelist these Leegality IPs to receive webhooks and allow file uploads. #### Production Environment IPs Whitelist these IPs for production integrations: ``` 15.207.242.28 3.6.114.195 3.7.137.254 ``` #### Sandbox Environment IPs Whitelist these IPs for sandbox/testing: ``` 65.2.154.131 ``` ## IP Whitelisting Errors | Code | Message | Description | Solution | |------|---------|---------------------|----------| | `173` | `IP verification failed.` | The IP address making the API request is not in the authorized whitelist configured for your API token. | Add your public IPs in Leegality Dashboard via [**Settings → API → Whitelisted IPs**](https://knowledge.leegality.com/document-execution/settings/account-level/API/how-to-whitelist-ip). Ensure all server IPs are whitelisted before enabling the feature — once active, only whitelisted IPs can make call to Leegality APIs. | | — | `Please enter valid IPv4 address.` | The IP address entered in the dashboard is not a valid IPv4 format. | Use the format `xxx.xxx.xxx.xxx` (e.g. `203.0.113.10`). IPv6 addresses and incomplete values like `192.168.1` are not supported. | --- URL: https://knowledge.leegality.com/document-execution/api/security/domain-whitelisting # Domain Whitelisting Domain whitelisting ensures your infrastructure can access Leegality services and third-party eSign providers. ## Whitelisting Domains in Your Infrastructure If your organization uses firewalls, proxy servers, or content filters, whitelist these domains to ensure proper integration with Leegality. ### Required Domains for Production ``` *.leegality.com https://esign.egov.proteantech.in/nsdl-esp/authenticate/esign-doc/ https://esign.egov.proteantech.in https://api.leegality.com https://esign.cdslindia.com/ESign21Web/otp​ https://esign.verasys.in/esp/authpage ``` > **Info — Why Wildcard Domain?** > > Whitelisting `*.leegality.com` ensures all subdomains and microservices are accessible. Without this, you'll need to individually whitelist each subdomain and any new microservices deployed in the future. ### Required Domains for Sandbox ``` *.leegality.com https://pregw.esign.egov.proteantech.in​ https://api-sandbox.leegality.com https://esignuat.vsign.in/esp/authpage https://uatesign.cdslindia.com/ https://uatesign.cdslindia.com/ESign21Web/otp ``` ### Email Domain Whitelisting Whitelist these email addresses to receive notifications: - **Production**: `noreply@leegality.com` - **Sandbox**: `noreply-sandbox@leegality.com` Configure your email security gateway and spam filters to allow emails from these addresses. --- URL: https://knowledge.leegality.com/document-execution/api/security/payload-encryption # Payload Encryption Payload encryption adds an additional security layer to API requests, responses, and webhook notifications beyond standard HTTPS/TLS/SSL protocols. #### API Payload Encryption ### Pre-requisites Before enabling API payload encryption: 1. **Verify plan**: Contact Leegality customer support (support@leegality.com) to confirm your license supports API payload encryption. 2. **Key-Pair Exchange**: Exchange public keys with Leegality over secure email (bi-directional) - **Public Keys** - Leegality's public keys are shared with customers to download and use to encrypt API requests. - Customer-managed pubic keys are shared with Leegality to encrypt API responses. - **Private Keys** - Leegality's private keys are used to decrypt the API requests sent by the customer. - Customer-managed private keys are used to decrypt the API responses sent by Leegality. 3. **Specify User email IDs**: Provide the list of user email IDs that will make encrypted API calls. Leegality will map your public certificate to these user IDs ### How It Works Leegality uses **AES-256-CBC** to encrypt the payload content. The AES key and IV (Initialization Vector) used for encryption are bundled together into a 48-byte structure — 32 bytes for the AES key followed by 16 bytes for the IV. This bundle is called the **salt**, which is then RSA-encrypted with the recipient's public key before being sent alongside the payload. The encryption is built on a two-key system — each party holds a public key and a private key. Public keys are shared openly; private keys never leave their owner. | Direction | Encrypted with | Decrypted with | |-----------|---------------|----------------| | Your request → Leegality | Leegality's public key *(Leegality shared with you)* | Leegality's private key | | Leegality's response → You | Your public key *(You shared with Leegality)* | Your private key | ### Sending Encrypted Requests To send an encrypted request to a Leegality API, follow these steps: 1. Create the standard request payload as per API documentation 2. Generate a 256-bit AES key and IV (Initialization Vector) 3. Encrypt the request payload using the AES key (AES-256-CBC) and encode the result with Base64 format — this is the **`payload`** value 4. Combine AES key + IV into a 48-byte bundle (bytes 0–32 is AES key and bytes 32–48 is IV) 5. Encrypt the bundle with Leegality's public key using RSA and Base64 encode the result — this is the **`salt`** value 6. Send the request with the `content-encoding: encrypted` header and this body structure: ```bash curl --location 'https://app.leegality.com/api/v3.0/{endpoint}' \ --header 'X-Auth-Token: YOUR_API_TOKEN' \ --header 'Content-Type: application/json' \ --header 'content-encoding: encrypted' \ --data '{ "salt": "BASE64_ENCODED_ENCRYPTED_AES_KEY_AND_IV", "payload": "BASE64_ENCODED_ENCRYPTED_PAYLOAD" }' ``` ```mermaid flowchart LR A["Create request payload"] --> B["Generate 256-bit AES key + IV"] B --> C["Encrypt payload with AES key"] B --> D["Combine AES key + IV into 48-byte bundle"] C --> E["Base64 encode → payload value"] D --> F["Encrypt bundle with Leegality's public key"] F --> G["Base64 encode → salt value"] E --> H["Send request with content-encoding: encrypted"] G --> H ``` ### Decrypting API Responses When you send an encrypted request, Leegality's response is also encrypted — using your public key. You must decrypt it to read the response. Encrypted responses from Leegality have this structure: ```json { "salt": "BASE64_ENCODED_ENCRYPTED_AES_KEY_AND_IV", "payload": "BASE64_ENCODED_ENCRYPTED_RESPONSE" } ``` To decrypt: 1. Decrypt the salt using your organization's private key (RSA) 2. Extract AES key (bytes 0-31) and IV (bytes 32-47) from the decrypted salt 3. Decrypt the payload using the extracted AES key and IV (AES-256-CBC) 4. Parse the decrypted JSON response > **Info** > > HTTP status codes and error messages are NOT encrypted. Only the response payload is encrypted. ### Additional Resources A sample Java application for encryption, decryption, and related steps is available at the [Leegality Encryption Utility](https://gitlab.leegality.com/leegality-public/encryption-decryption-util) repository. #### Webhook Payload Encryption ### Pre-requisites Before enabling webhook payload encryption: 1. **Verify License**: Contact Leegality customer support to confirm your license supports webhook payload encryption 2. **Share Public Certificate**: Send your **RSA public key in PEM format** (file extension: `.cer.txt`) to Leegality over secure email. You retain the corresponding private key for decryption 3. **Receive Profile ID**: Leegality will configure your public certificate and provide a **Webhook Profile ID** 4. **Configure Profile ID**: Add the Webhook Profile ID against each invitee when sending documents > **Info** > > - If you configure both Payload Encryption and [Custom Webhook Headers](https://knowledge.leegality.com/document-execution/api/security/custom-webhook-headers), both are mapped to a single **Webhook Profile ID** — you don't need separate IDs > - An organisation can have multiple Profile IDs with different combinations > - Profile IDs are optional — if no Profile ID is passed, no encryption or custom headers are applied ### Configuring Webhook Profile ID **Via Dashboard**: 1. When creating or editing a workflow, navigate to invitee configuration 2. Go to **Invitee Level Options** for the invitee(s) who should receive encrypted webhooks 3. Under **Add custom URLs and webhooks** section 4. Enter the Webhook Profile ID in the **Webhook Profile ID** field **Via API**: Add `profileId` in the webhook object for each invitee when sending documents: ```json { "invitees": [ { "name": "John Doe", "email": "john@example.com", "webhook": { "profileId": "YOUR_WEBHOOK_PROFILE_ID", "url": "https://your-domain.com/webhook" } } ] } ``` > **Tip** > > Only invitees with a Profile ID configured will receive encrypted webhook payloads. Invitees without a Profile ID will receive standard (non-encrypted) webhooks. ### How It Works Leegality uses **AES-256-CBC** to encrypt webhook payloads. When a webhook is triggered for an invitee with a Profile ID configured: 1. Leegality generates a 256-bit AES key and IV (Initialization Vector) 2. Encrypts the webhook payload with the AES key — Base64 encoded, this is the **`payload`** value 3. Encrypts the AES key + IV bundle with your public key using RSA — Base64 encoded, this is the **`salt`** value 4. Sends the encrypted webhook to your endpoint: ```json { "salt": "BASE64_ENCODED_ENCRYPTED_AES_KEY_AND_IV", "payload": "BASE64_ENCODED_ENCRYPTED_WEBHOOK_PAYLOAD" } ``` ### Decrypting Webhook Payloads When your endpoint receives a webhook, the body will contain two fields — `salt` and `payload` — both Base64 encoded. To read the webhook content, you need to decrypt them using your private key: 1. Decrypt the `salt` using your private key (RSA) to obtain the 48-byte bundle 2. Extract the AES key (bytes 0–32) and IV (bytes 32–48) from the decrypted bundle 3. Decrypt the `payload` using the extracted AES key and IV (AES-256-CBC) 4. Parse the decrypted JSON and process the webhook content --- URL: https://knowledge.leegality.com/document-execution/api/security/custom-webhook-headers # Custom Webhook Headers When Leegality sends a webhook to your endpoint, your server needs a way to verify the request is genuinely coming from Leegality. Custom webhook headers let you define authentication parameters that Leegality includes in every webhook request — your server checks for these before processing the webhook. This supports a range of authentication methods, from basic username/password to bearer tokens and OAuth2.0. ### Types of Custom Webhook Headers Leegality supports two types of custom webhook headers: **Static Headers** - Fixed key-value pairs that remain unchanged for every webhook callback - Ideal for API keys, usernames, passwords, and fixed authentication tokens **Dynamic Headers** - Values fetched in real time from an API before each webhook call - Suitable for bearer tokens, OAuth2.0 tokens, or any value that refreshes periodically ## How It Works 1. You share your authentication requirements with Leegality support — for example, a static username and password, or an API endpoint Leegality should call to fetch a bearer token before each webhook 2. Leegality configures them on the backend and provides a **Webhook Profile ID** 3. For every webhook request sent to an invitee with the Profile ID attached, Leegality includes the configured headers 4. Your endpoint validates these headers to confirm the request is from Leegality before processing it ## Configuration #### Step 1: Prepare Header Information Email Leegality support at **support@leegality.com** with the following details: **For Static Headers:** Provide the key-value pairs to be added to the webhook headers. The key names depend on what your authentication system accepts — for example: | Key | Value | |-----|-------| | `username` | `xyz@abc.com` | | `password` | `sample_password` | **For Dynamic Headers:** Provide the details of the API that Leegality should call to fetch values before each webhook: - **API Endpoint / URL** - **Method Type** (GET, POST, etc.) - **Request parameters** — keys, values, and structure - **Response structure** — the JSON path of the value to extract (e.g., `$.resp_type.code.token`) Then provide the header mapping — the key name to use in the webhook header and the JSON path pointing to where Leegality should extract the value from the API response. Both the key name and the value source are defined by you: | Key | Source | |-----|--------| | `your-header-key` | `$.resp_type.code.token` *(extracted from API response (JSON) on each call)* | #### Step 2: Receive Webhook Profile ID Once Leegality configures your request, you will receive a **Webhook Profile ID**. You need to include this Profile ID with each invitee when sending documents — only invitations with the Profile ID attached will have the custom headers added to their webhook calls. #### Step 3: Configure Profile ID 1. When creating or editing a workflow, navigate to invitee configuration 2. Go to **Invitee Level Options** for the invitee(s) who should receive custom headers 3. Under **Add custom URLs and webhooks** section 4. Enter the Webhook Profile ID in the **Webhook Profile ID** field > **Tip — Authenticate Webhook Calls** > > When your endpoint receives a webhook from Leegality, validate the custom headers before processing the request. If the headers are missing or do not match your expected values, reject the request. This ensures only legitimate webhook calls from Leegality are processed. --- URL: https://knowledge.leegality.com/document-execution/api/security/mtls # Mutual TLS (mTLS) on Leegality Mutual TLS (mTLS) is a two-way authentication protocol. Unlike standard HTTPS, where only the server proves its identity, in mTLS, **both the server and the client present digital certificates** before any data exchange begins. In Leegality's context, this means: when Leegality sends a webhook to a client's server, both sides authenticate each other using certificates — ensuring the client's server only accepts callbacks from Leegality's verified identity. ## Why mTLS for Webhooks When Leegality completes a signing event, it sends an outbound HTTP POST call to the client's configured `webhookURL` or `errorWebhookURL`. By default, this call is made over standard HTTPS (TLS), which only authenticates the **server** (Leegality's side). However, clients who need to verify that incoming webhook calls genuinely originate from Leegality — and not from a third party — can enable **Mutual TLS (mTLS)**. mTLS extends standard TLS by requiring **both parties** to present and validate a certificate. This means: - Leegality proves its identity to the client's server (standard TLS). - Leegality also presents a **client certificate** when calling the client's webhook endpoint, which the client's server validates before accepting the request. Clients operate under strict frameworks — RBI IT & Cybersecurity, SEBI Cloud Application Framework, and internal WAF policies. These frameworks require that all inbound API callbacks (webhooks) be authenticated. mTLS is Leegality's primary mechanism to satisfy these requirements. ## How mTLS Works When Leegality sends an outbound webhook: 1. Leegality presents the mTLS certificate as its client identity in the TLS handshake 2. The client's server validates Leegality's certificate 3. The TLS handshake completes; the webhook payload is delivered **Key facts:** - Clients must trust the mTLS certificate in their keystore - Sandbox and Production are **separate configurations** — certificates must be installed and configured for each environment independently - The certificate is configured per **Webhook Profile ID** (a UUID), which is then mapped to an Org ID ## Implementation Methods ### Method 1: CSR Generated by Leegality 1. Leegality generates a CSR and shares it with the client 2. Client gets it signed by any CA (private or recognised) 3. Client shares signed certificate back with Leegality 4. Leegality converts to P12 and configures in a Webhook Profile ID 5. Webhook Profile ID shared with client ### Method 2: Certificate Procured by Leegality 1. Leegality procures a public signed certificate from a trusted CA 2. Converts it to P12 format 3. Configures it in a Webhook Profile ID 4. Shares the public certificate and Webhook Profile ID with the client ## Prerequisites Checklist **From the Customer:** - [ ] Org ID(s) requiring mTLS — Sandbox and Production separately - [ ] Webhook receiver URL (HTTPS endpoint) - [ ] Custom header requirements (header names and values) - [ ] Commercial approval (mTLS is a paid feature ) **From the Leegality:** - [ ] Webhook Profile ID created/identified for the Org ID - [ ] Certificate configured in the Webhook Profile - [ ] Custom headers added if required ## Certificate Renewal Certificate has **1-year validity**. Upon renewal: 1. Leegality renews the certificate 2. The renewed certificate must be **re-configured in every Webhook Profile ID** that uses it 3. The new public certificate must be **re-shared with all active mTLS clients** so they can update their keystores 4. Clients must install the new cert before the old one expires --- URL: https://knowledge.leegality.com/document-execution/api/create-an-e-signing-request # POST /v3.0/sign/request — Create eSigning request Creates a new eSigning request based on a published Workflow. Use this endpoint to run a workflow and send a document with pre-configured settings. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.0/sign/request ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `profileId` | string | Yes | The Workflow ID for this signing request. Find it in your Leegality Dashboard. | `7WMVrYf` | | `file` | File | Yes | File configuration. For PDF workflows, provide a base64-encoded PDF. For template workflows, provide the template field values. See **File** below. | — | | `stampSeries` | string | No | The stamp series to apply to this document. - **Note:** Ensure the selected series has stamps available. You can verify and manage stamp inventory under the **[Stamp](https://knowledge.leegality.com/document-execution/stamps/stamp-series/)** tab in your Dashboard. | — | | `multipleStampSeries` | array\ | No | Ensure the selected series has stamps available. You can verify and manage stamp inventory under the **[Stamp](https://knowledge.leegality.com/document-execution/stamps/stamp-series/)** tab in your Dashboard. See **multipleStampSeries** below. | — | | `seriesGroup` | string | No | Stamp group to use for this document. - **Note:** You can view available groups under the **[Stamp](https://knowledge.leegality.com/document-execution/stamps/stamp-group/stamp-groups)** tab in your Dashboard. | `DL02` | | `stampValue` | string | No | Stamp amount value for this document. | `5000` | | `stampUpload` | stampUpload | No | Configuration for uploading physical stamp paper. Required when the workflow uses **upload stamp paper**. All fields are required when this object is provided. See **stampUpload** below. | — | | `revenueStampSeries` | string | No | Revenue stamp series to use. | `06` | | `revenueStampQuantity` | string | No | Number of revenue stamps to attach to the document. - **Default:** 1 | `2` | | `neslData` | Nesl | No | See **Nesl** below. | — | | `invitees` | array\ | Yes | See **Invitee** below. | — | | `cc` | array\ | No | See **Cc** below. | — | | `irn` | string | No | Internal Reference Number (IRN) for the document. Used to search or reference this document via API or Dashboard. - **Allowed characters:** Alphanumeric, `+`, `\|`, `-`, `:`, `(`, `)`, `,`, `_`, `.`, `[`, `]`, `&`, `/`, and `@` - **Max length:** 255 characters | — | #### File File configuration. For PDF workflows, provide a base64-encoded PDF. For template workflows, provide the template field values. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Name for the document. - **Allowed characters:** Alphanumeric, `+`, `\|`, `-`, `:`, `(`, `)`, `,`, `_`, `.`, `[`, `]`, `&`, `/`, and `@` - **Max length:** 255 characters | `KYC_Application_Form` | | `file` | string | No | Base64-encoded string of the PDF to be eSigned. - **Format:** Base64-encoded PDF - **Max size:** 15 MB (before encoding) | `JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlL...` | | `fields` | array\ | No | One object represents a single field in a template-type workflow. Get the complete field structure including IDs from Dashboard > Template Editor > Download Form Fields. Leave empty if you want the first invitee to fill in this field themselves. See **TemplateFields** below. | — | | `autoGroupedFieldsFill` | boolean | No | Enables automatic population of grouped fields in HTML templates. Grouped fields share the same data across multiple locations (e.g., an address repeated in five places). When `true`, pass only one field from each group — all others in the group are auto-populated. When `false`, all grouped fields must be passed individually. - **Default:** `false` - **Note:** Only works with HTML templates. Currently in Beta. | `true` | | `additionalFiles` | array\ | No | Array of Base64-encoded PDF strings to append to the main document. - **Format:** Array of Base64-encoded PDFs - **Max total size:** 15 MB | `JVBERi0xLjQKJeLjz9MKMSAwIG9iago...,JVBERi0xLjcKJcfsj6UKMzQgM` | ##### TemplateFields One object represents a single field in a template-type workflow. Get the complete field structure including IDs from Dashboard > Template Editor > Download Form Fields. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique identifier of the template field. | `field_123` | | `name` | string | No | Name of the template field. | `employeeName` | | `type` | string | No | Type of the template field. - **Allowed:** `checkbox`, `radio`, `text`, `dropdown`, `textarea`, `select`, `files` Allowed: `text`, `textarea`, `checkbox`, `radio`, `dropdown`, `select`, `files`. | `text` | | `value` | string | No | The value to pre-fill for this template field. | `John Doe` | | `checked` | boolean | No | Indicates whether this option is selected by default in template. - **Required:** When `type` is `checkbox` or `radio`. | `true` | | `multiple` | boolean | No | Indicates whether the user can select more than one option.. **Required:** When `type` is `dropdown`. | `false` | | `width` | string | No | Width of the image in px. - **Required:** When `type` is `files` (image). | `200` | | `height` | string | No | Height of the image in px. - **Required:** When `type` is `files` (image). | `150` | | `required` | boolean | No | Indicates whether the invitee must fill in this field during the signing process. | `true` | #### multipleStampSeries Configuration for affixing multiple stamps from a specific series to the document. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `stampSeries` | string | No | Unique series number of the stamp series to use. | `07` | | `seriesQuantity` | string | No | Number of stamps from this series to affix to the document. - **Range:** 1 – 99 | `2` | #### stampUpload Configuration for uploading physical stamp paper. Required when the workflow uses **upload stamp paper**. All fields are required when this object is provided. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `state` | string | Yes | Name of the state for the uploaded stamp paper. | `Maharashtra` | | `denomination` | string | Yes | Denomination of the uploaded stamp paper. | `100` | | `firstPartyName` | string | Yes | Name of the first party on the uploaded stamp paper. | `ABC Pvt Ltd` | | `secondPartyName` | string | Yes | Name of the second party on the uploaded stamp paper. | `XYZ Corporation` | | `stampSerial` | string | Yes | Serial number of the uploaded stamp paper. | `IN-KA20230012345` | | `stampFile` | string | Yes | Base64-encoded string of the stamp paper to upload. - **Format:** Base64-encoded PDF | `JVBERi0xLjQKJeLjz9MK...` | #### Nesl | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentDetail` | NeslDocument | No | See **NeslDocument** below. | — | | `stampData` | array\ | No | See **NeslStamp** below. | — | | `entities` | array\ | No | See **NeslEntity** below. | — | | `participants` | array\ | No | See **NeslParticipants** below. | — | | `neslParties` | array\ | No | See **NeslParties** below. | — | | `neslSecurities` | array\ | No | See **NeslSecurities** below. | — | ##### NeslDocument | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `loanNumber` | string | No | The loan number associated with the debt. Mandatory for Individual, non-individual loans and eBG | — | | `sanctionNumber` | string | No | The sanction number associated with the debt. Mandatory for Individual, non-individual loans and eBG | — | | `registrationType` | string | Yes | Type of debt (Individual Loan or Non-Individual Loan) or eBG Accepted values are- INDIVIDUAL_LOAN, NON_INDIVIDUAL_LOAN, non_lending, EBG Allowed: `INDIVIDUAL_LOAN`, `NON_INDIVIDUAL_LOAN`, `NON_LENDING`, `EBG`. | — | | `state` | string | Yes | The state in which stamp duty is being paid. | — | | `branchName` | string | No | The name of the branch granting the loan. | — | | `branchAddress` | string | No | The address of the branch granting the loan. | — | | `dateOfSanction` | string | No | The date on which the loan was sanctioned as per the lender's CBS. Mandatory for Individual and non-individual loans. | `2018-02-02` | | `emiAmount` | string | No | Interest installment amount payable on the loan. Mandatory for Individual and non-individual loans. | — | | `rateOfInterest` | string | No | Rate of Interest on the loan. Mandatory for Individual and non-individual loans. | — | | `sanctionAmount` | string | No | The amount sanctioned by the financial creditor. Mandatory for Individual, non-individual loans and eBG | — | | `tenure` | string | No | The tenure of the loan. Mandatory for Individual and non-individual loans. | — | | `typeOfDebt` | string | No | The type of loan (financial debt or operational debt). Mandatory for Individual, non-individual loans and eBG Accepted values are- FINANCIAL, OPERATIONAL. Allowed: `FINANCIAL`, `OPERATIONAL`. | — | | `accountClosedFlag` | string | No | Whether the account is closed (yes, no, or assigned debt). Mandatory for Individual, non-individual loans and eBG Accepted values are- YES, NO, ASSIGNED. Allowed: `YES`, `NO`, `ASSIGNED`. | — | | `fundType` | string | No | Whether the credit facility is funded or non funded. Mandatory for Individual, non-individual loans and eBG Accepted values are- FUNDED, NON_FUNDED. Allowed: `FUNDED`, `NON_FUNDED`. | — | | `sanctionCurrency` | string | No | The currency in which the loan is denominated (INR). Mandatory for Individual, non-individual loans and eBG. Accepted values are- INR Allowed: `INR`. | — | | `creditSubtype` | string | No | Whether the financial debt is created pursuant to a credit facility or the purchase of a property. Mandatory for Individual, non-individual loans and eBG Accepted values are- CREDIT_FACILITY, PROPERTY_BUYER, GRANT Allowed: `CREDIT_FACILITY`, `PROPERTY_BUYER`, `HYBRID_EBG`. | — | | `facilityName` | string | No | The name of the loan facility. Mandatory for Individual and non-individual loans. | — | | `amountOverdue` | string | No | The amount overdue on the loan. | — | | `otherChargeAmount` | string | No | Any other charges (if applicable). | — | | `debtStartDate` | string | No | The date on which the financial debt started. | — | | `interestAmount` | string | No | The amount of interest. | — | | `oldDebtRefNo` | string | No | The old debt reference number (applicable in case there is a change in the debt reference number). | — | | `principalOutstanding` | string | No | The outstanding principal amount. | — | | `loanRemark` | string | No | Loan remarks (if any). | — | | `totalOutstandingAmount` | string | No | Total outstanding amount. | — | | `creditorBusinessUnit` | string | No | The business unit of the creditor providing the debt (such as SME, Retail etc). | — | | `drawingPower` | string | No | The drawing power of the loan. | — | | `daysPastDue` | string | No | The number of days past due date. | — | | `docRefNo` | string | No | This parameter is applicable only for Non-Lending Flow. An alphanumeric document reference number can be added in this parameter which will be stored in the IU. Note- This is a mandatory parameter for Non-lending flow. | — | | `expiryDateEbg` | string | No | The Expiry Date of eBG in "yyyy-MM-dd" format. Mandatory for eBG | — | | `claimExpiryDate` | string | No | The Claim Expiry Date of eBG in "yyyy-MM-dd" format. Mandatory for eBG | — | | `contractRefNo` | string | No | Vendor Contract Reference Number | — | | `vendorCode` | string | No | Vendor Code | — | | `portalId` | string | No | Portal ID as assigned to the Creditor by NeSL | — | | `event` | string | No | Specifies the type of electronic Bank Guarantee (eBG) event. This field is **required** if `registrationType` is set to EBG. Allowed values are: - Issuance - Amendment - Partial_invocation - Invocation - Cancellation - Closure - Renewal - Court_injunction | — | ##### NeslStamp | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `firstParty` | string | Yes | The name of the first party (for the stamp paper). | — | | `secondParty` | string | Yes | The name of the second party (for the stamp paper). | — | | `stampDutyAmount` | string | Yes | The stamp duty amount. **Note:** For West Bengal, Maharashtra, Madhya Pradesh, Kerala, and Telangana, the stamp duty is automatically calculated based on the considerationPrice and will override the value passed in this parameter, if there is a difference between the two. | — | | `considerationPrice` | string | Yes | The consideration price for the purposes of stamp duty. | — | | `descriptionOfDocument` | string | Yes | The description of the document for the purposes of stamp duty. | — | | `stampDutyPaidBy` | string | Yes | The name of the party paying the stamp duty. | — | | `articleCode` | string | Yes | Article code for payment of stamp duty. | — | | `articleSubCode` | string | No | Article sub-code as per the selected state. | — | | `firstPartyPin` | string | No | The pincode of the first party (for the stamp paper). This is mandatory for the states of Madhya Pradesh & West Bengal. | — | | `secondPartyPin` | string | No | The pincode of the second party (for the stamp paper). This is mandatory for the states of Madhya Pradesh & West Bengal. | — | | `firstPartyOVDType` | string | No | The OVD Type of the first party (for the stamp paper). This will be List of values. This is mandatory for the states of West Bengal. Accepted values are - PAN_CARD, DRIVING_LICENSE, VOTER_ID, PASSPORT, ANY_OTHER_OFFICIAL_ID. Allowed: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID`. | — | | `firstPartyOVDValue` | string | No | The OVD Value of the first party (for the stamp paper). This is mandatory for the states of West Bengal. | — | | `secondPartyOVDType` | string | No | The OVD Type of the second party (for the stamp paper). This will be List of values. This is mandatory for the states of West Bengal. Accepted values are - PAN_CARD, DRIVING_LICENSE, VOTER_ID, PASSPORT, ANY_OTHER_OFFICIAL_ID. Allowed: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID`. | — | | `secondPartyOVDValue` | string | No | The OVD Value of the second party (for the stamp paper). This is mandatory for the states of West Bengal. | — | ##### NeslEntity NeSL entity details for non-individual participants (companies, partnerships, etc.). - **For `NON_INDIVIDUAL_LOAN` and `NON_LENDING`:** Only one entity object is allowed. - **For `EBG`:** Multiple entity objects may be passed based on the number of non-individual participants. They are maintained as an array. - The entity object is optional. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `entityName` | string | Yes | Name of the entity associated with the document. - **Max length:** 100 characters - **Allowed characters:** Alphanumeric only | `ABC Corporation Pvt Ltd` | | `entityPan` | string | Yes | PAN number of the entity associated with the document. - **Length:** 10 characters - **Allowed characters:** Alphanumeric only - **Format:** First 5 characters alphabetic, next 4 numeric, last character alphabetic. - **4th character rule:** Must be `C` or `E`, OR `P` when `legalConstitution` is `PROPRIETORSHIP`, OR `F` when `legalConstitution` is `PARTNERSHIP`. | `ASDCB1234B` | | `legalConstitution` | string | Yes | Legal constitution of the entity. Accepted values are- - `RESIDENT_INDIVIDUAL` - `PUBLIC_LTD` - `PRIVATE_LTD` - `LLP` - `PROPRIETORSHIP` - `PARTNERSHIP` - `ENTITY_CREATED_BY_STATUTE` - `TRUST` - `HUF` - `CO_OP_SOCIETY` - `ASSOCIATION_OF_PERSONS` - `GOVERNMENT` - `SELF_HELP_GROUP` - `NON_RESIDENT` - `FOREIGN_COMPANY` Allowed: `RESIDENT_INDIVIDUAL`, `PUBLIC_LTD`, `PRIVATE_LTD`, `LLP`, `PROPRIETORSHIP`, `PARTNERSHIP`, `ENTITY_CREATED_BY_STATUTE`, `TRUST`, `HUF`, `CO_OP_SOCIETY`, `ASSOCIATION_OF_PERSONS`, `GOVERNMENT`, `SELF_HELP_GROUP`, `NON_RESIDENT`, `FOREIGN_COMPANY`. | — | | `dateOfIncorporation` | string | Yes | Date of incorporation of the legal entity. - **Format:** YYYY-MM-DD - **Length:** 10 characters | `1992-05-18` | | `emailId` | string | Yes | Email address of the entity. - **Max length:** 100 characters - **Allowed special characters:** `-`, `_`, `.`, `@` - **Format:** Must be a valid email address. | `abc@company.com` | | `mobileNumber` | string | Yes | Contact number of the entity. - **Length:** 10 characters - **Allowed characters:** Numeric only | `7795719077` | | `registeredAddress` | string | Yes | Registered office address of the entity. - **Max length:** 300 characters - **Allowed characters:** Alphanumeric and `@!@#$%^&*()_+-=}{[]:;\|'.,/?~` | `Bangalore` | | `registeredPincode` | string | Yes | PIN code of the registered office address. Must be a valid 6-digit Indian PIN code. - **Length:** 6 characters - **Allowed characters:** Numeric only | `560001` | | `communicationAddress` | string | Yes | Communication address of the entity. - **Max length:** 300 characters - **Allowed characters:** Alphanumeric and `@!@#$%^&*()_+-=}{[]:;\|'.,/?~` | `Test` | | `communicationAddressPinCode` | string | Yes | PIN code of the communication address. Must be a valid 6-digit Indian PIN code. - **Length:** 6 characters - **Allowed characters:** Numeric only | `111111` | | `businessUnitCode` | string | No | Business unit code of the entity. **Only for `EBG`.** - **Max length:** 30 characters - **Allowed characters:** Alphanumeric only | `BU001` | ##### NeslParticipants NeSL participant details. The number of participants must equal the number of NeSL-type invitees in the request. The first participant (matching the first NeSL invitee) must have contactRelation set to `DEBTOR`. For `NON_INDIVIDUAL_LOAN`, participants additionally require: registeredAddress, registeredPinCode, communicationAddress, communicationAddressPinCode, and a company PAN (4th letter C or E in officialDocId). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `fullName` | string | Yes | Full name of the Party. | — | | `contactPersonName` | string | No | Full name of the contact person of the Party. | — | | `contactRelation` | string | Yes | Relation of the party to the debt (Debtor, Guarantor, Co-obligant, Beneficiary, Creditor). Accepted values are- CREDITOR, DEBTOR, GUARANTOR, CO_OBLIGANT, SECURITY_PROVIDER, ASSIGNEE, BENEFICIARY. Allowed: `CREDITOR`, `DEBTOR`, `GUARANTOR`, `CO_OBLIGANT`, `SECURITY_PROVIDER`, `ASSIGNEE`, `BENEFICIARY`. | — | | `emailId` | string | Yes | Email ID of the signer. | — | | `mobileNumber` | string | Yes | Mobile Number of the signer. | `9876543210` | | `dob` | string | Yes | Date of Birth/Incorporation. | `1990-05-15` | | `legalConstitution` | string | Yes | Legal constitution of the signer (Resident Individual, Private Limited, Public Limited, LLP, Proprietorship, Partnership, Entity created by Statute, Trust, HUF, Coop Society, Association of Persons, Government, Self Help Groups, Non-Resident, Foreign Company). Accepted values are- RESIDENT_INDIVIDUAL, PUBLIC_LTD, PRIVATE_LTD, LLP, PROPRIETORSHIP, PARTNERSHIP, ENTITY_CREATED_BY_STATUTE, TRUST, HUF, CO_OP_SOCIETY, ASSOCIATION_OF_PERSONS, GOVERNMENT, SELF_HELP_GROUP, NON_RESIDENT, FOREIGN_COMPANY. Allowed: `RESIDENT_INDIVIDUAL`, `PUBLIC_LTD`, `PRIVATE_LTD`, `LLP`, `PROPRIETORSHIP`, `PARTNERSHIP`, `ENTITY_CREATED_BY_STATUTE`, `TRUST`, `HUF`, `CO_OP_SOCIETY`, `ASSOCIATION_OF_PERSONS`, `GOVERNMENT`, `SELF_HELP_GROUP`, `NON_RESIDENT`, `FOREIGN_COMPANY`. | — | | `alternateEmailId` | string | No | Alternate email ID of the signer. | — | | `alternateMobileNumber` | string | No | Alternate mobile of the signer. | — | | `officialDocType` | string | Yes | Official Document Type (Pan Card, Driving License, Voter ID, Passport, Others). Accepted values are- PAN_CARD, DRIVING_LICENSE, VOTER_ID, PASSPORT, ANY_OTHER_OFFICIAL_ID. Allowed: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID`. | — | | `officialDocId` | string | Yes | Official Document ID. | — | | `registeredAddress` | string | No | Registered address of the signer. | — | | `registeredPinCode` | string | No | PIN code of the registered address of the signer. | — | | `designation` | string | No | Designation of the signer (relevant in case of corporate entities). | — | | `communicationAddress` | string | No | Communication address of the signer. | — | | `communicationAddressPinCode` | string | No | PIN code of the communication address of the signer. | — | | `cin` | string | No | Corporate Identification Number (relevant in case of corporate entities). | — | | `kin` | string | No | KYC Identification Number of signer. | — | | `partyType` | string | Yes | Type of Party (Indian entity/ Resident Individual/ Foreign Entity/ NRI/Foreign Individual. Accepted values are- INDIAN_ENTITY, RESIDENT_INDIVIDUAL, FOREIGN_ENTITY, NRI. Allowed: `INDIAN_ENTITY`, `RESIDENT_INDIVIDUAL`, `FOREIGN_ENTITY`, `NRI`. | — | | `isIndividual` | string | No | Whether the participant is individual or not Accepted values are - YES, NO Allowed: `YES`, `NO`. | — | | `signatoryGender` | string | No | Gender of the participant Accepted values are - MALE, FEMALE Allowed: `MALE`, `FEMALE`. | — | | `businessUnit` | string | No | Business Unit Code of the party. It is an alphanumeric string with a maximum length of 30 characters. (Only for eBG) | — | ##### NeslParties Additional NeSL party details for non-signing parties involved in the transaction. Unlike participants, neslParties do not need to match invitees. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `fullName` | string | Yes | Full name of the Party. | — | | `contactPersonName` | string | Yes | Full name of the contact person of the Party. | — | | `contactRelation` | string | Yes | Relation of the party to the debt (Debtor, Guarantor, Co-obligant, Beneficiary, Creditor). Accepted values are- CREDITOR, DEBTOR, GUARANTOR, CO_OBLIGANT, SECURITY_PROVIDER, ASSIGNEE, BENEFICIARY. Allowed: `CREDITOR`, `DEBTOR`, `GUARANTOR`, `CO_OBLIGANT`, `SECURITY_PROVIDER`, `ASSIGNEE`, `BENEFICIARY`. | — | | `emailId` | string | Yes | Email ID of the signer. | — | | `mobileNumber` | string | Yes | Mobile Number of the signer. | `9876543210` | | `dob` | string | Yes | Date of Birth/Incorporation. | `1990-05-15` | | `legalConstitution` | string | Yes | Legal constitution of the signer (Resident Individual, Private Limited, Public Limited, LLP, Proprietorship, Partnership, Entity created by Statute, Trust, HUF, Coop Society, Association of Persons, Government, Self Help Groups, Non-Resident, Foreign Company). Accepted values are- RESIDENT_INDIVIDUAL, PUBLIC_LTD, PRIVATE_LTD, LLP, PROPRIETORSHIP, PARTNERSHIP, ENTITY_CREATED_BY_STATUTE, TRUST, HUF, CO_OP_SOCIETY, ASSOCIATION_OF_PERSONS, GOVERNMENT, SELF_HELP_GROUP, NON_RESIDENT, FOREIGN_COMPANY. Allowed: `RESIDENT_INDIVIDUAL`, `PUBLIC_LTD`, `PRIVATE_LTD`, `LLP`, `PROPRIETORSHIP`, `PARTNERSHIP`, `ENTITY_CREATED_BY_STATUTE`, `TRUST`, `HUF`, `CO_OP_SOCIETY`, `ASSOCIATION_OF_PERSONS`, `GOVERNMENT`, `SELF_HELP_GROUP`, `NON_RESIDENT`, `FOREIGN_COMPANY`. | — | | `alternateEmailId` | string | No | Alternate email ID of the signer. | — | | `alternateMobileNumber` | string | No | Alternate mobile of the signer. | — | | `officialDocType` | string | Yes | Official Document Type (Pan Card, Driving License, Voter ID, Passport, Others). Accepted values are- PAN_CARD, DRIVING_LICENSE, VOTER_ID, PASSPORT, ANY_OTHER_OFFICIAL_ID. Allowed: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID`. | — | | `officialDocId` | string | Yes | Official Document ID. | — | | `registeredAddress` | string | No | Registered address of the signer. | — | | `registeredPinCode` | string | No | PIN code of the registered address of the signer. | — | | `designation` | string | No | Designation of the signer (relevant in case of corporate entities). | — | | `communicationAddress` | string | No | Communication address of the signer. | — | | `communicationAddressPinCode` | string | No | PIN code of the communication address of the signer. | — | | `cin` | string | No | Corporate Identification Number (relevant in case of corporate entities). | — | | `kin` | string | No | KYC Identification Number of signer. | — | | `partyType` | string | Yes | Type of Party (Indian entity/ Resident Individual/ Foreign Entity/ NRI/Foreign Individual. Accepted values are- INDIAN_ENTITY, RESIDENT_INDIVIDUAL, FOREIGN_ENTITY, NRI. Allowed: `INDIAN_ENTITY`, `RESIDENT_INDIVIDUAL`, `FOREIGN_ENTITY`, `NRI`. | — | | `isIndividual` | string | No | Whether the parties is individual or not. Mandatory for eBG Accepted values are - YES, NO Allowed: `YES`, `NO`. | — | | `signatoryGender` | string | No | Gender of the participant Accepted values are - MALE, FEMALE Allowed: `MALE`, `FEMALE`. | — | ##### NeslSecurities | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `securityDescription` | string | Yes | Description of security. | — | | `assetsType` | string | Yes | Type of asset forming security (Movable, Immovable, Intangible, Not Classified). Accepted values are- MOVABLE, IMMOVABLE, INTANGIBLE, NOT_CLASSIFIED. Allowed: `MOVABLE`, `IMMOVABLE`, `INTANGIBLE`, `NOT_CLASSIFIED`. | — | | `chargeType` | string | Yes | Type of charge created (Mortgage, Hypothecation, Charge, Assignment, Pledge, Lien, Negative Lien, Guarantee, Others, Not Classified). Accepted values are- MORTGAGE, HYPOTHECATION, CHARGE, ASSIGNMENT, PLEDGE, LIEN, NEGATIVE_LIEN, GUARANTEE, OTHERS, NOT_CLASSIFIED. Allowed: `MORTGAGE`, `HYPOTHECATION`, `CHARGE`, `ASSIGNMENT`, `PLEDGE`, `LIEN`, `NEGATIVE_LIEN`, `GUARANTEE`, `OTHERS`, `NOT_CLASSIFIED`. | — | | `assetId` | string | Yes | Asset ID of the Security (used internally by the lender). | — | | `doc` | string | No | Date of creation of security. | — | | `dov` | string | No | Date of valuation of security. | — | | `cersaiId` | string | No | CERSAI ID of security created. | — | | `rocChargeId` | string | No | ROC ID for security created. | — | | `securityValue` | string | No | Value of security. | — | | `abc` | string | No | Asset ID of the Security (used internally by the lender). | — | #### Invitee Represents a single signer or approver in the eSigning workflow. Each invitee receives a unique signing URL and can be configured with signature verification, GPS restrictions, and face matching. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Full name of the invitee. - **Maximum Length:** 255 Characters | — | | `email` | string | No | Email address of the invitee. - **Required:** At least one of `email` or `phone` must be provided. - **Format:** `johndoe@example.com` | — | | `phone` | string | No | Mobile number of the invitee. - **Required:** At least one of `email` or `phone` must be provided. - **Format:** 10-digit mobile number | — | | `groupId` | string | No | Group ID for the invitee when using the Group Invitee feature. Find this value in the API payload downloaded from your Dashboard. - **Required:** When signing from a group. | — | | `groupName` | string | No | Group name for the invitee when using the Group Invitee feature. Auto-filled if configured in the Dashboard workflow. - **Required:** When signing from a group. | — | | `completionThreshold` | string | No | Completion threshold for the group. Auto-filled if configured in the Dashboard workflow. - **Required:** When signing from a group. | — | | `organizationName` | string | No | Organization name of the signer. - **Required:** When the workflow is configured to use organizational signatures. | — | | `defaultLanguageSelect` | string | No | Language for the signing journey presented to this invitee. - **Allowed:** `ENGLISH`, `HINDI`, `MARATHI`, `GUJARATI`, `BENGALI`, `MALAYALAM`, `TAMIL`, `TELUGU`, `KANNADA`, `ODIA` Allowed: `ENGLISH`, `HINDI`, `MARATHI`, `GUJARATI`, `BENGALI`, `MALAYALAM`, `TAMIL`, `TELUGU`, `KANNADA`, `ODIA`. | `ENGLISH` | | `faceMatchImage` | string | No | Reference image for face match verification. - **Required:** When face match is enabled in the workflow configuration. Omitting this when face match is enabled will return an error. - **Format:** Base64-encoded image | — | | `workflowPaymentCollectionConfig` | workflowPaymentCollectionConfig | No | Payment collection configuration for collecting a fee from the signer before they can sign the document. See **workflowPaymentCollectionConfig** below. | — | | `gpsConfig` | gpsConfig | No | GPS location restriction and accuracy configuration for the signer. When enabled, the signer must be within the specified location and accuracy threshold to sign. **Dashboard Override:** If the workflow toggle "Allow sender to make changes while running" is OFF, API values are ignored and dashboard values are used instead. See **gpsConfig** below. | — | | `aadhaarConfig` | AadhaarConfig | No | Aadhaar certificate verification configuration. When enabled, the signer's Aadhaar certificate details are verified against the values provided here before signing. > On any verification mismatch or failure to meet the threshold, whether the signer can proceed depends on sender's **[Department > eSignature](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#configure-certificate-verification-settings)** settings. - **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required. See **AadhaarConfig** below. | — | | `dscConfig` | DscConfig | No | DSC verification configuration. > On any verification mismatch or failure to meet the threshold, whether the signer can proceed depends on sender's **[Department > eSignature](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#configure-certificate-verification-settings)** settings. - **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required regardless of the API value. See **DscConfig** below. | — | | `neslConfig` | NeslConfig | No | **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required regardless of the API value. See **NeslConfig** below. | — | ##### workflowPaymentCollectionConfig Payment collection configuration for collecting a fee from the signer before they can sign the document. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `amount` | string | No | Amount to collect from the signer before signing. - **Range:** Greater than ₹10 | `500` | ##### gpsConfig GPS location restriction and accuracy configuration for the signer. When enabled, the signer must be within the specified location and accuracy threshold to sign. **Dashboard Override:** If the workflow toggle "Allow sender to make changes while running" is OFF, API values are ignored and dashboard values are used instead. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `applyLocationRestriction` | boolean | No | Enables location-based signing restriction. When `true`, the signer can only sign from within the area defined by `allowedLatitude`, `allowedLongitude`, and `permissibleRadius`. | — | | `allowedLatitude` | number | No | Latitude of the permitted signing location. - **Required:** When `applyLocationRestriction` is `true`. - **Format:** Decimal degrees | `29.982643` | | `allowedLongitude` | number | No | Longitude of the permitted signing location. - **Required:** When `applyLocationRestriction` is `true`. - **Format:** Decimal degrees | `78.055405` | | `permissibleRadius` | integer | No | Radius (in meters) around the permitted location within which signing is allowed. - **Required:** When `applyLocationRestriction` is `true`. | `5000` | | `applyLocationAccuracy` | boolean | No | Enables GPS accuracy-based restriction. When `true`, the signer's device GPS accuracy is validated against `accuracyThreshold`. | — | | `accuracyThreshold` | integer | No | Maximum allowed GPS accuracy in meters. Signing is blocked if the device accuracy exceeds this value. - **Required:** When `applyLocationAccuracy` is `true`. | `10000` | ##### AadhaarConfig Aadhaar certificate verification configuration. When enabled, the signer's Aadhaar certificate details are verified against the values provided here before signing. > On any verification mismatch or failure to meet the threshold, whether the signer can proceed depends on sender's **[Department > eSignature](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#configure-certificate-verification-settings)** settings. - **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `verifyName` | boolean | No | Indicates whether the signer's name on the signing certificate must match the name provided in the request. | — | | `verifySmartName` | boolean | No | When `true`, returns a percentage similarity score between the certificate name and the provided name. | — | | `verifyPincode` | string | No | PIN code to verify against the signer's certificate. Ignored if the certificate does not contain a PIN code. | `247667` | | `verifyYob` | string | No | Year of birth to verify against the signer's certificate. Only works for Aadhaar eSign or NESL. - **Format:** 4-digit year | `1998` | | `verifyTitle` | string | No | Last 4 digits of the signer's Aadhaar UID to verify against the certificate. Only works for Aadhaar eSign or NESL. | `3870` | | `verifyState` | string | No | State name to verify against the signer's certificate. | `Uttarakhand` | | `verifyGender` | string | No | Gender to verify against the signer's certificate.Only works for Aadhaar eSign or NESL. - **Allowed:** `M` (Male), `F` (Female), `T` (Transgender) Allowed: `M`, `F`. | — | ##### DscConfig DSC verification configuration. > On any verification mismatch or failure to meet the threshold, whether the signer can proceed depends on sender's **[Department > eSignature](https://knowledge.leegality.com/document-execution/settings/Department/esignature-settings#configure-certificate-verification-settings)** settings. - **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required regardless of the API value. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `verifyName` | boolean | No | When `true`, the signer's name in the signing certificate must match the name provided. - **Note:** If set as mandatory in the Dashboard workflow, this API value is ignored. | — | | `verifySmartName` | boolean | No | When `true`, returns a percentage similarity score between the certificate name and the provided name. - **Note:** If set as mandatory in the Dashboard workflow, this API value is ignored. | — | | `verifyPincode` | string | No | PIN code to verify against the signer's certificate. Ignored if the certificate does not contain a PIN code. - **Note:** If turned off in the Dashboard workflow, this API value is ignored. | `247667` | | `verifyState` | string | No | State name to verify against the signer's certificate. Ignored if the certificate does not contain a state. - **Note:** If turned off in the Dashboard workflow, this API value is ignored. | `Uttarakhand` | ##### NeslConfig **Dashboard Override:** If a verification field is disabled on the Dashboard, the API value is ignored. If enabled and marked mandatory on the Dashboard, the field becomes required regardless of the API value. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `verifyName` | boolean | No | When `true`, the signer's name in the signing certificate must match the name provided. | — | | `verifySmartName` | boolean | No | When `true`, returns a percentage similarity score between the certificate name and the provided name. | — | | `verifyPincode` | string | No | PIN code to verify against the signer's certificate. Ignored if the certificate does not contain a PIN code. | `247667` | | `verifyYob` | integer | No | Year of birth to verify against the signer's certificate. - **Format:** 4-digit year | `1998` | | `verifyTitle` | string | No | Last 4 digits of the signer's Aadhaar UID to verify against the certificate. | `3870` | | `verifyState` | string | No | State name to verify against the signer's certificate. Ignored if the certificate does not contain a state. | `Uttarakhand` | | `verifyGender` | string | No | Gender to verify against the signer's certificate. Only works for Aadhaar eSign or NESL. - **Allowed:** `M` (Male), `F` (Female), `T` (Transgender) Allowed: `M`, `F`, `T`. | — | #### Cc Carbon Copy recipient who receives a copy of the signed document via email after all signers complete their action. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Full name of the CC recipient. | `Finance Team` | | `email` | string | Yes | Email address of the CC recipient. The recipient will receive a copy of the signed document. - **Format:** Valid email address. | `finance@example.com` | ### Sample Request ```json { "profileId": "7WMVrYf", "file": { "name": "KYC_Application_Form", "file": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlL...", "fields": [ { "id": "field_123", "name": "employeeName", "type": "text", "value": "John Doe", "checked": true, "multiple": false, "width": "200", "height": "150", "required": true } ], "autoGroupedFieldsFill": true, "additionalFiles": [ "JVBERi0xLjQKJeLjz9MKMSAwIG9iago...", "JVBERi0xLjcKJcfsj6UKMzQgMCBvYmo..." ] }, "stampSeries": "string", "multipleStampSeries": [ { "stampSeries": "07", "seriesQuantity": "2" } ], "seriesGroup": "DL02", "stampValue": "5000", "stampUpload": { "state": "Maharashtra", "denomination": "100", "firstPartyName": "ABC Pvt Ltd", "secondPartyName": "XYZ Corporation", "stampSerial": "IN-KA20230012345", "stampFile": "JVBERi0xLjQKJeLjz9MK..." }, "revenueStampSeries": "06", "revenueStampQuantity": "2", "neslData": { "documentDetail": { "loanNumber": "string", "sanctionNumber": "string", "registrationType": "INDIVIDUAL_LOAN", "state": "string", "branchName": "string", "branchAddress": "string", "dateOfSanction": "2018-02-02", "emiAmount": "string", "rateOfInterest": "string", "sanctionAmount": "string", "tenure": "string", "typeOfDebt": "FINANCIAL", "accountClosedFlag": "YES", "fundType": "FUNDED", "sanctionCurrency": "INR", "creditSubtype": "CREDIT_FACILITY", "facilityName": "string", "amountOverdue": "string", "otherChargeAmount": "string", "debtStartDate": "string", "interestAmount": "string", "oldDebtRefNo": "string", "principalOutstanding": "string", "loanRemark": "string", "totalOutstandingAmount": "string", "creditorBusinessUnit": "string", "drawingPower": "string", "daysPastDue": "string", "docRefNo": "string", "expiryDateEbg": "string", "claimExpiryDate": "string", "contractRefNo": "string", "vendorCode": "string", "portalId": "string", "event": "string" }, "stampData": [ { "firstParty": "string", "secondParty": "string", "stampDutyAmount": "string", "considerationPrice": "string", "descriptionOfDocument": "string", "stampDutyPaidBy": "string", "articleCode": "string", "articleSubCode": "string", "firstPartyPin": "string", "secondPartyPin": "string", "firstPartyOVDType": "PAN_CARD", "firstPartyOVDValue": "string", "secondPartyOVDType": "PAN_CARD", "secondPartyOVDValue": "string" } ], "entities": [ { "entityName": "ABC Corporation Pvt Ltd", "entityPan": "ASDCB1234B", "legalConstitution": "RESIDENT_INDIVIDUAL", "dateOfIncorporation": "1992-05-18", "emailId": "abc@company.com", "mobileNumber": "7795719077", "registeredAddress": "Bangalore", "registeredPincode": "560001", "communicationAddress": "Test", "communicationAddressPinCode": "111111", "businessUnitCode": "BU001" } ], "participants": [ { "fullName": "string", "contactPersonName": "string", "contactRelation": "CREDITOR", "emailId": "string", "mobileNumber": "9876543210", "dob": "1990-05-15", "legalConstitution": "RESIDENT_INDIVIDUAL", "alternateEmailId": "string", "alternateMobileNumber": "string", "officialDocType": "PAN_CARD", "officialDocId": "string", "registeredAddress": "string", "registeredPinCode": "string", "designation": "string", "communicationAddress": "string", "communicationAddressPinCode": "string", "cin": "string", "kin": "string", "partyType": "INDIAN_ENTITY", "isIndividual": "YES", "signatoryGender": "MALE", "businessUnit": "string" } ], "neslParties": [ { "fullName": "string", "contactPersonName": "string", "contactRelation": "CREDITOR", "emailId": "string", "mobileNumber": "9876543210", "dob": "1990-05-15", "legalConstitution": "RESIDENT_INDIVIDUAL", "alternateEmailId": "string", "alternateMobileNumber": "string", "officialDocType": "PAN_CARD", "officialDocId": "string", "registeredAddress": "string", "registeredPinCode": "string", "designation": "string", "communicationAddress": "string", "communicationAddressPinCode": "string", "cin": "string", "kin": "string", "partyType": "INDIAN_ENTITY", "isIndividual": "YES", "signatoryGender": "MALE" } ], "neslSecurities": [ { "securityDescription": "string", "assetsType": "MOVABLE", "chargeType": "MORTGAGE", "assetId": "string", "doc": "string", "dov": "string", "cersaiId": "string", "rocChargeId": "string", "securityValue": "string", "abc": "string" } ] }, "invitees": [ { "name": "string", "email": "string", "phone": "string", "groupId": "string", "groupName": "string", "completionThreshold": "string", "organizationName": "string", "defaultLanguageSelect": "ENGLISH", "faceMatchImage": "string", "workflowPaymentCollectionConfig": { "amount": "500" }, "gpsConfig": { "applyLocationRestriction": false, "allowedLatitude": 29.982643, "allowedLongitude": 78.055405, "permissibleRadius": 5000, "applyLocationAccuracy": false, "accuracyThreshold": 10000 }, "aadhaarConfig": { "verifyName": false, "verifySmartName": false, "verifyPincode": "247667", "verifyYob": "1998", "verifyTitle": "3870", "verifyState": "Uttarakhand", "verifyGender": "M" }, "dscConfig": { "verifyName": false, "verifySmartName": false, "verifyPincode": "247667", "verifyState": "Uttarakhand" }, "neslConfig": { "verifyName": false, "verifySmartName": false, "verifyPincode": "247667", "verifyYob": 1998, "verifyTitle": "3870", "verifyState": "Uttarakhand", "verifyGender": "M" } } ], "cc": [ { "name": "Finance Team", "email": "finance@example.com" } ], "irn": "string" } ``` --- ## Responses ### 200 — eSigning request created. Check status in the response body — 1 indicates success, 0 indicates a validation or configuration error. On success, the data object contains documentId, per-invitee signUrl, and expiryDate. Response returned by the Create eSigning Request endpoint. Contains the document ID, invitee signing URLs, and status/message details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | Indicates success (`1`) or failure (`0`). Allowed: `0`, `1`. | — | | `messages` | array\ | No | Array of message objects containing success, error, or warning details. On success, contains `{"code": "simpleWorkFlow.success", "message": "Invitations sent successfully."}`. Also contain warning messages even on success (e.g., when dashboard overrides API values). See **Message** below. | — | | `data` | object | No | Response data containing the document ID and invitee details. Returns an empty object `{}` when `status` is `0` (failure). See **data** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### data Response data containing the document ID and invitee details. Returns an empty object `{}` when `status` is `0` (failure). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | Unique Leegality ID for this eSigning request. | `01KJPV67NZQFX5P2JRTSPSFKYY` | | `irn` | string | No | Internal Reference Number set for this document. | `LOAN-2024-00142` | | `invitees` | array\ | No | Array of invitee objects with their signing URLs and status. Includes all invitees — both from the API request and any auto-added from dashboard configuration. See **Request** below. | — | ##### Request Invitee details returned in the Create eSigning Request response. Contains the signing URL and invitation status for each invitee. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Name of the invitee. | `Abhishek Sharma` | | `email` | string | No | Email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | Mobile number of the invitee. | `9876543210` | | `signUrl` | string | No | Signing URL unique to this invitee and request. | `https://app1.leegality.com/sign/uuid-here` | | `active` | boolean | No | Whether the signing URL is currently active. | — | | `expiryDate` | string | No | Expiry date and time of the signing invite. - **Format:** `DD-MM-YYYY HH:MM:SS` - **Note:** If `null`, the invite expires in 45 minutes. | `2026-03-12T18:29:59Z` | ### Sample Response (200) ```json { "status": 0, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "documentId": "01KJPV67NZQFX5P2JRTSPSFKYY", "irn": "LOAN-2024-00142", "invitees": [ { "name": "Abhishek Sharma", "email": "abhishek@example.com", "phone": "9876543210", "signUrl": "https://app1.leegality.com/sign/uuid-here", "active": false, "expiryDate": "2026-03-12T18:29:59Z" } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/delete-document # DELETE /v3.0/sign/request — Delete document Permanently deletes a document and all associated data. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/v3.0/sign/request?documentId={documentId} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `documentId` | query | Yes | string | Unique identifier of the document to delete. **Format:** Alphanumeric string. Get from the **Create eSigning request** API response or from the dashboard. | — | --- ## Responses ### 200 — Delete response. Check `status` field: `1` = success, `0` = failure. Response wrapper for the Delete Document API. On success (`status: 1`), `data` is an empty object. On failure (`status: 0`), `messages` contains the error details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success (document deleted), `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. **Success codes:** - `document.delete.success` — Document deleted successfully **Error codes:** - `no.document.found` — Document ID does not exist - `document.id.required` — documentId query parameter is missing or empty See **Message** below. | — | | `data` | object | No | Always an empty object `{}` for this endpoint. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": {} } ``` --- URL: https://knowledge.leegality.com/document-execution/api/check-transaction-status # GET /v3.2/sign/request — Check transaction status Returns a lightweight summary of a document's transaction status, including signing state, download URLs, and signer certificate data. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.2/sign/request?documentId={documentId} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.2/sign/request` - Sandbox: `https://sandbox.leegality.com/api/v3.2/sign/request` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `documentId` | query | Yes | string | Unique identifier of the document to check. **Format:** Alphanumeric string (e.g., `01KJCHZ1Z3XRFP04DPT195AJH6`). Get from the **Create eSigning request** API response or from the dashboard. | — | --- ## Responses ### 200 — Transaction status retrieved successfully. Response wrapper for the Transaction Status API. Contains the transaction data, status code, and any messages. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | Indicates API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array on success. See **Message** below. | — | | `data` | TransactionStatusData | No | Transaction status data for a document. Contains the document identifier, signing status of each invitee, download URLs for files and audit trail, and signer certificate data for signed documents. See **TransactionStatusData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### TransactionStatusData Transaction status data for a document. Contains the document identifier, signing status of each invitee, download URLs for files and audit trail, and signer certificate data for signed documents. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | Unique identifier of the document. - **Format:** Alphanumeric string. | `01KJCHZ1Z3XRFP04DPT195AJH6` | | `irn` | string | No | Invitation Reference Number — the unique reference you passed when creating the eSigning request. Returns `null` if no IRN was set during document creation. | `INV-2026-001` | | `folderId` | string | No | Unique identifier of the folder the document belongs to. Returns `null` if the document is not assigned to any folder. | — | | `files` | array\ | No | CDN download URLs for the document PDF(s). Always present in the response, even for unsigned or rejected documents. URLs are time-limited and will expire. | — | | `auditTrail` | string | No | CDN download URL for the audit trail PDF. **Only present when the document has been signed/completed.** For unsigned, rejected, or expired documents, this field is absent from the response. The URL is time-limited and will expire. | `https://sandbox-downloads.leegality.com/export/2026/03/02/a4` | | `requests` | array\ | No | Array of invitee (signer/approver) status objects. Each entry represents one invitee and their current signing status. See **TransactionStatusRequest** below. | — | | `signers` | array\ | No | Certificate data extracted from the digital signature of each signer. **Only present when the document has been signed/completed.** For unsigned, rejected, or expired documents, this field is absent from the response. Contains verified identity information from the signer's Aadhaar certificate. See **TransactionStatusSigner** below. | — | ##### TransactionStatusRequest Signing status of an individual invitee. Uses boolean fields (`signed`, `rejected`, `expired`) to indicate the invitee's current state. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Full name of the invitee. | `Abhishek Sharma` | | `email` | string | No | Email address of the invitee. | `signer@example.com` | | `phone` | string | No | Mobile number of the invitee. - **Format:** 10-digit Indian mobile number. | `9876543210` | | `signUrl` | string | No | Unique signing URL for this invitee. The invitee uses this URL to access the signing page. | `https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-8` | | `signed` | boolean | No | Whether the invitee has signed the document. - `true` — signed - `false` — not yet signed | `true` | | `rejected` | boolean | No | Whether the invitee has rejected the document. - `true` — explicitly rejected by the invitee - `false` — not rejected | `false` | | `expired` | boolean | No | Whether the invitee's signing invitation has expired. - `true` — expired (time-based expiry or verification failure) - `false` — not expired - **Note:** Also set to `true` when certificate verification fails during signing (e.g., Aadhaar details mismatch, DSC details mismatch). | `false` | | `expiryDate` | string | No | Expiry date and time for the signing invitation. - **Format:** `dd-MM-yyyy HH:mm:ss` | `08-03-2026 23:59:59` | | `signType` | string | No | Type of signature used by the invitee. Returns `null` if the invitee has not signed yet. - **Possible values:** `AADHAAR`, `VIRTUAL`, `DSC` Allowed: `AADHAAR`, `VIRTUAL`, `DSC`. | `AADHAAR` | | `active` | boolean | No | Whether it is currently the invitee's turn to act. - `true` — the invitee can currently sign or approve the document | `true` | ##### TransactionStatusSigner Certificate data extracted from a signer's digital signature. Contains verified identity information from the Aadhaar certificate used during signing. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Full name as it appears on the signer's Aadhaar certificate. | `Abhishek Sharma` | | `pincode` | string | No | Pincode from the signer's Aadhaar certificate. - **Format:** 6-digit string. | `247667` | | `state` | string | No | State from the signer's Aadhaar certificate. | `Uttarakhand` | | `title` | string | No | Title/locality code from the signer's Aadhaar certificate. This is typically a numeric code representing the locality. | `3870` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "documentId": "01KJCHZ1Z3XRFP04DPT195AJH6", "irn": "INV-2026-001", "folderId": "string", "files": [ "https://sandbox-downloads.leegality.com/export/2026/03/02/c9845ec1-..." ], "auditTrail": "https://sandbox-downloads.leegality.com/export/2026/03/02/a441a5e8-...", "requests": [ { "name": "Abhishek Sharma", "email": "signer@example.com", "phone": "9876543210", "signUrl": "https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-82c0ff6ce4d8", "signed": true, "rejected": false, "expired": false, "expiryDate": "08-03-2026 23:59:59", "signType": "AADHAAR", "active": true } ], "signers": [ { "name": "Abhishek Sharma", "pincode": "247667", "state": "Uttarakhand", "title": "3870" } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/reactivate-document # POST /v3.0/sign/request/reactivate — Reactivate document Reactivates an expired document by resetting the expiry period, allowing invitees to sign again. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.0/sign/request/reactivate ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request/reactivate` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request/reactivate` --- ## Request Body **Content-Type:** `application/json` Request body for reactivating an expired document. Pass either `expiryDays` or `expiryTime` to set the new expiry period. If neither is provided, the API uses the default expiry from the workflow configuration. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | Yes | Unique identifier of the expired document to reactivate. **Format:** Alphanumeric string. The document must have at least one invitation with `expired: true` status. | `01KJCHYRSQGA24YDZ044BS6MTS` | | `expiryDays` | integer | No | New expiry period as a relative number of days. **Range:** `-1` to `365` \| Value \| Meaning \| \|---\|---\| \| `-1` \| Expires in 45 minutes \| \| `0` \| Expires same day at 11:59 PM \| \| `1` \| Expires next day at 11:59 PM \| \| `2`–`365` \| Expires in N days at 11:59 PM \| Use this for simple relative expiry. For a specific date/time, use `expiryTime` instead. | `5` | | `expiryTime` | integer | No | This is used to define the new timeout time after which an uncompleted transaction get cancelled and reversed. Maximum value can be equal to 365 days. Value in this parameter to be passed as long format of date. | `1773576000000` | ### Sample Request ```json { "documentId": "01KJCHYRSQGA24YDZ044BS6MTS", "expiryDays": 5, "expiryTime": 1773576000000 } ``` --- ## Responses ### 200 — Reactivation response. Check `status` field: `1` = success, `0` = failure. Response wrapper for the Reactivate Document API. On success (`status: 1`), `data` contains the document ID, IRN, and updated invitee statuses. On failure (`status: 0`), `data` is an empty object and `messages` contains the error details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. **Success codes:** - `signinvitation.activate.success` — Invitation activated successfully **Error codes:** - `no.expired.invitation.found` — No expired invitation exists (document is completed, rejected, active, or already reactivated) - `no.document.found` — Document ID does not exist - `invalid.expiry.days.value` — expiryDays is outside the valid range (-1 to 365) - `invalid.expiry.time` — expiryTime is in the past or negative - `invalid.expiry.time.maxerror` — expiryTime exceeds 365 days from now See **Message** below. | — | | `data` | ReactivateData | No | Reactivation result data. On success, contains the document details and updated invitee statuses with the new expiry. On failure, this is an empty object `{}`. See **ReactivateData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### ReactivateData Reactivation result data. On success, contains the document details and updated invitee statuses with the new expiry. On failure, this is an empty object `{}`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | Unique identifier of the reactivated document. | `01KJCHYRSQGA24YDZ044BS6MTS` | | `irn` | string | No | Invitation Reference Number set during document creation. Returns `null` if no IRN was set. | `INV-2026-001` | | `requests` | array\ | No | Array of invitee status objects with updated expiry. After reactivation, `expired` resets to `false` and `expiryDate` reflects the new expiry period. The `signUrl` remains the same as the original invitation. See **TransactionStatusRequest** below. | — | ##### TransactionStatusRequest Signing status of an individual invitee. Uses boolean fields (`signed`, `rejected`, `expired`) to indicate the invitee's current state. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Full name of the invitee. | `Abhishek Sharma` | | `email` | string | No | Email address of the invitee. | `signer@example.com` | | `phone` | string | No | Mobile number of the invitee. - **Format:** 10-digit Indian mobile number. | `9876543210` | | `signUrl` | string | No | Unique signing URL for this invitee. The invitee uses this URL to access the signing page. | `https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-8` | | `signed` | boolean | No | Whether the invitee has signed the document. - `true` — signed - `false` — not yet signed | `true` | | `rejected` | boolean | No | Whether the invitee has rejected the document. - `true` — explicitly rejected by the invitee - `false` — not rejected | `false` | | `expired` | boolean | No | Whether the invitee's signing invitation has expired. - `true` — expired (time-based expiry or verification failure) - `false` — not expired - **Note:** Also set to `true` when certificate verification fails during signing (e.g., Aadhaar details mismatch, DSC details mismatch). | `false` | | `expiryDate` | string | No | Expiry date and time for the signing invitation. - **Format:** `dd-MM-yyyy HH:mm:ss` | `08-03-2026 23:59:59` | | `signType` | string | No | Type of signature used by the invitee. Returns `null` if the invitee has not signed yet. - **Possible values:** `AADHAAR`, `VIRTUAL`, `DSC` Allowed: `AADHAAR`, `VIRTUAL`, `DSC`. | `AADHAAR` | | `active` | boolean | No | Whether it is currently the invitee's turn to act. - `true` — the invitee can currently sign or approve the document | `true` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "documentId": "01KJCHYRSQGA24YDZ044BS6MTS", "irn": "INV-2026-001", "requests": [ { "name": "Abhishek Sharma", "email": "signer@example.com", "phone": "9876543210", "signUrl": "https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-82c0ff6ce4d8", "signed": true, "rejected": false, "expired": false, "expiryDate": "08-03-2026 23:59:59", "signType": "AADHAAR", "active": true } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-documents # GET /v3.0/sign/request/list — List documents Search and list documents from your Leegality account with optional filters. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.0/sign/request/list?q={q}&status={status}&max={max}&offset={offset} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request/list` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request/list` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `q` | query | No | string | Search query to find documents. Searches across: - **Document name** — the PDF filename - **Document ID** — the unique identifier returned by the Create eSigning Request API - **Internal Reference Number (IRN)** — set during document creation Search is **case-insensitive** and matches the **exact full value**. Partial matches are not supported — for example, searching `01KGRZ2F` will not match `01KGRZ2F9YNZ828PYDYE29JYZS`. | — | | `status` | query | No | string | Filter documents by status. | — | | `max` | query | No | integer | Maximum number of documents to return per page. Default: `20`. Maximum: `40`. Values above 40 are silently reset to 20. Use with `offset` for pagination. Example: for page 2 with 10 results per page, use `max=10&offset=10`. | — | | `offset` | query | No | integer | Number of documents to skip before returning results. Default: `0`. Use with `max` for pagination. Example: for page 2 with 10 results per page, use `max=10&offset=10`. | — | --- ## Responses ### 200 — List of documents matching the search criteria. Response wrapper for the List Documents API. On success (`status: 1`), `data` contains the total count and array of matching documents. On failure (`status: 0`), `messages` contains the error details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array on success. **Error codes:** - `typeMismatch` — Invalid value for `status` parameter See **Message** below. | — | | `data` | ListDocumentsData | No | Paginated list of documents matching the search criteria. `total` represents the total number of matching documents across all pages, while `documents` contains only the current page of results. See **ListDocumentsData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### ListDocumentsData Paginated list of documents matching the search criteria. `total` represents the total number of matching documents across all pages, while `documents` contains only the current page of results. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `total` | integer | No | Total number of documents matching the search/filter criteria. Use this with `max` and `offset` to calculate pagination. | `233` | | `documents` | array\ | No | Array of document summary objects for the current page. See **ListDocumentItem** below. | — | ##### ListDocumentItem Summary of a document in the list results. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | Unique identifier of the document. | `01KGRZ2F9YNZ828PYDYE29JYZS` | | `name` | string | No | Name of the document (typically the uploaded PDF filename). | `Loan-Agreement.pdf` | | `irn` | string | No | Internal Reference Number set during document creation. Returns `null` if no IRN was set. | `INV-2026-001` | | `status` | string | No | Current status of the document. Allowed: `DRAFT`, `SENT`, `RECEIVED`, `SIGNED`, `COMPLETED`, `EXPIRED`. | `COMPLETED` | | `folderId` | string | No | Unique identifier of the folder the document belongs to. Returns `null` if not in a folder. | — | | `folderName` | string | No | Name of the folder the document belongs to. Returns `null` if not in a folder. | — | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "total": 233, "documents": [ { "documentId": "01KGRZ2F9YNZ828PYDYE29JYZS", "name": "Loan-Agreement.pdf", "irn": "INV-2026-001", "status": "COMPLETED", "folderId": "string", "folderName": "string" } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/check-document-details # GET /v3.3/document/details — Check document details Returns in-depth details about a document. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.3/document/details?documentId={documentId}&file={file}&auditTrail={auditTrail}&document_scheduledDeletionDate={document_scheduledDeletionDate}&document_customMessage={document_customMessage}&document_deleteOnComplete={document_deleteOnComplete}&document_requestSigningOrder={document_requestSigningOrder}&document_requireSigningOrder={document_requireSigningOrder}&sftp={sftp}&workflow={workflow}&workflow_name={workflow_name}&workflow_type={workflow_type}&workflow_subType={workflow_subType}&template={template}&template_name={template_name}&account={account}&account_name={account_name}&account_label={account_label}&account_brandName={account_brandName}&sender={sender}&sender_name={sender_name}&folder={folder}&folder_name={folder_name}&stampDetails={stampDetails}&stampDetails_groupName={stampDetails_groupName}&stampDetails_groupNumber={stampDetails_groupNumber}&stampDetails_maximumValuePermitted={stampDetails_maximumValuePermitted}&stampDetails_stamps={stampDetails_stamps}&stampDetails_stamps_associatedDocumentId={stampDetails_stamps_associatedDocumentId}&stampDetails_stamps_multipleStampSeries={stampDetails_stamps_multipleStampSeries}&referenceAttachments={referenceAttachments}&neslDocumentDetails={neslDocumentDetails}&neslDocumentDetails_responseCode={neslDocumentDetails_responseCode}&neslDocumentDetails_responseMessage={neslDocumentDetails_responseMessage}&neslDocumentDetails_isRetryAllowed={neslDocumentDetails_isRetryAllowed}&neslDocumentDetails_loanDetails_event={neslDocumentDetails_loanDetails_event}&neslDocumentDetails_loanDetails_expiryDate={neslDocumentDetails_loanDetails_expiryDate}&neslDocumentDetails_loanDetails_claimExpiryDate={neslDocumentDetails_loanDetails_claimExpiryDate}&neslDocumentDetails_loanDetails_currencyOfDebt={neslDocumentDetails_loanDetails_currencyOfDebt}&neslDocumentDetails_loanDetails_docRefNo={neslDocumentDetails_loanDetails_docRefNo}&neslDocumentDetails_loanDetails_contractRefNo={neslDocumentDetails_loanDetails_contractRefNo}&neslDocumentDetails_loanDetails_vendorCode={neslDocumentDetails_loanDetails_vendorCode}&neslDocumentDetails_loanDetails_portalID={neslDocumentDetails_loanDetails_portalID}&neslDocumentDetails_securityDetails={neslDocumentDetails_securityDetails}&neslDocumentDetails_partyDetails={neslDocumentDetails_partyDetails}&neslDocumentDetails_stampDetails={neslDocumentDetails_stampDetails}&neslDocumentDetails_neslEstampStatusDetails={neslDocumentDetails_neslEstampStatusDetails}&refreshNeslDocument={refreshNeslDocument}&cc={cc}&coordinatePicker={coordinatePicker}&invitations_inviteeConfigs={invitations_inviteeConfigs}&invitations_inviteeConfigs_retry={invitations_inviteeConfigs_retry}&invitations_inviteeConfigs_fixedName={invitations_inviteeConfigs_fixedName}&invitations_inviteeConfigs_noName={invitations_inviteeConfigs_noName}&invitations_inviteeConfigs_supportingDocument={invitations_inviteeConfigs_supportingDocument}&invitations_inviteeConfigs_viewSupportingDocument={invitations_inviteeConfigs_viewSupportingDocument}&invitations_inviteeConfigs_organizationConfig={invitations_inviteeConfigs_organizationConfig}&invitations_inviteeConfigs_security={invitations_inviteeConfigs_security}&invitations_inviteeConfigs_security_gpsConfig={invitations_inviteeConfigs_security_gpsConfig}&invitations_inviteeConfigs_security_faceMatch={invitations_inviteeConfigs_security_faceMatch}&invitations_inviteeConfigs_security_smartUserLiveliness={invitations_inviteeConfigs_security_smartUserLiveliness}&invitations_inviteeConfigs_eSignPriorityConfig={invitations_inviteeConfigs_eSignPriorityConfig}&invitations_inviteeConfigs_eSignPriorityConfig_orderLevelRetryCount={invitations_inviteeConfigs_eSignPriorityConfig_orderLevelRetryCount}&invitations_inviteeConfigs_customURL={invitations_inviteeConfigs_customURL}&invitations_inviteeConfigs_customConsent={invitations_inviteeConfigs_customConsent}&invitations_inviteeConfigs_enableRejectDocument={invitations_inviteeConfigs_enableRejectDocument}&invitations_inviteeConfigs_enableRejectMessage={invitations_inviteeConfigs_enableRejectMessage}&invitations_inviteeConfigs_languageDetails={invitations_inviteeConfigs_languageDetails}&invitations_inviteeConfigs_paymentDetails={invitations_inviteeConfigs_paymentDetails}&invitations_inviteeConfigs_maskContactDetails={invitations_inviteeConfigs_maskContactDetails}&invitations_recordReviewerDetails={invitations_recordReviewerDetails}&invitations_inviteeGroup={invitations_inviteeGroup}&invitations_inviteeGroup_name={invitations_inviteeGroup_name}&invitations_inviteeGroup_completionThreshold={invitations_inviteeGroup_completionThreshold}&invitations_inviteeGroup_size={invitations_inviteeGroup_size}&invitations_inviteeGroup_completed={invitations_inviteeGroup_completed}&invitations_signatureOptions={invitations_signatureOptions}&invitations_signatureOptions_quickSign={invitations_signatureOptions_quickSign}&invitations_signatureOptions_visualSign={invitations_signatureOptions_visualSign}&invitations_signatureOptionsUsed={invitations_signatureOptionsUsed}&invitations_neslInvitationDetails={invitations_neslInvitationDetails}&invitations_neslInvitationDetails_participantDetails={invitations_neslInvitationDetails_participantDetails}&invitations_neslInvitationDetails_participantDetails_isIndividual={invitations_neslInvitationDetails_participantDetails_isIndividual}&invitations_neslInvitationDetails_participantDetails_signatoryGender={invitations_neslInvitationDetails_participantDetails_signatoryGender}&invitations_neslInvitationDetails_participantDetails_businessUnit={invitations_neslInvitationDetails_participantDetails_businessUnit}&invitations_invitationStatus_failureReason={invitations_invitationStatus_failureReason}&invitations_invitationStatus_rejectionMessage={invitations_invitationStatus_rejectionMessage}&invitations_invitationStatus_signRejectionMessage={invitations_invitationStatus_signRejectionMessage}&invitations_certificateData={invitations_certificateData}&invitations_certificateData_photoHash={invitations_certificateData_photoHash}&invitations_certificateData_uid={invitations_certificateData_uid}&invitations_certificateData_serialNumber={invitations_certificateData_serialNumber}&invitations_verificationRequest={invitations_verificationRequest}&invitations_verificationResponse={invitations_verificationResponse}&invitations_verificationResponse_smartNameAI={invitations_verificationResponse_smartNameAI}&invitations_verificationResponse_faceMatch={invitations_verificationResponse_faceMatch}&invitations_verificationResponse_smartUserLiveliness={invitations_verificationResponse_smartUserLiveliness}&invitations_verificationResponse_neslVerficationResponse={invitations_verificationResponse_neslVerficationResponse}&invitations_supportingDocuments={invitations_supportingDocuments}&invitations_requiresApproverOtp={invitations_requiresApproverOtp}&invitations_signatureSubOptionUsed={invitations_signatureSubOptionUsed} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/document/details` - Sandbox: `https://sandbox.leegality.com/api/v3.3/document/details` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `documentId` | query | Yes | string | Unique document ID generated by Leegality. Get from the Create eSigning Request API response or from the dashboard. - **Format:** Alphanumeric string | — | | `file` | query | No | boolean | Pass `true` to receive the signed PDF file as a CDN URL in the response. - **Validity:** CDN URL expires in **15 seconds** — download immediately at server level, not for browser preview. | — | | `auditTrail` | query | No | boolean | Pass `true` to receive the Audit Trail PDF as a CDN URL in the response. Only applicable to completed documents (all signatories have signed). - **Validity:** CDN URL expires in **15 seconds** — download immediately at server level, not for browser preview. - Audit trail for a deleted document can also be fetched. | — | | `document_scheduledDeletionDate` | query | No | boolean | Pass `true` to receive the scheduled document deletion date and time. Applicable when the "Auto delete on complete" is enabled in the **[Department > Document Security](https://knowledge.leegality.com/document-execution/settings/Department/document-security-settings)** setting or while sending the document. | — | | `document_customMessage` | query | No | boolean | Pass `true` to receive the custom message configured on the invitation email. | — | | `document_deleteOnComplete` | query | No | boolean | Pass `true` to receive whether auto-delete on complete was enabled for the document. | — | | `document_requestSigningOrder` | query | No | boolean | Pass `true` to receive whether signing links are activated sequentially. | — | | `document_requireSigningOrder` | query | No | boolean | Pass `true` to receive whether signing order was required for the document. | — | | `sftp` | query | No | boolean | Pass `true` to receive whether SFTP was enabled for the document, and the SFTP server ID configured to receive the completed document and audit trail. | — | | `workflow` | query | No | boolean | Pass `true` to receive workflow ID associated with the document. | — | | `workflow_name` | query | No | boolean | Pass `true` to receive the workflow name. > **Note:** Requires `workflow=true`. | — | | `workflow_type` | query | No | boolean | Pass `true` to receive the workflow type (PDF or Template). > **Note:** Requires `workflow=true`. | — | | `workflow_subType` | query | No | boolean | Pass `true` to receive the workflow sub-type (Single PDF/template or Multiple PDF enabled). > **Note:** Requires `workflow=true`. | — | | `template` | query | No | boolean | Pass `true` to receive template ID associated with the document. | — | | `template_name` | query | No | boolean | Pass `true` to receive the template name used for the document. > **Note:** Requires `template=true`. | — | | `account` | query | No | boolean | Pass `true` to receive account ID associated with the document. | — | | `account_name` | query | No | boolean | Pass `true` to receive the organisation's name. > **Note:** Requires `account=true`. | — | | `account_label` | query | No | boolean | Pass `true` to receive the department name configured in **Settings > Admin > Department**. > **Note:** Requires `account=true`. | — | | `account_brandName` | query | No | boolean | Pass `true` to receive the brand name configured in **Settings > Department > Branding**. > **Note:** Requires `account=true`. | — | | `sender` | query | No | boolean | Pass `true` to receive sender's email address associated with the document. | — | | `sender_name` | query | No | boolean | Pass `true` to receive the sender's name. > **Note:** Requires `sender=true`. | — | | `folder` | query | No | boolean | Pass `true` to receive folder ID associated with the document. | — | | `folder_name` | query | No | boolean | Pass `true` to receive the folder name(s) for the document. > **Note:** Requires `folder=true`. | — | | `stampDetails` | query | No | boolean | Pass `true` to receive stamp paper state and value attached to the document. | — | | `stampDetails_groupName` | query | No | boolean | Pass `true` to receive the group name for the stamp papers attached. Stamp groups are a collection of stamp series for a single state. > **Note:** Requires `stampDetails=true`. | — | | `stampDetails_groupNumber` | query | No | boolean | Pass `true` to receive the group number for the stamp papers attached. > **Note:** Requires `stampDetails=true`. | — | | `stampDetails_maximumValuePermitted` | query | No | boolean | Pass `true` to receive the maximum permitted stamp value configured in the stamp group. Any stamp value above this limit passed in the Create API will be rejected. > **Note:** Requires `stampDetails=true`. | — | | `stampDetails_stamps` | query | No | boolean | Pass `true` to receive an array containing stamp paper details - stamp series number, stamp amount and stamp serial number - for each stamp associated with the document. > **Note:** Requires `stampDetails=true`. | — | | `stampDetails_stamps_associatedDocumentId` | query | No | boolean | Pass `true` to receive the associated document ID physically printed on the stamp paper. > **Note:** Requires `stampDetails_stamps=true`. | — | | `stampDetails_stamps_multipleStampSeries` | query | No | boolean | Pass `true` to receive whether Multiple Stamp Series was used. > **Note:** Requires `stampDetails_stamps=true`. | — | | `referenceAttachments` | query | No | boolean | Pass `true` to receive the array containing reference attachments details - file, name, and type - for each reference attachment sent with the document. These are files uploaded by the document owner while sending the document. | — | | `neslDocumentDetails` | query | No | boolean | Pass `true` to include NeSL transaction details in the response. Only relevant when the document has a NeSL-type signer. | — | | `neslDocumentDetails_responseCode` | query | No | boolean | Pass `true` to receive the response code sent by NeSL. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_responseMessage` | query | No | boolean | Pass `true` to receive the response message associated with the NeSL response code. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_isRetryAllowed` | query | No | boolean | Pass `true` to receive whether retrying is allowed for this NeSL document. Retry is only allowed when the NeSL invitation has failed due to errors other than validation errors. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_loanDetails_event` | query | No | boolean | Pass `true` to receive the selected eBG event for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_expiryDate` | query | No | boolean | Pass `true` to receive the specified expiry date of the eBG for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_claimExpiryDate` | query | No | boolean | Pass `true` to receive the specified claim expiry date of the eBG for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_currencyOfDebt` | query | No | boolean | Pass `true` to receive the specified currency of debt for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_docRefNo` | query | No | boolean | Pass `true` to receive the document reference number for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_contractRefNo` | query | No | boolean | Pass `true` to receive the contract reference number for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_vendorCode` | query | No | boolean | Pass `true` to receive the Vendor Code for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_loanDetails_portalID` | query | No | boolean | Pass `true` to receive the Portal ID for this request. > **Note:** Requires `neslDocumentDetails=true` and `neslDocumentDetails_loanDetails=true`. | — | | `neslDocumentDetails_securityDetails` | query | No | boolean | Pass `true` to receive NeSL security details for the document. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_partyDetails` | query | No | boolean | Pass `true` to receive NeSL party details for the document. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_stampDetails` | query | No | boolean | Pass `true` to receive NeSL stamp details for the document. > **Note:** Requires `neslDocumentDetails=true`. | — | | `neslDocumentDetails_neslEstampStatusDetails` | query | No | boolean | Pass this parameter as `TRUE` to receive the NeSL stamp status and certificate details. **Note:** "neslDocumentDetails" parameter also needs to be passed as true to receive this in response. | — | | `refreshNeslDocument` | query | No | boolean | Pass `true` to get the latest status, certificate details, and document from NeSL in the response. **Note:** If the document is stamped but not yet signed, NeSL might not provide the stamped file by default. In such cases, clients may need to enable this setting with NeSL for retrieval of the stamped document. **Combined limit:** Each document allows a maximum of 50 calls across this parameter and the dashboard's **Refresh** and **Retry** actions. Once exhausted, further requests with `refreshNeslDocument=true` for that document will return without refreshed data. | — | | `cc` | query | No | boolean | Pass `true` to receive an array containing details - name, email, notification types, and more configured for a CC invitees in the document. | — | | `coordinatePicker` | query | No | boolean | Pass `true` to receive the coordinate picker URL and webhook configured in this document. | — | | `invitations_inviteeConfigs` | query | No | boolean | Pass `true` to receive invitee-level configurations associated with each invitation. | — | | `invitations_inviteeConfigs_retry` | query | No | boolean | Pass `true` to receive the number of retry attempts configured for the signer. Only applicable to Aadhaar eSign. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_fixedName` | query | No | boolean | Pass `true` to receive whether the invitee is allowed to edit their name during the signing journey. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_noName` | query | No | boolean | Pass `true` to receive whether the invitee name will appear in the signature appearance. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_supportingDocument` | query | No | boolean | Pass `true` to receive the supporting document requirement configured for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_viewSupportingDocument` | query | No | boolean | Pass `true` to receive the view supporting document configuration for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_organizationConfig` | query | No | boolean | Pass `true` to receive the organization seal settings configured for this invitation. The organization name appears in the signature box, and the chosen seal forms a digital rubber stamp around it. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_security` | query | No | boolean | Pass `true` to receive the status of all security modules configured for each invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_security_gpsConfig` | query | No | boolean | Pass `true` to receive the GPS configuration for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true` and `invitations_inviteeConfigs_security=true`. | — | | `invitations_inviteeConfigs_security_faceMatch` | query | No | boolean | Pass `true` to receive the Face Match security module configuration for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true` and `invitations_inviteeConfigs_security=true`. | — | | `invitations_inviteeConfigs_security_smartUserLiveliness` | query | No | boolean | Pass `true` to receive the Smart User Liveliness configuration for the invitee. This only reflects the configuration at the time the invitation was created or edited, and does not capture any admin-level changes. > **Note:** Requires `invitations_inviteeConfigs=true` and `invitations_inviteeConfigs_security=true`. | — | | `invitations_inviteeConfigs_eSignPriorityConfig` | query | No | boolean | Pass `true` to receive the eSign priority configuration for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_eSignPriorityConfig_orderLevelRetryCount` | query | No | boolean | Pass `true` to receive the order-level retry count configured for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true` and `invitations_inviteeConfigs_eSignPriorityConfig=true`. | — | | `invitations_inviteeConfigs_customURL` | query | No | boolean | Pass `true` to receive the custom URL configuration for each invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_customConsent` | query | No | boolean | Pass `true` to receive the custom consent content configured for the invitee. Custom consent is an additional configurable consent the signer must accept before proceeding to sign. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_enableRejectDocument` | query | No | boolean | Pass `true` to receive whether the signer is allowed to reject the invitation during the signing journey. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_enableRejectMessage` | query | No | boolean | Pass `true` to receive whether the signer is required to provide a message when rejecting the invitation. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_languageDetails` | query | No | boolean | Pass `true` to receive the language configuration details for the signer. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_paymentDetails` | query | No | boolean | Pass `true` to receive the payment collection details configured for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_inviteeConfigs_maskContactDetails` | query | No | boolean | Pass `true` to receive whether Contact Details Masking is enabled for the invitee. > **Note:** Requires `invitations_inviteeConfigs=true`. | — | | `invitations_recordReviewerDetails` | query | No | boolean | Pass `true` to receive whether "Record reviewer details" is activated for each invitee in the audit trail. **Note:** This parameter works independently — no parent parameter is required. | — | | `invitations_inviteeGroup` | query | No | boolean | Pass `true` to receive invitee group details. An invitee group is a single invite consisting of multiple signers where a configurable subset (e.g. 2 out of 5) must sign for the invite to be considered complete. | — | | `invitations_inviteeGroup_name` | query | No | boolean | Pass `true` to receive the invitee group name. > **Note:** Requires `invitations_inviteeGroup=true`. | — | | `invitations_inviteeGroup_completionThreshold` | query | No | boolean | Pass `true` to receive the group completion threshold — the number of signatures required in the group invite for it to be considered complete. > **Note:** Requires `invitations_inviteeGroup=true`. | — | | `invitations_inviteeGroup_size` | query | No | boolean | Pass `true` to receive the total number of invitees in the group invite. > **Note:** Requires `invitations_inviteeGroup=true`. | — | | `invitations_inviteeGroup_completed` | query | No | boolean | Pass `true` to receive whether the group signing has been completed. > **Note:** Requires `invitations_inviteeGroup=true`. | — | | `invitations_signatureOptions` | query | No | boolean | Pass `true` to receive the signature options allowed for each invitee. | — | | `invitations_signatureOptions_quickSign` | query | No | boolean | Pass `true` to receive the signature options allowed for Quick Sign. > **Note:** Requires `invitations_signatureOptions=true`. | — | | `invitations_signatureOptions_visualSign` | query | No | boolean | Pass `true` to receive the signature options allowed for Visual Sign. > **Note:** Requires `invitations_signatureOptions=true`. | — | | `invitations_signatureOptionsUsed` | query | No | boolean | Pass `true` to receive the specific signature sub-type used by the invitee during signing. | — | | `invitations_neslInvitationDetails` | query | No | boolean | Pass `true` to receive NeSL invitation details for each invitee. | — | | `invitations_neslInvitationDetails_participantDetails` | query | No | boolean | Pass `true` to receive the participant details of the NeSL invitation. > **Note:** Requires `invitations_neslInvitationDetails=true`. | — | | `invitations_neslInvitationDetails_participantDetails_isIndividual` | query | No | boolean | Pass `true` to receive whether the NeSL participant is an individual. > **Note:** Requires `invitations_neslInvitationDetails_participantDetails=true`. | — | | `invitations_neslInvitationDetails_participantDetails_signatoryGender` | query | No | boolean | Pass `true` to receive the NeSL signatory's gender. > **Note:** Requires `invitations_neslInvitationDetails_participantDetails=true`. | — | | `invitations_neslInvitationDetails_participantDetails_businessUnit` | query | No | boolean | Pass `true` to receive the NeSL participant's business unit. > **Note:** Requires `invitations_neslInvitationDetails_participantDetails=true`. | — | | `invitations_invitationStatus_failureReason` | query | No | boolean | Pass `true` to receive the failure or status reason for the invitation. | — | | `invitations_invitationStatus_rejectionMessage` | query | No | boolean | Pass `true` to receive the reason provided by the approver for rejecting the invitation. | — | | `invitations_invitationStatus_signRejectionMessage` | query | No | boolean | Pass `true` to receive the reason provided by the signer for rejecting the invitation. | — | | `invitations_certificateData` | query | No | boolean | Pass `true` to receive the signing certificate data (excluding photoHash, uid, and serialNumber, which require their own sub-parameters). | — | | `invitations_certificateData_photoHash` | query | No | boolean | Pass `true` to receive the photoHash from the signing certificate. > **Note:** Requires `invitations_certificateData=true`. | — | | `invitations_certificateData_uid` | query | No | boolean | Pass `true` to receive the UID from the signing certificate. > **Note:** Requires `invitations_certificateData=true`. | — | | `invitations_certificateData_serialNumber` | query | No | boolean | Pass `true` to receive the serial number from the signing certificate. > **Note:** Requires `invitations_certificateData=true`. | — | | `invitations_verificationRequest` | query | No | boolean | Pass `true` to receive the verification configuration for each invitee — which certificate parameters have been activated for verification. Only applicable to Aadhaar eSign, Offline Sign (Cloud DSC), DSC, and NeSL. | — | | `invitations_verificationResponse` | query | No | boolean | Pass `true` to receive the results of certificate verification — the actual match outcomes of the configured input values against the signer's certificate data. | — | | `invitations_verificationResponse_smartNameAI` | query | No | boolean | Pass `true` to receive whether Smart Name AI was enabled during verification. > **Note:** Requires `invitations_verificationResponse=true`. | — | | `invitations_verificationResponse_faceMatch` | query | No | boolean | Pass `true` to receive the Face Match verification results for the invitee. > **Note:** Requires `invitations_verificationResponse=true`. | — | | `invitations_verificationResponse_smartUserLiveliness` | query | No | boolean | Pass `true` to receive Smart User Liveliness verification results. > **Note:** Requires `invitations_verificationResponse=true`. | — | | `invitations_verificationResponse_neslVerficationResponse` | query | No | boolean | Pass `true` to receive the NeSL invitee's verification results (Name, Gender, and Year of Birth). > **Note:** Requires `invitations_verificationResponse=true`. | — | | `invitations_supportingDocuments` | query | No | boolean | Pass `true` to receive the supporting documents requested from the signer. | — | | `invitations_requiresApproverOtp` | query | No | boolean | Pass `true` to receive whether the non-OTP approver flow is activated for the invitee. | — | | `invitations_signatureSubOptionUsed` | query | No | boolean | Pass `true` to receive the Signature subtype used by the invitee to sign the document. | — | --- ## Responses ### 200 — Response Data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | - `1` — success - `0` — failure | — | | `messages` | array\ | No | See **Message** below. | — | | `data` | object | No | See **data** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `file` | string | No | CDN URL of the signed document PDF. Valid for only **15 seconds** — intended for server-level download only. Returns `null` if the `file` parameter is not `true` in the API call. **Download method:** `curl -output ` | — | | `auditTrail` | string | No | CDN URL of the audit trail PDF. Valid for only **15 seconds** — intended for server-level download only. Returns `null` if the document is not completed or if the `auditTrail` parameter is not enabled in the API call. **Download method:** `curl -output ` | — | | `document` | DocumentDetails3_1ResponseObject | No | See **DocumentDetails3_1ResponseObject** below. | — | | `sftp` | SftpDetails3_1ResponseObject | No | See **SftpDetails3_1ResponseObject** below. | — | | `workflow` | WorkflowDetails3_1ResponseObject | No | See **WorkflowDetails3_1ResponseObject** below. | — | | `template` | TemplateDetails3_1ResponseObject | No | See **TemplateDetails3_1ResponseObject** below. | — | | `account` | AccountDetails3_1ResponseObject | No | See **AccountDetails3_1ResponseObject** below. | — | | `sender` | SenderDetails3_1ResponseObject | No | See **SenderDetails3_1ResponseObject** below. | — | | `folders` | array\ | No | Array containing the full hierarchy of folders. The last child folder appears as the first element of the array, with parent folders following. See **FolderArrayResponseObject** below. | — | | `stampDetails` | StampDetails3_1ResponseObject | No | See **StampDetails3_1ResponseObject** below. | — | | `referenceAttachments` | array\ | No | Array of reference attachments uploaded by the sender of the document, visible to invitees during the signing journey. See **AttachmentsArrayResponseObjectWithURL** below. | — | | `neslDocumentDetails` | NeslDetails3_1ResponseObject | No | See **NeslDetails3_1ResponseObject** below. | — | | `cc` | array\ | No | See **CCArrayResponseObject** below. | — | | `coordinatePicker` | CoordinatePickerDetails3_1ResponseObject | No | See **CoordinatePickerDetails3_1ResponseObject** below. | — | | `invitations` | array\ | No | Array containing details of all invitees (signers, reviewers, coordinate pickers) associated with this document. See **InvitationsArray3_1ResponseObject** below. | — | ##### DocumentDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique Document ID generated by Leegality for every document. | — | | `name` | string | No | Document name as configured during creation. | — | | `irn` | string | No | Internal Reference Number (IRN) assigned to the document during creation. | — | | `status` | string | No | Current status of the document. - `DRAFT` — Document created but not yet sent for signing - `SENT` — Document sent for signing, signing in progress - `COMPLETED` — All required signers have signed the document | — | | `coordinatePicker` | boolean | No | Indicates whether coordinate picker is enabled for this document. | — | | `deleted` | boolean | No | Indicates whether the document has been deleted. `true` if deleted, `false` otherwise. | — | | `creationDate` | string | No | Document creation date. - **Format:** `DD-MM-YYYY HH:MM:SS` | — | | `completionDate` | string | No | Document completion date — when all signers have completed their signatures. - **Format:** `DD-MM-YYYY HH:MM:SS` | — | | `scheduledDeletionDate` | string | No | Scheduled deletion date for the document. - **Format:** `DD-MM-YYYY HH:MM:SS` Once completed, calculated as `completionDate + retention period` configured in the "Auto Delete on Complete" settings. | — | | `customMessage` | string | No | Custom message configured for the invitation email sent to signers. Returns `null` if no custom message was configured. | — | | `deleteOnComplete` | boolean | No | Indicates whether the document is set for automatic deletion after completion. - `true` — deletion enabled - `false` — deletion not enabled | — | | `requestSigningOrder` | boolean | No | Indicates whether the signature links are activated sequentially. - `true` — sequential signing enabled; next signer receives link only after previous signer has signed - `false` — sequential signing disabled | — | | `requireSigningOrder` | boolean | No | Indicates whether signing order is strictly required. - `true` — signing order required - `false` — signing order not required | — | ##### SftpDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `sftpEnabled` | boolean | No | Indicates whether SFTP was enabled for this document. - `true` — SFTP was configured - `false` — SFTP was not configured | — | | `profileId` | string | No | SFTP Profile ID of the server where the completed document and audit trail will be sent. Returns `null` if SFTP is not configured. | — | ##### WorkflowDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique Workflow ID through which the document was created. | — | | `name` | string | No | Workflow name for the corresponding Workflow ID. | — | | `type` | string | No | Workflow type. - `Pdf` — PDF-based workflow - `Template` - Template-based workflow | — | | `subtype` | string | No | Workflow sub-type. - `Single PDF` — No additional PDFs are appended to the template - `Multiple PDF` — Additional PDFs are appended to the template - `null` — Workflow not used to send this document | — | ##### TemplateDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique Template ID. Returns `null` if no template was used. This response may be sent in case of a deleted document, subject to availability. | — | | `name` | string | No | Template name for the corresponding Template ID. | — | ##### AccountDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique Account ID generated by Leegality. This response may be sent in case of a deleted document, subject to availability. | — | | `name` | string | No | Organisation name configured. | — | | `label` | string | No | Department name configured in the Leegality dashboard. | — | | `brandName` | string | No | Brand name configured in the Leegality dashboard. | — | ##### SenderDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Name of the user who sent/created the document. | — | | `username` | string | No | Username (email or phone number) of the sender. | — | ##### FolderArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique Folder ID. Returns `null` if the document is not saved in any folder. | — | | `name` | string | No | Folder name. Returns `null` if the document is not saved in any folder. | — | ##### StampDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `groupName` | string | No | Name of the stamp group from which the stamp paper was procured. | — | | `groupNumber` | string | No | Number of the stamp group. | — | | `stampValue` | string | No | Total Stamp value (denomination) attached to this document, as a numeric string. | — | | `maximumValuePermitted` | string | No | Maximum stamp value permitted for this stamp group, as a numeric string. | — | | `state` | string | No | Indian state associated with the stamp group (e.g., Delhi, Maharashtra, Karnataka). | — | | `stamps` | array\ | No | See **StampArray3_1ResponseObject** below. | — | | `multipleStampSeriesUsed` | boolean | No | Indicates whether multiple stamp series were used for this document. `true` if multiple series were used, `false` otherwise. | — | ###### StampArray3_1ResponseObject Array of stamps containing details of each stamp attached to the document. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `series` | string | No | Stamp series number | `03` | | `amount` | string | No | Denomination/value of the stamp paper attached to the document. - **Format:** Numeric string (e.g., `"53.0"`) | — | | `serialNumber` | string | No | Serial number affixed on the stamp paper by the issuing authority. | — | | `associatedDocumentId` | string | No | Document ID physically printed on the stamp paper. This links the stamp paper to the document. | — | ##### AttachmentsArrayResponseObjectWithURL | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `file` | string | No | CDN URL for the reference attachment file. Valid for only **15 seconds**. Use this URL for downloading at the server level only, not for previewing in the host application. **Download method:** `curl -output ` | — | | `name` | string | No | Name of the reference attachment file. | — | | `type` | string | No | MIME type of the reference attachment file. **Possible values:** `application/pdf`, `image/png`, `image/jpg`, `image/jpeg` | — | ##### NeslDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `transactionId` | string | No | Transaction ID received during NESL transaction. | — | | `responseCode` | string | No | Response Code sent by NeSL. | — | | `responseMessage` | string | No | Response message for the code received. | — | | `isRetryAllowed` | string | No | Indicates whether retry is allowed for this NeSL document. - `true` — retry is allowed; call the Retry NeSL API - `false` — retry is not allowed | — | | `loanDetails` | NeslLoanDetails3_1ResponseObject | No | See **NeslLoanDetails3_1ResponseObject** below. | — | | `securityDetails` | array\ | No | See **NeslSecurityDetails3_1ResponseObject** below. | — | | `stampDetails` | NeslStampDetails3_1ResponseObject | No | See **NeslStampDetails3_1ResponseObject** below. | — | | `partyDetails` | NeslPartyDetails3_1ResponseObject | No | See **NeslPartyDetails3_1ResponseObject** below. | — | | `neslEstampStatus` | string | No | - `SUCCESS` — Stamping is completed at NeSL - `PENDING` — Stamping is not yet completed at NeSL | — | | `neslEstampCertificates` | array\ | No | A list of the Stamp ID(s) that have been stamped by NeSL. | — | ###### NeslLoanDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `loanNumber` | string | No | The loan number associated with the debt. | — | | `sanctionNumber` | string | No | The sanction number associated with the debt. | — | | `registrationType` | string | No | Type of debt (Individual Loan or Non-Individual Loan). | — | | `state` | string | No | The state in which stamp duty is being paid. | — | | `branchName` | string | No | The name of the branch granting the loan. | — | | `branchAddress` | string | No | The address of the branch granting the loan. | — | | `dateOfSanction` | string | No | The date on which the loan was sanctioned as per the lender's CBS. | — | | `emiAmount` | string | No | Interest installment amount payable on the loan. | — | | `rateOfInterest` | string | No | Rate of Interest on the loan. | — | | `sanctionAmount` | string | No | The amount sanctioned by the financial creditor. | — | | `tenure` | string | No | The tenure of the loan. | — | | `typeOfDebt` | string | No | The type of loan (financial debt or operational debt). | — | | `accountClosedFlag` | string | No | Whether the account is closed (yes, no, or assigned debt). | — | | `fundType` | string | No | Whether the credit facility is funded or non funded. | — | | `sanctionCurrency` | string | No | The currency in which the loan is denominated (INR or USD). | — | | `creditSubtype` | string | No | Whether the financial debt is created pursuant to a credit facility or the purchase of a property. | — | | `facilityName` | string | No | The name of the loan facility. | — | | `amountOverdue` | string | No | The amount overdue on the loan. | — | | `otherChargeAmount` | string | No | Any other charges (if applicable). | — | | `debtStartDate` | string | No | The date on which the financial debt started. | — | | `interestAmount` | string | No | The amount of interest. | — | | `oldDebtRefNo` | string | No | The old debt reference number (applicable in case there is a change in the debt reference number). | — | | `principalOutstanding` | string | No | The outstanding principal amount. | — | | `loanRemark` | string | No | Loan remarks (if any). | — | | `totalOutstandingAmount` | string | No | Total outstanding amount. | — | | `creditorBusinessUnit` | string | No | The business unit of the creditor providing the debt (such as SME, Retail etc). | — | | `drawingPower` | string | No | The drawing power of the loan. | — | | `daysPastDue` | string | No | The number of days past due date. | — | | `event` | string | No | The type of eBG event. **Note:** Valid values for eBG document creation: `INVOCATION`, `AMENDMENT`, `CANCELLATION`, `RENEWAL`, `CLOSURE`, `PARTIAL_INVOCATION`. `EXTEND_OR_PAY` is not valid for document creation but may be received as a notification event type. Allowed: `INVOCATION`, `AMENDMENT`, `CANCELLATION`, `RENEWAL`, `CLOSURE`, `PARTIAL_INVOCATION`. | — | | `expiryDate` | string | No | The expiry date of eBG | — | | `claimExpiryDate` | string | No | The claim expiry date of eBG | — | | `currencyOfDebt` | string | No | The currency of the debt | — | ###### NeslSecurityDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `securityDescription` | string | No | Description of security. | — | | `assetsType` | string | No | Type of asset forming security (Movable, Immovable, Intangible, Not Classified). | — | | `chargeType` | string | No | Type of charge created (Mortgage, Hypothecation, Charge, Assignment, Pledge, Lien, Negative Lien, Guarantee, Others, Not Classified). | — | | `assetId` | string | No | Asset ID of the Security (used internally by the lender). | — | | `doc` | string | No | Date of creation of security. | — | | `dov` | string | No | Date of valuation of security. | — | | `cersaiId` | string | No | CERSAI ID of security created. | — | | `rocChargeId` | string | No | ROC ID for security created. | — | | `securityValue` | string | No | Value of security. | — | ###### NeslStampDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `firstParty` | string | No | The name of the first party (for the stamp paper). | — | | `secondParty` | string | No | The name of the second party (for the stamp paper). | — | | `stampDutyAmount` | string | No | The stamp duty amount. | — | | `considerationPrice` | string | No | The consideration price for the purposes of stamp duty. | — | | `descriptionOfDocument` | string | No | The description of the document for the purposes of stamp duty. | — | | `stampDutyPaidBy` | string | No | The name of the party paying the stamp duty. `firstParty` or `secondParty` | — | | `articleCode` | string | No | Article code used in the document. | — | | `articleSubCode` | string | No | Article Sub-code used in the document. | — | | `firstPartyPin` | string | No | The pin of the first party (for the stamp paper). | — | | `secondPartyPin` | string | No | The pin of the second party (for the stamp paper). | — | | `firstPartyOVDType` | string | No | The OVD Type of the first party (for the stamp paper). | — | | `firstPartyOVDValue` | string | No | The OVD Value of the first party (for the stamp paper). | — | | `secondPartyOVDType` | string | No | The OVD Type of the second party (for the stamp paper). | — | | `secondPartyOVDValue` | string | No | The OVD Value of the second party (for the stamp paper). | — | ###### NeslPartyDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `fullName` | string | No | Full name of the Party. | — | | `contactPersonName` | string | No | Full name of the contact person of the Party. | — | | `contactRelation` | string | No | Relation of the party to the debt (Debtor, Guarantor, Co-obligant). | — | | `emailId` | string | No | Email ID of the signer. | — | | `mobileNumber` | string | No | Mobile Number of the signer. | — | | `dob` | string | No | Date of Birth/Incorporation. | — | | `legalConstitution` | string | No | Legal constitution of the signer (Resident Individual, Private Limited, Public Limited, LLP, Proprietorship, Partnership, Entity created by Statute, Trust, HUF, Coop Society, Association of Persons, Government, Self Help Groups, Non-Resident, Foreign Company). | — | | `alternateEmailId` | string | No | Alternate email ID of the signer. | — | | `alternateMobileNumber` | string | No | Alternate mobile of the signer. | — | | `officialDocType` | string | No | Official Document Type (Pan Card, Driving License, Voter ID, Passport, Others). | — | | `officialDocId` | string | No | Official Document ID. | — | | `registeredAddress` | string | No | Registered address of the signer. | — | | `registeredPinCode` | string | No | PIN code of the registered address of the signer. | — | | `designation` | string | No | Designation of the signer (relevant in case of corporate entities). | — | | `communicationAddress` | string | No | Communication address of the signer. | — | | `communicationAddressPinCode` | string | No | PIN code of the communication address of the signer. | — | | `cin` | string | No | Corporate Identification Number (relevant in case of corporate entities). | — | | `kin` | string | No | KYC Identification Number of signer. | — | | `partyType` | string | No | Type of Party (Indian entity/ Resident Individual/ Foreign Entity/ NRI/Foreign Individual. | — | | `isIndividual` | string | No | If the party is individual or not. **Note:** Valid values are `YES` or `NO` (case-insensitive, full words). Allowed: `YES`, `NO`. | — | | `signatoryGender` | string | No | Gender of the signatory | — | | `businessUnit` | string | No | Business Unit | — | ##### CCArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique identifier for this CC recipient. | — | | `name` | string | No | Name of the CC recipient. | — | | `email` | string | No | Email address of the CC recipient. | — | | `invitationNotification` | boolean | No | Indicates whether invitation notifications are enabled for this CC. | — | | `signingNotification` | boolean | No | Indicates whether signing notifications (sent when a signer signs) are enabled for this CC. | — | | `completionNotification` | boolean | No | Indicates whether completion notifications (sent when all signers have signed) are enabled for this CC. | — | | `failureNotification` | boolean | No | Indicates whether failure notifications are enabled for this CC. | — | | `sendInvitationUrl` | boolean | No | Indicates whether the signing invitation URL is shared with this CC. | — | | `shareDocAuditTrail` | boolean | No | Indicates whether the audit trail are shared with this CC. | — | | `enforceOneFactorAuthentication` | boolean | No | Indicates whether one-factor authentication (OTP) is required for this CC to access the document. | — | | `recordAuditTrail` | boolean | No | Indicates whether this CC's notification events are recorded in the audit trail. | — | ##### CoordinatePickerDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `coordinatePickerUrl` | string | No | URL for the coordinate picker to set eSign coordinates on the document. | — | | `coordinatePickerWebhook` | string | No | Webhook URL on which a response is sent when eSign coordinates are set by the coordinate picker. | — | ##### InvitationsArray3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Name of the invitee (signer/reviewer). | — | | `email` | string | No | Email address of the invitee. | — | | `phone` | string | No | Phone number of the invitee (10-digit format without country code). | — | | `inviteeType` | string | No | Type of the invitee. - `APPROVER` — A reviewer who reviews and approves the document before signers can proceed - `SIGNER` — A signer who applies a signature to the document | — | | `inviteeConfigs` | InviteeConfigDetails3_1ResponseObject | No | See **InviteeConfigDetails3_1ResponseObject** below. | — | | `recordReviewerDetails` | boolean | No | Indicates whether the reviewer's details are captured in the audit trail. Applicable only for reviewer invitee type. | — | | `inviteeGroup` | InviteeGroupDetails3_1ResponseObject | No | See **InviteeGroupDetails3_1ResponseObject** below. | — | | `invitationUrl` | string | No | Signing/reviewing URL generated for this invitee. The invitee uses this URL to access and sign/review the document. | — | | `allowedSignatures` | array\ | No | List of signature types allowed for this invitee. - **Possible values:** `Virtual Sign`, `Visual Sign`, `Quick Sign`, `Aadhaar eSign`, `DSC Token`, `NeSL`, `Doc Signer` | — | | `usedSignatureType` | string | No | The signature type actually used by the invitee to sign. Returns `null` if the invitee has not yet signed. - **Possible values:** `Virtual Sign`, `Visual Sign`, `Quick Sign`, `Aadhaar eSign`, `DSC Token`, `Nesl_eSign`, `Doc Signer` | — | | `signatureSubOptionUsed` | string | No | The signature sub-type actually used by the invitee to sign. Returns `null` if the invitee has not yet signed. Possible values are - **NeSL eSign:** `OTP`, `BIO`, `FACE`, `IRIS`, `ETOKEN` | — | | `signatureOptions` | InviteeSignatureOptionDetails3_1ResponseObject | No | See **InviteeSignatureOptionDetails3_1ResponseObject** below. | — | | `signatureOptionUsed` | string | No | The specific signature option (sub-type) used under the selected signature type. Returns `null` if not yet signed. - **Aadhaar eSign:** `One Time Password`, `Bio-Metric`, `Iris`, `Face` - **Virtual Sign:** `Allow Draw`, `Allow Choose`, `Affix Fingerprint` - **Visual Sign:** `Allow Draw`, `Allow Choose`, `Physical Signature` - **Quick Sign:** `Allow Draw`, `Allow Choose`, `Affix Fingerprint`, `Physical Signature` | — | | `neslInvitationDetails` | InviteeNESLParticipantDetails3_1ResponseObject | No | See **InviteeNESLParticipantDetails3_1ResponseObject** below. | — | | `offlineSignDetails` | InviteeOfflineSignDetails3_1ResponseObject | No | See **InviteeOfflineSignDetails3_1ResponseObject** below. | — | | `invitationStatus` | InviteeStatusDetails3_1ResponseObject | No | See **InviteeStatusDetails3_1ResponseObject** below. | — | | `certificateData` | InviteeCertificateDetails3_1ResponseObject | No | See **InviteeCertificateDetails3_1ResponseObject** below. | — | | `verificationRequest` | InviteeVerificationRequestDetails3_1ResponseObject | No | See **InviteeVerificationRequestDetails3_1ResponseObject** below. | — | | `verificationResponse` | object | No | Verification results for this invitee. Returned only when the `invitations_verificationResponse` query parameter is set to `true`. Contains the outcome of each configured verification check (name, pincode, state, title, YOB, gender) as well as face match and smart user liveliness results. See **verificationResponse** below. | — | | `supportingDocuments` | array\ | No | Supporting documents uploaded by the invitee during the signing journey. > **Note:** The response field name is `attachments` (not `supportingDocuments`). See **AttachmentsArrayResponseObject** below. | — | ###### InviteeConfigDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `emailNotification` | boolean | No | Indicates whether email notifications are enabled for this invitee. | — | | `phoneNotification` | boolean | No | Indicates whether phone/SMS notifications are enabled for this invitee. | — | | `whatsappEnabled` | boolean | No | Indicates whether WhatsApp notifications for completion are enabled for this invitee. | — | | `whatsAppNotification` | boolean | No | Indicates whether WhatsApp notifications for eSigning invitation, reminders, and all others are enabled. Only applicable if `whatsappEnabled` is `true`. | — | | `retry` | integer | No | Number of retry attempts configured for this invitee (applicable only for Aadhaar eSign). This is the number of additional attempts allowed after the first attempt. | — | | `fixedName` | boolean | No | If `true`, the invitee will NOT be able to edit their name in the signing journey. If `false`, the invitee can edit their name. | — | | `noName` | boolean | No | If `true`, the invitee's name will not appear in the signature appearance. | — | | `supportingDocument` | array\ | No | Array of supporting document names requested from the invitee during the signing journey. | — | | `viewSupportingDocument` | boolean | No | If `true`, the invitee can view the supporting documents uploaded by all other invitees in the signing journey. | — | | `organizationConfig` | InviteeOrganisationConfigDetails3_1ArrayResponseObject | No | See **InviteeOrganisationConfigDetails3_1ArrayResponseObject** below. | — | | `security` | InviteeSecurityDetails3_1ArrayResponseObject | No | See **InviteeSecurityDetails3_1ArrayResponseObject** below. | — | | `eSignPriority` | InviteeESignPriorityDetails3_1ArrayResponseObject | No | See **InviteeESignPriorityDetails3_1ArrayResponseObject** below. | — | | `customURL` | InviteeCustomURLDetails3_1ArrayResponseObject | No | See **InviteeCustomURLDetails3_1ArrayResponseObject** below. | — | | `customConsent` | string | No | Custom consent content displayed to the invitee during the signing journey. Returns `null` if no custom consent is configured. | — | | `enableRejectDocument` | boolean | No | If `true`, the signer is allowed to reject this invitation in the signing journey. | — | | `enableRejectMessage` | boolean | No | If `true`, the signer is required to provide a message when rejecting the invitation. | — | | `maskContactDetails` | boolean | No | If `true`, the invitee is restricted from viewing the contact details of other invitees during and after the signing journey. If `false`, the invitee can view other invitees' contact details. | — | | `languageDetails` | object | No | Language configuration for the invitee's signing journey. See **languageDetails** below. | — | | `paymentDetails` | InviteePaymentDetails | No | See **InviteePaymentDetails** below. | — | ###### InviteeOrganisationConfigDetails3_1ArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `nameRequired` | boolean | No | Indicates whether an organization name is required. The organization name appears on the rubber seal and signature appearance. | — | | `fixedName` | boolean | No | If `true`, the invitee cannot edit the organization name that was pre-set. If `false`, the invitee can modify it. | — | | `name` | string | No | Organization name. If `fixedName` is `false`, this is the name the invitee entered during the signing journey. | — | | `requireSeal` | boolean | No | Indicates whether a rubber seal is required for this invitee. | — | | `sealType` | string | No | Type of rubber seal configured for this invitee. - **Possible values:** `Authorized signatory seal`, `Director Seal`, `Custom Seal` | — | ###### InviteeSecurityDetails3_1ArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `enforceAuthentication` | boolean | No | Indicates whether OTP verification is required before the invitee can access the document. | — | | `twoFactorAuthentication` | boolean | No | Indicates whether two-factor authentication (both Email and Phone OTP) is enabled for this invitee. | — | | `sendDocumentRawUrl` | boolean | No | Indicates whether the raw document PDF URL is sent along with OTP emails/SMS messages. | — | | `captureLocation` | boolean | No | Indicates whether geolocation capture is enabled during the signing journey. | — | | `capturePhoto` | boolean | No | Indicates whether face/photo capture is enabled during the signing journey. | — | | `gpsConfig` | gpsConfigResponse | No | GPS location restriction and accuracy configuration set by the sender for this invitee. See **gpsConfigResponse** below. | — | | `faceMatch` | faceMatch | No | See **faceMatch** below. | — | | `userLiveliness` | boolean | No | Indicates whether User Liveliness (Live OTP verification) is enabled. | — | | `smartUserLiveliness` | smartUserLiveliness | No | See **smartUserLiveliness** below. | — | ###### gpsConfigResponse GPS location restriction and accuracy configuration set by the sender for this invitee. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `applyLocationRestriction` | boolean | No | `true` indicates location-based signing restriction is enabled for this invitee. The invitee can only sign from within the area defined by `allowedLatitude`, `allowedLongitude`, and `permissibleRadius`. | — | | `allowedLatitude` | number | No | Latitude of the permitted signing location configured by the sender. | `28.50950813247034` | | `allowedLongitude` | number | No | Longitude of the permitted signing location configured by the sender. | `77.08920288142689` | | `permissibleRadius` | integer | No | Radius (in meters) around the permitted location within which the invitee is allowed to sign. | `5000` | | `restrictToIndia` | boolean | No | Indicates whether 'Restrict to India' was enabled in the workflow. If enabled, the signer must be present in India to sign the document. | `true` | | `applyLocationAccuracy` | boolean | No | `true` indicates GPS accuracy validation is enabled. The invitee's device GPS accuracy must meet the `accuracyThreshold` to proceed with signing. | — | | `accuracyThreshold` | integer | No | Maximum allowed GPS accuracy in meters configured by the sender. Signing is blocked if the invitee's device accuracy exceeds this value. | `10000` | ###### faceMatch | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `faceMatchEnabled` | boolean | No | Indicates whether Face Match is enabled (true) or disabled (false). | — | | `faceMatchRetriesConfigured` | integer | No | Number of additional retry attempts configured beyond the first attempt. For example, a value of `3` means the invitee gets 1 original attempt + 3 retries = 4 total face match attempts. Returns `null` if face match is not enabled. | — | ###### smartUserLiveliness | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartUserLivelinessEnabled` | boolean | No | Indicates whether Smart User Liveliness is enabled for this invitee. `true` if enabled, `false` if not. Returns `false` when not configured. | — | | `smartUserLivelinessRetriesConfigured` | integer | No | Number of additional retry attempts configured beyond the first attempt for Smart User Liveliness. Returns `null` if Smart User Liveliness is not enabled. | — | ###### InviteeESignPriorityDetails3_1ArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `eSignPriorityEnabled` | boolean | No | Priority sequence is enabled for eSign types like Aadhaar | — | | `eSignPriorityConfig` | array\ | No | Configurations like retry attempt and order for eSign types (e.g., AADHAAR) and subtypes (e.g., OTP, BIO, IRIS) See **InviteeESignPriorityESignPriorityConfig3_1ArrayResponseObject** below. | — | ###### InviteeESignPriorityESignPriorityConfig3_1ArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `signatureType` | string | No | Type eSign selected for the invitee like AADHAAR | — | | `eSignSubType` | string | No | Subtype of eSign selected for the invitee. - **Possible values:** `OTP`, `BIO`, `IRIS`, `FACE` | — | | `retryAttempts` | integer | No | Number of retry attempts assigned to this eSign subtype before the nextin order eSign subtype is shown to the signer | — | | `eSignOrder` | integer | No | The sequence in which this eSign subtype will appear in the signing journey | — | ###### InviteeCustomURLDetails3_1ArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookURL` | string | No | The configured webhook URL for this invitee. Leegality sends a POST request to this URL after the invitee successfully signs. Returns `null` if no webhook URL is configured. | — | | `redirectURL` | string | No | URL where you want the user to be redirected on completion of the transaction (Not applicable if you are using our Front-end SDKs). documentId will be appended to the URL on redirection. | — | | `errorWebhookURL` | string | No | The configured error webhook URL for this invitee. Leegality sends a POST request to this URL after expiry, failure, or rejection of the signature. Returns `null` if no error webhook URL is configured for this invitee. | — | | `baseURL` | string | No | URL where you want the user to be redirected on rejection/failure of the transaction (Not applicable if you are using our Front-end SDKs). documentId will be appended to the URL on redirection. | — | | `webhookVersion` | string | No | The webhook version configured for this invitee, which determines the webhook payload format. - **Possible values:** `V2.1` (default), `V2.5` | — | ###### languageDetails Language configuration for the invitee's signing journey. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `enableLanguage` | boolean | No | Whether language selection is enabled for this invitee. Returns `null` if not configured. | — | | `defaultLanguage` | boolean | No | Whether a default language has been set. Returns `null` if not configured. | — | | `defaultLanguageSelect` | string | No | The default language configured for this invitee's signing journey. - **Example values:** `HINDI`, `MARATHI`, `TAMIL` | — | ###### InviteePaymentDetails | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `paymentCollectionEnabled` | boolean | No | Indicates whether payment collection is enabled for this invitee. `true` if enabled, `false` if not. | — | | `paymentProfileId` | string | No | Profile ID of the selected payment profile. Refer to the Account Tab in the Leegality dashboard to see details of the payment profile. | — | | `paymentCollectionAmount` | string | No | The configured payment amount to be collected from the invitee, as a string. | — | | `paymentCollectionMessage` | string | No | Message displayed to the invitee during payment collection. Returns `null` if no message was configured. | — | | `paymentCollectStatus` | string | No | Current status of payment collection for this invitee. - **Razorpay:** `notPaid`, `Authorised`, `Captured`, `Refunded` - **Billdesk:** `notPaid`, `Completed`, `Refunded` | — | | `paymentId` | string | No | Payment transaction ID. Available when `paymentCollectStatus` is `Authorised` or `Captured` (Razorpay), or `Completed` (Billdesk). Returns `null` otherwise. | — | | `paymentEventDate` | string | No | Payment transaction date. Available when `paymentCollectStatus` is `Authorised` or `Captured` (Razorpay), or `Completed` (Billdesk). Returns `null` otherwise. | — | ###### InviteeGroupDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Unique identifier for the invitee group. | — | | `name` | string | No | Name of the invitee group. | — | | `completionThreshold` | integer | No | Number of people required to sign in the group for the group signature to be considered complete. For example, if a group has 5 members and the threshold is 3, only 3 out of 5 need to sign. Returns `null` for invitees not in a group. | — | | `completionStatus` | string | No | Completion status of the group signing process as a fraction string. - **Format:** `"signed/total"` (e.g., `"1/2"` means 1 out of 2 members have signed) | — | | `size` | integer | No | Total number of invitations/members in the group. | — | | `completed` | boolean | No | Indicates whether the group signature requirement has been met (i.e., the number of signers has reached the `completionThreshold`). | — | ###### InviteeSignatureOptionDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `aadhaar` | array\ | No | Aadhaar authentication method(s) configured for this invitee. - **Possible values:** `OTP`, `BIO`, `IRIS`, `FACE` | — | | `virtual` | array\ | No | Virtual sign type(s) configured for this invitee. - **Possible values:** `Allow Choose`, `Allow Draw`, `Affix Fingerprint` | — | | `visualSign` | array\ | No | Visual Sign type(s) configured for this invitee. Only present when `invitations_signatureOptions_visualSign` is passed as `true`. - **Possible values:** `Allow Choose`, `Allow Draw`, `Physical Signature` | — | | `quickSign` | array\ | No | Quick Sign option(s) configured for this invitee. Only present when `invitations_signatureOptions_quickSign` is passed as `true`. - **Possible values:** `Allow Choose`, `Allow Draw`, `Affix Fingerprint`, `Physical Signature` | — | ###### InviteeNESLParticipantDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `type` | string | No | NeSL participant type. - `F2F` — invitee receives sign URL from Leegality via mail/SMS - `Non F2F` — sign URL is sent directly by NeSL | — | | `participantDetails` | NeslparticipantDetails3_1ResponseObject | No | See **NeslparticipantDetails3_1ResponseObject** below. | — | ###### NeslparticipantDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `fullName` | string | No | Full name of the Party. | — | | `contactPersonName` | string | No | Full name of the contact person of the Party. | — | | `contactRelation` | string | No | Relation of the party to the debt (Debtor, Guarantor, Co-obligant). **Note:** For EBG, only `DEBTOR` (first participant) and `BENEFICIARY` are accepted. | — | | `emailId` | string | No | Email ID of the signer. | — | | `mobileNumber` | string | No | Mobile Number of the signer. | — | | `dob` | string | No | Date of Birth/Incorporation. | — | | `legalConstitution` | string | No | Legal constitution of the signer (Resident Individual, Private Limited, Public Limited, LLP, Proprietorship, Partnership, Entity created by Statute, Trust, HUF, Coop Society, Association of Persons, Government, Self Help Groups, Non-Resident, Foreign Company). | — | | `alternateEmailId` | string | No | Alternate email ID of the signer. | — | | `alternateMobileNumber` | string | No | Alternate mobile of the signer. | — | | `officialDocType` | string | No | Official Document Type (Pan Card, Driving License, Voter ID, Passport, Others). | — | | `officialDocId` | string | No | Official Document ID. | — | | `registeredAddress` | string | No | Registered address of the signer. | — | | `registeredPinCode` | string | No | PIN code of the registered address of the signer. | — | | `designation` | string | No | Designation of the signer (relevant in case of corporate entities). | — | | `communicationAddress` | string | No | Communication address of the signer. | — | | `communicationAddressPinCode` | string | No | PIN code of the communication address of the signer. | — | | `cin` | string | No | Corporate Identification Number (relevant in case of corporate entities). | — | | `kin` | string | No | KYC Identification Number of signer. | — | | `partyType` | string | No | Type of Party (Indian entity/ Resident Individual/ Foreign Entity/ NRI/Foreign Individual. | — | | `isIndividual` | string | No | If the participant is individual or not. **Note:** Valid values are `YES` or `NO` (case-insensitive, full words). Required for EBG registrationType. Allowed: `YES`, `NO`. | — | | `signatoryGender` | string | No | Gender of the signatory | — | | `businessUnit` | string | No | Business Unit | — | ###### InviteeOfflineSignDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `fixSignerId` | boolean | No | Parameter to find out if signerID is fixed for the invitation. | — | | `mobileNumber` | string | No | Mobile number corresponding to the signerID fixed for the invitation. | — | | `pan` | string | No | PAN corresponding to the signerID fixed for the invitation. | — | | `signerId` | string | No | SignerID corresponding to the signerID fixed for the invitation. | — | ###### InviteeStatusDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `active` | boolean | No | Indicates it is the invitee's turn to act (sign/review). - `true` — invitee can currently access and act on the document - `false` — not the invitee's turn yet When signing order is enabled, only the current invitee(s) in the sequence will have `active=true`. > **Note:** `active` remains `true` even after the invitee has signed/approved. | — | | `signed` | boolean | No | Indicates the invitation has been signed successfully by the invitee. | — | | `reviewed` | boolean | No | Applicable only for Reviewer invitee type. Indicates the invitation has been reviewed (either approved or rejected). | — | | `approved` | boolean | No | Applicable only for Reviewer invitee type. Indicates the reviewer has approved the document. | — | | `rejected` | boolean | No | Applicable only for Signer invitee type. Indicates the signer has rejected the invitation. Resets to `false` if the invitation is re-sent and the signer subsequently signs. | — | | `expired` | boolean | No | Indicates the invitation has expired. The invitee can no longer access the signing URL. **Note:** Also set to `true` when a group signing threshold is met and this invitee was a non-signing member of the group. In that case, `failureReason` will contain `"Group Minimum Signature Completed."`. | — | | `recordApproverResponse` | boolean | No | Indicates whether the reviewer/approver's actions are recorded in the audit trail. | — | | `creationDate` | string | No | Creation date of the signing invitation. **Format:** `DD-MM-YYYY HH:MM:SS` | — | | `expiryDate` | string | No | Expiry date of the signing invitation. **Format:** `DD-MM-YYYY HH:MM:SS` If `null`, the default expiry is 45 minutes from creation. | — | | `signDate` | string | No | Date when the invitee signed the document. Returns `null` if not yet signed. **Format:** `DD-MM-YYYY HH:MM:SS` | — | | `failureReason` | string | No | Reason for failure or special status. Not limited to error scenarios — also contains informational messages. - `"Group Minimum Signature Completed."` — Group threshold was met; remaining group members' invitations closed - `"Signed but Verification Failed."` — Invitee signed but certificate verification failed - `null` — No failure or special status | — | | `rejectionMessage` | string | No | The message sent by the approver/reviewer at the time of rejecting the invitation. Returns `null` if no rejection occurred or no message was provided. | — | | `signRejectionMessage` | string | No | The message sent by the signer/invitee at the time of rejecting the invitation. Returns `null` if no rejection occurred or no message was provided. **Note:** This value persists even if the invitee later signs the document (after re-sending). The `rejected` field resets to `false` after signing, but this message remains. | — | ###### InviteeCertificateDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Name of the signer as recorded in the digital signature certificate. Returns `null` if not available. | — | | `yob` | string | No | Year of birth of the signer from the digital signature certificate. - **Format:** `YYYY` (e.g., `"1998"`) | — | | `gender` | string | No | Gender of the signer from the digital signature certificate. - `M` — Male - `F` — Female - `T` — Transgender | — | | `pincode` | string | No | PIN code of the signer from the digital signature certificate (6-digit string). Returns `null` if not available. | — | | `title` | string | No | Last 4 digits of the Aadhaar number of the signer, as recorded in the digital signature certificate. Returns `null` if not available. | — | | `state` | string | No | State of the signer from the digital signature certificate. Returns `null` if not available. | — | | `photoHash` | string | No | SHA-256 hash of the signer's photo from the digital signature certificate. - **Format:** 64-character hexadecimal string | — | | `uid` | string | No | UID from the digital signature certificate. **Note:** This field is typically `null` (masked/not returned) even after Aadhaar-based signing, due to privacy restrictions. | — | | `serialNumber` | string | No | Serial number of the digital signature certificate used for signing. Returns `null` if not available. | — | ###### InviteeVerificationRequestDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `aadhaarConfig` | InviteeAadhaarVerificationRequestDetails3_1ResponseObject | No | Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). See **InviteeAadhaarVerificationRequestDetails3_1ResponseObject** below. | — | | `offlineConfig` | InviteeAadhaarVerificationRequestDetails3_1ResponseObject | No | Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). See **InviteeAadhaarVerificationRequestDetails3_1ResponseObject** below. | — | | `dscConfig` | InviteeDSCVerificationRequestDetails3_1ResponseObject | No | See **InviteeDSCVerificationRequestDetails3_1ResponseObject** below. | — | | `neslConfig` | InviteeAadhaarVerificationRequestDetails3_1ResponseObject | No | Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). See **InviteeAadhaarVerificationRequestDetails3_1ResponseObject** below. | — | ###### InviteeAadhaarVerificationRequestDetails3_1ResponseObject Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartNamePercentage` | boolean | No | Whether smart name percentage matching is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `nameVerification` | boolean | No | Whether exact name verification is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `pincodeVerification` | string | No | The pincode value to verify against the signer's certificate. **Example:** `"247667"` Returns `null` if pincode verification is not configured. | — | | `stateVerification` | string | No | The state name to verify against the signer's certificate. **Example:** `"Uttarakhand"` Returns `null` if state verification is not configured. | — | | `titleVerification` | string | No | The last 4 digits of the Aadhaar number to verify against the signer's certificate. **Example:** `"3870"` Returns `null` if title verification is not configured. | — | | `yobVerification` | integer | No | The year of birth to verify against the signer's certificate. **Example:** `1998` Returns `null` if YOB verification is not configured. | — | | `genderVerification` | string | No | The gender value to verify against the signer's certificate. - `M` — Male - `F` — Female - `T` — Transgender | — | ###### InviteeAadhaarVerificationRequestDetails3_1ResponseObject Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartNamePercentage` | boolean | No | Whether smart name percentage matching is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `nameVerification` | boolean | No | Whether exact name verification is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `pincodeVerification` | string | No | The pincode value to verify against the signer's certificate. **Example:** `"247667"` Returns `null` if pincode verification is not configured. | — | | `stateVerification` | string | No | The state name to verify against the signer's certificate. **Example:** `"Uttarakhand"` Returns `null` if state verification is not configured. | — | | `titleVerification` | string | No | The last 4 digits of the Aadhaar number to verify against the signer's certificate. **Example:** `"3870"` Returns `null` if title verification is not configured. | — | | `yobVerification` | integer | No | The year of birth to verify against the signer's certificate. **Example:** `1998` Returns `null` if YOB verification is not configured. | — | | `genderVerification` | string | No | The gender value to verify against the signer's certificate. - `M` — Male - `F` — Female - `T` — Transgender | — | ###### InviteeDSCVerificationRequestDetails3_1ResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartNamePercentage` | boolean | No | Whether smart name verification is turned on or not. | — | | `nameVerification` | boolean | No | Whether name verification is turned on or not. | — | | `pincodeVerification` | boolean | No | Whether pincode verification is turned on or not. | — | | `stateVerification` | boolean | No | Whether state verification is turned on or not. | — | ###### InviteeAadhaarVerificationRequestDetails3_1ResponseObject Verification request configuration for this invitee. These fields contain the **input values** provided when creating the document — not boolean flags. **Note:** `smartNamePercentage` is a boolean toggle (`true`/`null`). All other fields contain the actual input values to verify against (e.g., pincode string, state name, year of birth integer). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartNamePercentage` | boolean | No | Whether smart name percentage matching is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `nameVerification` | boolean | No | Whether exact name verification is enabled for this invitee. Returns `true` if enabled, `null` if not configured. | — | | `pincodeVerification` | string | No | The pincode value to verify against the signer's certificate. **Example:** `"247667"` Returns `null` if pincode verification is not configured. | — | | `stateVerification` | string | No | The state name to verify against the signer's certificate. **Example:** `"Uttarakhand"` Returns `null` if state verification is not configured. | — | | `titleVerification` | string | No | The last 4 digits of the Aadhaar number to verify against the signer's certificate. **Example:** `"3870"` Returns `null` if title verification is not configured. | — | | `yobVerification` | integer | No | The year of birth to verify against the signer's certificate. **Example:** `1998` Returns `null` if YOB verification is not configured. | — | | `genderVerification` | string | No | The gender value to verify against the signer's certificate. - `M` — Male - `F` — Female - `T` — Transgender | — | ###### verificationResponse Verification results for this invitee. Returned only when the `invitations_verificationResponse` query parameter is set to `true`. Contains the outcome of each configured verification check (name, pincode, state, title, YOB, gender) as well as face match and smart user liveliness results. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartNamePercentage` | integer | No | Name matching percentage between the provided name and the name from the CA authority certificate. **Example:** `45` (means 45% match) Returns `null` if smart name verification is not configured. | — | | `smartNameAI` | boolean | No | Whether Smart Name AI matching was enabled for this invitee. `true` = enabled, `false` = disabled, `null` = not configured. | — | | `signatureVerification` | boolean | No | Whether signature certificate verification was enabled for this invitee. `true` = enabled, `false` = disabled, `null` = not configured. | — | | `nameVerification` | boolean | No | Result of name verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `pincodeVerification` | boolean | No | Result of pincode verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `stateVerification` | boolean | No | Result of state verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `titleVerification` | boolean | No | Result of title (last 4 digits of Aadhaar) verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `yobVerification` | boolean | No | Result of year of birth verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `genderVerification` | boolean | No | Result of gender verification against the signer's certificate. `true` = verification passed, `false` = verification failed, `null` = not configured. | — | | `neslNameVerification` | boolean | No | Indicates whether the invitee's name has been successfully verified. true means the verification succeeded, and false means it failed. | — | | `neslNameVerificationPercentage` | integer | No | The percentage of accuracy achieved during the invitee's name verification. | — | | `neslGenderVerification` | boolean | No | Indicates whether the invitee's gender has been successfully verified. true means the verification succeeded, and false means it failed. | — | | `neslYobVerification` | boolean | No | Indicates whether the invitee's Year of Birth (YOB) has been successfully verified. true means the verification succeeded, and false means it failed. | — | | `faceMatch` | FaceMatchArrayResponseObject | No | See **FaceMatchArrayResponseObject** below. | — | | `smartUserLiveliness` | SmartUserLivelinessArrayResponseObject | No | See **SmartUserLivelinessArrayResponseObject** below. | — | ###### FaceMatchArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `faceMatchPercentage` | integer | No | Percentage of similarity between the source image and the image captured by the signer during face match. **Type:** Integer (e.g., `99`) Returns `null` if face match is not enabled or if the invitee has not yet completed signing. Only populated after the invitee has signed the document. | — | | `faceMatchAttemptsLeft` | integer | No | Number of remaining face match retry attempts. Decrements with **every** attempt (both successful and failed matches). Starts at the value of `faceMatchRetriesConfigured` and counts down. Returns `null` if face match is not enabled for this invitee. | — | | `faceMatchError` | string | No | Error message from the face matching process, if any. Returns `null` when face match is not enabled, when no error has occurred, or when attempts are still remaining. | — | ###### SmartUserLivelinessArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `smartUserLivelinessPercentage` | integer | No | The percentage achieved by the invitee during Smart User Liveliness verification. Only the percentage of the invitee's most recent verification attempt is displayed. > **Note:** This percentage is only available after the invitee has either signed the document or the invitation has expired. Otherwise, it will return a `null` value. | — | | `smartUserLivelinessAttemptsLeft` | integer | No | Number of remaining attempts for the invitee to complete Smart User Liveliness. This value updates with each attempt. | — | ###### AttachmentsArrayResponseObject | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `file` | string | No | CDN download URL for the attachment file. This is a signed URL with an expiration time — not a base64-encoded string. | — | | `name` | string | No | Filename of the attachment. **Example:** `"Invoice-6814F2DA-0024.pdf"` | — | | `type` | string | No | MIME type of the attachment. **Possible values:** `application/pdf`, `image/png`, `image/jpg`, `image/jpeg` | — | ### Sample Response (200) ```json { "status": 0, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "file": "string", "auditTrail": "string", "document": { "id": "string", "name": "string", "irn": "string", "status": "string", "coordinatePicker": false, "deleted": false, "creationDate": "string", "completionDate": "string", "scheduledDeletionDate": "string", "customMessage": "string", "deleteOnComplete": false, "requestSigningOrder": false, "requireSigningOrder": false }, "sftp": { "sftpEnabled": false, "profileId": "string" }, "workflow": { "id": "string", "name": "string", "type": "string", "subtype": "string" }, "template": { "id": "string", "name": "string" }, "account": { "id": "string", "name": "string", "label": "string", "brandName": "string" }, "sender": { "name": "string", "username": "string" }, "folders": [ { "id": "string", "name": "string" } ], "stampDetails": { "groupName": "string", "groupNumber": "string", "stampValue": "string", "maximumValuePermitted": "string", "state": "string", "stamps": [ { "series": "03", "amount": "string", "serialNumber": "string", "associatedDocumentId": "string" } ], "multipleStampSeriesUsed": false }, "referenceAttachments": [ { "file": "string", "name": "string", "type": "string" } ], "neslDocumentDetails": { "transactionId": "string", "responseCode": "string", "responseMessage": "string", "isRetryAllowed": "string", "loanDetails": { "loanNumber": "string", "sanctionNumber": "string", "registrationType": "string", "state": "string", "branchName": "string", "branchAddress": "string", "dateOfSanction": "string", "emiAmount": "string", "rateOfInterest": "string", "sanctionAmount": "string", "tenure": "string", "typeOfDebt": "string", "accountClosedFlag": "string", "fundType": "string", "sanctionCurrency": "string", "creditSubtype": "string", "facilityName": "string", "amountOverdue": "string", "otherChargeAmount": "string", "debtStartDate": "string", "interestAmount": "string", "oldDebtRefNo": "string", "principalOutstanding": "string", "loanRemark": "string", "totalOutstandingAmount": "string", "creditorBusinessUnit": "string", "drawingPower": "string", "daysPastDue": "string", "event": "INVOCATION", "expiryDate": "string", "claimExpiryDate": "string", "currencyOfDebt": "string" }, "securityDetails": [ { "securityDescription": "string", "assetsType": "string", "chargeType": "string", "assetId": "string", "doc": "string", "dov": "string", "cersaiId": "string", "rocChargeId": "string", "securityValue": "string" } ], "stampDetails": { "firstParty": "string", "secondParty": "string", "stampDutyAmount": "string", "considerationPrice": "string", "descriptionOfDocument": "string", "stampDutyPaidBy": "string", "articleCode": "string", "articleSubCode": "string", "firstPartyPin": "string", "secondPartyPin": "string", "firstPartyOVDType": "string", "firstPartyOVDValue": "string", "secondPartyOVDType": "string", "secondPartyOVDValue": "string" }, "partyDetails": { "fullName": "string", "contactPersonName": "string", "contactRelation": "string", "emailId": "string", "mobileNumber": "string", "dob": "string", "legalConstitution": "string", "alternateEmailId": "string", "alternateMobileNumber": "string", "officialDocType": "string", "officialDocId": "string", "registeredAddress": "string", "registeredPinCode": "string", "designation": "string", "communicationAddress": "string", "communicationAddressPinCode": "string", "cin": "string", "kin": "string", "partyType": "string", "isIndividual": "YES", "signatoryGender": "string", "businessUnit": "string" }, "neslEstampStatus": "string", "neslEstampCertificates": [ "string" ] }, "cc": [ { "id": "string", "name": "string", "email": "string", "invitationNotification": false, "signingNotification": false, "completionNotification": false, "failureNotification": false, "sendInvitationUrl": false, "shareDocAuditTrail": false, "enforceOneFactorAuthentication": false, "recordAuditTrail": false } ], "coordinatePicker": { "coordinatePickerUrl": "string", "coordinatePickerWebhook": "string" }, "invitations": [ { "name": "string", "email": "string", "phone": "string", "inviteeType": "string", "inviteeConfigs": { "emailNotification": false, "phoneNotification": false, "whatsappEnabled": false, "whatsAppNotification": false, "retry": 0, "fixedName": false, "noName": false, "supportingDocument": [ "string" ], "viewSupportingDocument": false, "organizationConfig": { "nameRequired": false, "fixedName": false, "name": "string", "requireSeal": false, "sealType": "string" }, "security": { "enforceAuthentication": false, "twoFactorAuthentication": false, "sendDocumentRawUrl": false, "captureLocation": false, "capturePhoto": false, "gpsConfig": { "applyLocationRestriction": false, "allowedLatitude": 28.50950813247034, "allowedLongitude": 77.08920288142689, "permissibleRadius": 5000, "restrictToIndia": true, "applyLocationAccuracy": false, "accuracyThreshold": 10000 }, "faceMatch": { "faceMatchEnabled": false, "faceMatchRetriesConfigured": 0 }, "userLiveliness": false, "smartUserLiveliness": { "smartUserLivelinessEnabled": false, "smartUserLivelinessRetriesConfigured": 0 } }, "eSignPriority": { "eSignPriorityEnabled": false, "eSignPriorityConfig": [ { "signatureType": "string", "eSignSubType": "string", "retryAttempts": 0, "eSignOrder": 0 } ] }, "customURL": { "webhookURL": "string", "redirectURL": "string", "errorWebhookURL": "string", "baseURL": "string", "webhookVersion": "string" }, "customConsent": "string", "enableRejectDocument": false, "enableRejectMessage": false, "maskContactDetails": false, "languageDetails": { "enableLanguage": false, "defaultLanguage": false, "defaultLanguageSelect": "string" }, "paymentDetails": { "paymentCollectionEnabled": false, "paymentProfileId": "string", "paymentCollectionAmount": "string", "paymentCollectionMessage": "string", "paymentCollectStatus": "string", "paymentId": "string", "paymentEventDate": "string" } }, "recordReviewerDetails": false, "inviteeGroup": { "id": "string", "name": "string", "completionThreshold": 0, "completionStatus": "string", "size": 0, "completed": false }, "invitationUrl": "string", "allowedSignatures": [ "string" ], "usedSignatureType": "string", "signatureSubOptionUsed": "string", "signatureOptions": { "aadhaar": [ "string" ], "virtual": [ "string" ], "visualSign": [ "string" ], "quickSign": [ "string" ] }, "signatureOptionUsed": "string", "neslInvitationDetails": { "type": "string", "participantDetails": { "fullName": "string", "contactPersonName": "string", "contactRelation": "string", "emailId": "string", "mobileNumber": "string", "dob": "string", "legalConstitution": "string", "alternateEmailId": "string", "alternateMobileNumber": "string", "officialDocType": "string", "officialDocId": "string", "registeredAddress": "string", "registeredPinCode": "string", "designation": "string", "communicationAddress": "string", "communicationAddressPinCode": "string", "cin": "string", "kin": "string", "partyType": "string", "isIndividual": "YES", "signatoryGender": "string", "businessUnit": "string" } }, "offlineSignDetails": { "fixSignerId": false, "mobileNumber": "string", "pan": "string", "signerId": "string" }, "invitationStatus": { "active": false, "signed": false, "reviewed": false, "approved": false, "rejected": false, "expired": false, "recordApproverResponse": false, "creationDate": "string", "expiryDate": "string", "signDate": "string", "failureReason": "string", "rejectionMessage": "string", "signRejectionMessage": "string" }, "certificateData": { "name": "string", "yob": "string", "gender": "string", "pincode": "string", "title": "string", "state": "string", "photoHash": "string", "uid": "string", "serialNumber": "string" }, "verificationRequest": { "aadhaarConfig": { "smartNamePercentage": false, "nameVerification": false, "pincodeVerification": "string", "stateVerification": "string", "titleVerification": "string", "yobVerification": 0, "genderVerification": "string" }, "offlineConfig": { "smartNamePercentage": false, "nameVerification": false, "pincodeVerification": "string", "stateVerification": "string", "titleVerification": "string", "yobVerification": 0, "genderVerification": "string" }, "dscConfig": { "smartNamePercentage": false, "nameVerification": false, "pincodeVerification": false, "stateVerification": false }, "neslConfig": { "smartNamePercentage": false, "nameVerification": false, "pincodeVerification": "string", "stateVerification": "string", "titleVerification": "string", "yobVerification": 0, "genderVerification": "string" } }, "verificationResponse": { "smartNamePercentage": 0, "smartNameAI": false, "signatureVerification": false, "nameVerification": false, "pincodeVerification": false, "stateVerification": false, "titleVerification": false, "yobVerification": false, "genderVerification": false, "neslNameVerification": false, "neslNameVerificationPercentage": 0, "neslGenderVerification": false, "neslYobVerification": false, "faceMatch": { "faceMatchPercentage": 0, "faceMatchAttemptsLeft": 0, "faceMatchError": "string" }, "smartUserLiveliness": { "smartUserLivelinessPercentage": 0, "smartUserLivelinessAttemptsLeft": 0 } }, "supportingDocuments": [ { "file": "string", "name": "string", "type": "string" } ] } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-completed-documents # GET /v3.0/document/completed — List completed documents Retrieves a paginated list of all completed documents from your Leegality account. Documents are returned in **ascending order** by completion date (oldest first). **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.0/document/completed?max={max}&offset={offset}&name={name}&irn={irn}&startDate={startDate}&endDate={endDate} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/document/completed` - Sandbox: `https://sandbox.leegality.com/api/v3.0/document/completed` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `max` | query | No | integer | Maximum number of documents to return per request. **Default:** `20` **Valid range:** `1` to `40` **Note:** If a value greater than `40` is passed, the API silently resets it to `20` (the default) instead of returning an error or capping at 40. | — | | `offset` | query | No | integer | Number of documents to skip before returning results. Used for pagination. **Default:** `0` **Example:** To get the second page of results with 20 per page, use `offset=20`. If `offset` exceeds the total number of documents, an empty `documents` array is returned with the correct `totalCount`. | — | | `name` | query | No | string | Filter documents by name using **pattern matching** (case-insensitive partial match). **Example:** `name=dummy` will match documents named `dummy PDF.pdf`, `My dummy document`, etc. The `totalCount` in the response reflects the filtered count. | — | | `irn` | query | No | string | Filter documents by Invoice Reference Number (IRN). This is an **exact match** filter — partial IRN values will not return results. **Example:** If a document has IRN `12222223`, searching for `irn=12222223` returns it, but `irn=12222` returns nothing. | — | | `startDate` | query | No | string | Filter documents completed on or after this date. **Format:** `dd-MM-yyyy` **Example:** `01-01-2026` Can be used alone (without `endDate`) to get all documents completed from this date onwards. **Note:** The filter is based on the document's completion date, not the creation date. An invalid format returns error code `validator.invalid`. | — | | `endDate` | query | No | string | Filter documents completed on or before this date. **Format:** `dd-MM-yyyy` **Example:** `28-02-2026` Can be used alone (without `startDate`) to get all documents completed up to this date. **Note:** The filter is based on the document's completion date, not the creation date. An invalid format returns error code `validator.invalid`. | — | --- ## Responses ### 200 — Default Response Response for the List Completed Documents API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = Success `0` = Failure (e.g., invalid date format) | `1` | | `data` | CompletedDocumentsData | No | Contains the paginated list of completed documents and the total count. See **CompletedDocumentsData** below. | — | | `messages` | array\ | No | Array of error/validation messages. Empty array on success. On validation failure (e.g., invalid date format), contains objects with `code` and `message` fields. See **Message** below. | — | #### CompletedDocumentsData Contains the paginated list of completed documents and the total count. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `totalCount` | integer | No | Total number of completed documents matching the applied filters. This count reflects all matching documents, not just those in the current page. Use this with `max` and `offset` to implement pagination. | `130` | | `documents` | array\ | No | Array of completed document objects, sorted in **ascending order** by `completionDate` (oldest first). The number of items is limited by the `max` parameter (default 20, maximum 40). See **CompletedDocumentItem** below. | — | ##### CompletedDocumentItem A completed document summary object. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | The unique identifier for the document, generated by Leegality when the eSigning request was created. | `FR601AA019` | | `documentName` | string | No | The name of the document as specified when creating the eSigning request. > **Note:** This field is named `documentName` (not `name` as in the List Documents API). | `Template-VuMT` | | `irn` | string | No | Invoice Reference Number associated with the document. Returns `null` if no IRN was assigned. | `12222223` | | `completionDate` | string | No | The date and time when the document was completed (all signatures collected). **Format:** `yyyy-MM-dd HH:mm:ss.S` Documents are sorted by this field in ascending order. | `2024-01-02 11:20:04.0` | | `dateCreated` | string | No | The date and time when the eSigning request was created. **Format:** `yyyy-MM-dd HH:mm:ss.S` | `2024-01-02 11:17:36.0` | | `folderId` | string | No | The unique identifier of the folder containing this document. Returns `null` if the document is not in a folder. | `null` | | `folderName` | string | No | The name of the folder containing this document. Returns `null` if the document is not in a folder. | `null` | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "data": { "totalCount": 130, "documents": [ { "documentId": "FR601AA019", "documentName": "Template-VuMT", "irn": "12222223", "completionDate": "2024-01-02 11:20:04.0", "dateCreated": "2024-01-02 11:17:36.0", "folderId": null, "folderName": null } ] }, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ] } ``` --- URL: https://knowledge.leegality.com/document-execution/api/fetch-document # GET /v3.3/document/fetchDocument — Fetch document Downloads the signed document, audit trail, sender attachments, or invitee supporting documents associated with a completed document. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.3/document/fetchDocument?documentId={documentId}&documentDownloadType={documentDownloadType}&supportDocumentUrl={supportDocumentUrl}&index={index} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/document/fetchDocument` - Sandbox: `https://sandbox.leegality.com/api/v3.3/document/fetchDocument` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `documentId` | query | Yes | string | The unique Document ID generated by Leegality when the eSigning request was created. Can also be retrieved from the Leegality dashboard. **Note:** Only completed documents can be fetched. SENT or DRAFT documents return error `no.document.found`. | — | | `documentDownloadType` | query | Yes | string | The type of file to download. Only one value can be passed per API call. **Possible values:** - `DOCUMENT` — The signed PDF document - `AUDIT_TRAIL` — The audit trail generated by Leegality on document completion - `ATTACHMENT` — Reference attachments uploaded by the sender (requires `index`) - `SUPPORTING_DOCUMENT` — Supporting documents uploaded by an invitee (requires `supportDocumentUrl` and `index`) **Note:** Values are **case-sensitive** and must be uppercase. Lowercase or invalid values return error code `document.download.type` with the list of valid values. | — | | `supportDocumentUrl` | query | No | string | The invitation URL of the invitee whose supporting documents you want to fetch. The invitation URL is returned in the Create eSigning Request API response. Accepts either the full invitation URL (e.g., `https://sandbox.leegality.com/sign/544bf18f-...`) or just the UUID portion (e.g., `544bf18f-91b8-4afb-96ee-8ff1927a2726`). **Required when** `documentDownloadType` = `SUPPORTING_DOCUMENT`. Ignored for other `documentDownloadType` values. | — | | `index` | query | No | integer | The 0-based index of the attachment or supporting document to fetch. **Example:** Pass `0` for the first file, `1` for the second, and so on. **Required when** `documentDownloadType` = `ATTACHMENT` or `SUPPORTING_DOCUMENT`. Ignored for `DOCUMENT` and `AUDIT_TRAIL` types. **Error codes:** - `index.not.negative` — Returned if a negative value is passed - `index.out.of.bound` — Returned if the index exceeds the number of available files - `no.attachments.exists` — Returned if no attachments exist for the document | — | --- ## Responses ### 200 — Default Response Response for the Fetch Document API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = Success — the `data.file` field contains the CDN download URL `0` = Failure — check the `messages` array for error details | `1` | | `data` | FetchDocumentData | No | Contains the CDN download URL for the requested file. Empty object `{}` on failure. See **FetchDocumentData** below. | — | | `messages` | array\ | No | Array of error/validation messages. Empty array `[]` on success. **Common error codes:** - `no.document.found` — Document ID not found or document is not in COMPLETED status - `document.download.type` — Invalid `documentDownloadType` value (case-sensitive, must be uppercase) - `no.attachments.exists` — No attachments exist for the given document ID - `index.out.of.bound` — Index exceeds the number of available files - `index.not.negative` — Negative index value passed - `invitation.not.found` — Invalid `supportDocumentUrl` (invitee not found) - `validator.invalid` — Required parameter missing or invalid See **Message** below. | — | #### FetchDocumentData Contains the CDN download URL for the requested file. Empty object `{}` on failure. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `file` | string | No | A temporary CDN download URL for the requested file. **Important:** - The URL expires in **15 seconds**. Download the file immediately at the server level. - Do not use this URL for previewing files in a browser — it is intended for server-side downloads only. - Each API call generates a **unique URL**. If the URL expires, simply call the API again to get a new one. **URL format:** `https:///export//?Expires=&Signature=&Key-Pair-Id=` | `https://sandbox-downloads.leegality.com/export/2026/03/05/70` | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "data": { "file": "https://sandbox-downloads.leegality.com/export/2026/03/05/70476a7c-17bc-4d32-ae64-6687200ca73d?Expires=1772689002&Signature=...&Key-Pair-Id=..." }, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ] } ``` --- URL: https://knowledge.leegality.com/document-execution/api/fetch-document-binary # GET /v3.1/document/fetchDocument — Fetch document (binary) Downloads the signed document, audit trail, sender attachments, or invitee supporting documents in **raw binary format**. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.1/document/fetchDocument?documentId={documentId}&documentDownloadType={documentDownloadType}&supportDocumentUrl={supportDocumentUrl}&index={index} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.1/document/fetchDocument` - Sandbox: `https://sandbox.leegality.com/api/v3.1/document/fetchDocument` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `documentId` | query | Yes | string | The unique Document ID generated by Leegality when the eSigning request was created. Can also be retrieved from the Leegality dashboard. **Note:** `DOCUMENT`, `ATTACHMENT`, and `SUPPORTING_DOCUMENT` types can be fetched at any document stage. `AUDIT_TRAIL` requires the document to be fully completed. | — | | `documentDownloadType` | query | Yes | string | The type of file to download. Only one value can be passed per request — passing multiple values returns error `document.download.type`. **Possible values:** - `DOCUMENT` — The signed PDF document (Content-Type: `application/pdf`). Available at any document stage. - `AUDIT_TRAIL` — The audit trail generated by Leegality (Content-Type: `application/pdf`). Only available after the document is fully completed; returns error `document.not.completed` otherwise. - `ATTACHMENT` — Reference attachments uploaded by the sender (requires `index`). Available at any document stage. - `SUPPORTING_DOCUMENT` — Supporting documents uploaded by an invitee (requires `supportDocumentUrl` and `index`). Available at any document stage. **Note:** Values are **case-sensitive** and must be uppercase. Lowercase or invalid values return error code `document.download.type`. | — | | `supportDocumentUrl` | query | No | string | The invitation URL of the invitee whose supporting documents you want to fetch. Accepts either the full invitation URL (e.g., `https://sandbox.leegality.com/sign/544bf18f-...`) or just the UUID portion (e.g., `544bf18f-91b8-4afb-96ee-8ff1927a2726`). **Required when** `documentDownloadType` = `SUPPORTING_DOCUMENT`. Ignored for other `documentDownloadType` values. | — | | `index` | query | No | integer | The 0-based index of the attachment or supporting document to fetch. **Example:** Pass `0` for the first file, `1` for the second, and so on. **Required when** `documentDownloadType` = `ATTACHMENT` or `SUPPORTING_DOCUMENT`. Ignored for `DOCUMENT` and `AUDIT_TRAIL` types. **Error codes:** - `index.not.negative` — Returned if a negative value is passed - `index.out.of.bound` — Returned if the index exceeds the number of available files - `no.attachments.exists` — Returned if no attachments exist for the document | — | --- ## Responses ### 200 — **On success:** Returns the raw binary file with the appropriate Content-Type header (`application/pdf` for documents and audit trails; varies for attachments and supporting documents). **On error:** Returns a JSON response with `status: 0` and an error code in `messages[].code`. **All errors are returned with HTTP 200** — use the `status` field and `messages[].code` to detect failures, not the HTTP status code. | `messages[].code` | `messages[].message` | |---|---| | `document.not.completed` | Document has not been completed yet. Audit trail cannot be downloaded for incomplete documents. | | `document.download.type` | Document Type (AUDIT_TRAIL,DOCUMENT) Not Supported. Please enter value as : [DOCUMENT, AUDIT_TRAIL, ATTACHMENT, SUPPORTING_DOCUMENT]. | Error response returned when the fetch request fails. On success, this endpoint returns raw binary data (not JSON), so this schema only applies to error responses. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | `0` = Failure | `0` | | `data` | object | No | Empty object `{}` on error. | `[object Object]` | | `messages` | array\ | No | Array of error/validation messages. **Error codes:** - `document.not.completed` — `AUDIT_TRAIL` was requested but the document has not been fully completed yet - `document.download.type` — Invalid or unsupported `documentDownloadType` value, including passing multiple values in the same request - `no.document.found` — Document ID not found or you do not have access to it - `no.attachments.exists` — No attachments exist for the given document - `index.out.of.bound` — Index exceeds the number of available files - `index.not.negative` — A negative index value was passed - `invitation.not.found` — Invalid `supportDocumentUrl` (invitee not found) - `validator.invalid` — A required parameter is missing or invalid See **Message** below. | `[object Object]` | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 0, "data": {}, "messages": [ { "code": "document.not.completed", "message": "Document has not been completed yet. Audit trail cannot be downloaded for incomplete documents." } ] } ``` --- URL: https://knowledge.leegality.com/document-execution/api/mark-document-complete # POST /v3.0/sign/request/complete — Mark document as complete Marks an incomplete (SENT) document as complete, even if not all invitees have signed. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.0/sign/request/complete ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request/complete` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request/complete` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | Yes | Unique identifier of the document to mark as complete. **Format:** Alphanumeric string. Get from the **Create eSigning request** API response or from the dashboard. | `01KJCHYRSQGA24YDZ044BS6MTS` | ### Sample Request ```json { "documentId": "01KJCHYRSQGA24YDZ044BS6MTS" } ``` --- ## Responses ### 200 — Complete document response. Check `status` field: `1` = success, `0` = failure. Response wrapper for the Mark Document Complete API. On success (`status: 1`), `data` is an empty object and the document status changes to COMPLETED. On failure (`status: 0`), `data` is an empty object and `messages` contains the error details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success (document marked as complete), `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. **Error codes:** - `no.document.found` — The document ID does not exist or is not accessible - `document.already.completed` — The document has already been completed (all invitees signed or previously force-completed) **Validation errors (code is `null`):** - `Property documentId cannot be null` — The `documentId` field is missing, null, or empty in the request body See **Message** below. | — | | `data` | object | No | Always an empty object `{}` for this endpoint. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": {} } ``` --- URL: https://knowledge.leegality.com/document-execution/api/resend-notifications # POST /v3.0/sign/request/resend — Resend notifications Resends signing invitation notifications (email/SMS) to invitees who have not yet signed. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.0/sign/request/resend ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request/resend` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request/resend` --- ## Request Body **Content-Type:** `application/json` Request body for resending signing notifications. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `signUrls` | array\ | Yes | Array of sign URLs to resend notifications for. **Size:** 1 to 15 URLs per request. Each URL can be either the full signing URL or just the UUID portion. Get the sign URLs from the **Create eSigning request** API response, **Check transaction status** API, or **Check document details** API. | `https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-8` | ### Sample Request ```json { "signUrls": [ "https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-82c0ff6ce4d8" ] } ``` --- ## Responses ### 200 — Resend response with per-invitee status. Response wrapper for the Resend Notifications API. The top-level `status` is `1` as long as the request format is valid. Check each item in `data.invitations` for per-invitee success or failure. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = request processed (check individual invitation statuses), `0` = request-level failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Request-level error messages. Empty array when the request is valid. **Error codes:** - `validator.invalid` — signUrls array is empty or exceeds 15 items - *(null code)* — signUrls field is missing from the request body See **Message** below. | — | | `data` | ResendData | No | Resend result data. Contains per-invitee results. On request-level failure, this is an empty object `{}`. See **ResendData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### ResendData Resend result data. Contains per-invitee results. On request-level failure, this is an empty object `{}`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `invitations` | array\ | No | Array of per-invitee resend results. One entry per sign URL in the request. See **ResendInvitationResult** below. | — | ##### ResendInvitationResult Result of resending a notification for a single invitee. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | Per-invitee resend status. `1` = notification resent successfully, `0` = resend failed for this invitee. Allowed: `0`, `1`. | `1` | | `name` | string | No | Name of the invitee. Returns `null` if the sign URL is invalid. | `Abhishek Sharma` | | `email` | string | No | Email address of the invitee. Returns `null` if the sign URL is invalid. | `signer@example.com` | | `phone` | string | No | Mobile number of the invitee. Returns `null` if no phone was provided or if the sign URL is invalid. | `9876543210` | | `signUrl` | string | No | The sign URL that was processed. Returns the full URL even if only the UUID was passed in the request. | `https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-8` | | `message` | string | No | Human-readable result message for this invitee. **Success:** - `Invitation(s) sent successfully. Please ask invitees to check their inbox.` **Failure:** - `Document(s) already signed by the invitee.` - `You do not have access to the document.` - `You have already resent invitation mail 5 times. Please contact support@leegality.com for help.` | `Invitation(s) sent successfully. Please ask invitees to chec` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "invitations": [ { "status": 1, "name": "Abhishek Sharma", "email": "signer@example.com", "phone": "9876543210", "signUrl": "https://sandbox.leegality.com/sign/2bdcc3ef-661f-440c-b059-82c0ff6ce4d8", "message": "Invitation(s) sent successfully. Please ask invitees to check their inbox." } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/activate-invitation # PUT /v3.1/invitation/activate — Activate invitation Activates an invitation that is not yet active due to a pre-defined signing order. Use this API to enable invitations out of turn — for example, when an earlier signer is unable to sign and you want subsequent signers to proceed. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/v3.1/invitation/activate?signUrl={signUrl} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.1/invitation/activate` - Sandbox: `https://sandbox.leegality.com/api/v3.1/invitation/activate` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `signUrl` | query | Yes | string | The sign URL (invitation URL) of the inactive invitation to activate. The invitation URL is returned in the Create eSigning Request API response for each invitee. Accepts either the full URL (e.g., `https://sandbox.leegality.com/sign/544bf18f-...`) or just the UUID portion (e.g., `544bf18f-91b8-4afb-96ee-8ff1927a2726`). | — | --- ## Responses ### 200 — Default Response Response for the Activate Invitation API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = Success — the invitation has been activated `0` = Failure — check the `messages` array for error details | `1` | | `data` | object | No | Empty object `{}` for both success and error responses. | `[object Object]` | | `messages` | array\ | No | Array of messages. Unlike most other APIs, this field contains a message on **both success and failure**. **Success code:** - `invitation.activate.success` — Invitation activated successfully. The invitee will receive a notification to sign. **Error codes:** - `sign.url.required` — The `signUrl` parameter is missing or empty - `invitation.not.found` — The sign URL is invalid or you do not have access to the document - `invitation.already.activated` — The invitation is already active (no action needed) - `invitation.signed` — The invitation has already been completed (signed/approved) - `invitation.expired` — The invitation has expired. Use the [Reactivate document](https://knowledge.leegality.com/document-execution/api/reactivate-document) API to reactivate expired invitations - `invitation.completed` — The document has already been completed (all signatures collected) - `invitation.manual.activation.not.allowed` — NeSL invitations cannot be manually activated - `sign.invitation.rejected` — The invitation was rejected by the signer. Re-invite the signer first See **Message** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "data": {}, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ] } ``` --- URL: https://knowledge.leegality.com/document-execution/api/esign-docsigner-invitation # POST /v3.0/sign/docSigner/invitation — eSign DocSigner invitation Signs an invitation configured with the **Document Signer Certificate** (DocSigner) sign type via API. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.0/sign/docSigner/invitation ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/docSigner/invitation` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/docSigner/invitation` --- ## Request Body **Content-Type:** `application/json` Request body for the eSign DocSigner Invitation API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `signUrl` | string | Yes | The sign URL (invitation URL) of the invitation to eSign. The invitation must have DocSigner as the allowed signature type, must be active, and must be unsigned. The sign URL is returned in the Create eSigning Request API response. > **Note:** The auth token must belong to the **invitee's account**. If the auth token belongs to a different account (e.g., the sender's account but the invitee is a different user), the API returns `invitation.not.exists`. | `https://sandbox.leegality.com/sign/6069cd1e-961f-47b1-bd27-a` | | `profileId` | string | Yes | The unique identifier of the DocSigner profile saved in the invitee's Leegality dashboard. **How to find it:** Log into the signer's dashboard and navigate to: Settings > eSignature & Seal > Document Signer Certificate This can be any valid DocSigner profile — whether hosted on Leegality's server or the client's own server. | `d4NrfHV` | | `consent` | string | Yes | The exact consent string required to authorize the eSigning. You must pass this string **exactly as shown** — any changes (including case, spacing, or punctuation) will result in an `invalid.consent` error. **Required value:** `By using this authenticated API and the ProfileID associated with this Document Signer Certificate, I agree that the Document Signer Certificate saved in this Account will be used to eSign documents for me. I also understand that recipients of such electronic documents will be able to see my signing details.` | `By using this authenticated API and the ProfileID associated` | ### Sample Request ```json { "signUrl": "https://sandbox.leegality.com/sign/6069cd1e-961f-47b1-bd27-ac7ba1d7363c", "profileId": "d4NrfHV", "consent": "By using this authenticated API and the ProfileID associated with this Document Signer Certificate, I agree that the Document Signer Certificate saved in this Account will be used to eSign documents for me. I also understand that recipients of such electronic documents will be able to see my signing details." } ``` --- ## Responses ### 200 — Default Response Response for the eSign DocSigner Invitation API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = Success — the document has been signed with the DocSigner certificate `0` = Failure — check the `messages` array for error details | `1` | | `data` | object | No | Empty object `{}` for both success and error responses. | `[object Object]` | | `messages` | array\ | No | Array of messages. Unlike most other APIs, this field contains a message on **both success and failure**. **Success code:** - `signing.success` — The document has been signed successfully **Error codes:** - `invitation.not.exists` — The invitation was not found. This can mean: - The sign URL is invalid or does not exist - The invitation is not a DocSigner type - The invitation has already been signed - The invitation has expired or the document is completed - The auth token does not belong to the invitee's account - `invalid.consent` — The consent string does not match the required exact text - `profile.not.exists` — The DocSigner profile ID is invalid or not found in the invitee's account See **Message** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "data": {}, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ] } ``` --- URL: https://knowledge.leegality.com/document-execution/api/delete-invitation # DELETE /v3.0/sign/request/invitation — Delete invitation Deletes an unsigned invitation from a document, permanently removing the invitee's access. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/v3.0/sign/request/invitation?signUrl={signUrl} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/sign/request/invitation` - Sandbox: `https://sandbox.leegality.com/api/v3.0/sign/request/invitation` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `signUrl` | query | Yes | string | Signature URL of the invitation to delete. **Format:** Either the full sign URL or just the UUID portion. Both formats are accepted: - Full URL: `https://sandbox.leegality.com/sign/db9f8b15-84be-47e4-a885-66cdce4bc80c` - UUID only: `db9f8b15-84be-47e4-a885-66cdce4bc80c` Get from the **Create eSigning request** API response (`invitations[].signUrl`) or from the **Check document details** API response. | — | --- ## Responses ### 200 — Delete invitation response. Check `status` field: `1` = success, `0` = failure. Response wrapper for the Delete Invitation API. On success (`status: 1`), `data` is an empty object and `messages` contains `invitation.deleted.success`. On failure (`status: 0`), `data` is an empty object and `messages` contains the error details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success (invitation deleted), `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. **Success codes:** - `invitation.deleted.success` — Invitation deleted successfully. The invitee will no longer be able to access the document. **Error codes:** - `sign.url.required` — The `signUrl` query parameter is missing or empty - `invitation.not.exists` — The invitation was not found. This can mean: - The sign URL is invalid or does not exist - The invitation has already been signed (signed invitations cannot be deleted) - The invitation was already deleted - The document is completed See **Message** below. | — | | `data` | object | No | Always an empty object `{}` for this endpoint. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": {} } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-stamp-series # GET /v3.1/series/list — List stamp series Returns details of all stamp paper series in your account. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.1/series/list?firstPartyName={firstPartyName}&secondPartyName={secondPartyName}&purpose={purpose}&legend={legend}&underProcess={underProcess}&blocked={blocked}&reserved={reserved}&unused={unused}&used={used}&expired={expired}&total={total} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.1/series/list` - Sandbox: `https://sandbox.leegality.com/api/v3.1/series/list` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `firstPartyName` | query | No | boolean | Include the first party name in each series item. **Default:** `false` — field is omitted from response when not requested. | — | | `secondPartyName` | query | No | boolean | Include the second party name in each series item. **Default:** `false` — field is omitted from response when not requested. | — | | `purpose` | query | No | boolean | Include the purpose/use case configured for each series. **Default:** `false` — field is omitted from response when not requested. | — | | `legend` | query | No | boolean | Include the legend text configured for each series. The legend is the descriptive text printed on the stamp paper. **Default:** `false` — field is omitted from response when not requested. | — | | `underProcess` | query | No | boolean | Include the count of stamps currently under process in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `blocked` | query | No | boolean | Include the count of blocked stamps in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `reserved` | query | No | boolean | Include the count of reserved stamps in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `unused` | query | No | boolean | Include the count of unused (available) stamps in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `used` | query | No | boolean | Include the count of used stamps in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `expired` | query | No | boolean | Include the count of expired stamps in each series. **Default:** `false` — field is omitted from response when not requested. | — | | `total` | query | No | boolean | Include the total stamp count in each series. **Note:** `total` = `unused` + `underProcess` + `blocked` + `used` + `expired` + `reserved`. **Default:** `false` — field is omitted from response when not requested. | — | --- ## Responses ### 200 — Stamp series list retrieved successfully. Response wrapper for the List Stamp Series API. On success (`status: 1`), `data.seriesList` contains the array of stamp series. The `messages` array is empty on success. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | StampSeriesListData | No | Contains the list of stamp series in the account. See **StampSeriesListData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### StampSeriesListData Contains the list of stamp series in the account. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `seriesList` | array\ | No | Array of stamp series objects. Each object represents one stamp paper series configured in the account. See **StampSeriesItem** below. | — | ##### StampSeriesItem Details of a single stamp paper series. The `seriesNumber`, `state`, and `denomination` fields are always present. All other fields are only included when their corresponding query parameter is set to `true`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `seriesNumber` | string | No | Unique series number identifying this stamp series. **Format:** Numeric string, typically zero-padded (e.g., `"01"`, `"07"`). This is the same value used in the `stampSeries` field of the Create eSigning request API. | `07` | | `state` | string | No | Indian state for which the stamp paper is issued. **Examples:** `"Maharashtra"`, `"Delhi"`, `"Tamil Nadu"`, `"All States Revenue Stamp"`. | `Delhi` | | `denomination` | number | No | Stamp paper denomination (face value) in Indian Rupees. **Format:** Decimal number (e.g., `100.0`, `53.0`, `10.0`). | `53` | | `firstPartyName` | string | No | Name of the first party configured for this series. Only present when `firstPartyName=true` is passed. | `ABCD Limited` | | `secondPartyName` | string | No | Name of the second party configured for this series. Only present when `secondPartyName=true` is passed. | `Second party name` | | `purpose` | string | No | Purpose or use case configured for this series. Only present when `purpose=true` is passed. | `General agreement (as per use case)` | | `legend` | string | No | Legend text printed on the stamp paper. This is the descriptive text that appears on the physical stamp paper. Only present when `legend=true` is passed. | `This Stamp Paper forms an integral part of the agreement bea` | | `underProcess` | integer | No | Number of stamps currently under process in this series. Only present when `underProcess=true` is passed. | `0` | | `blocked` | integer | No | Number of blocked stamps in this series. Only present when `blocked=true` is passed. | `3` | | `reserved` | integer | No | Number of reserved stamps in this series. Only present when `reserved=true` is passed. | `0` | | `unused` | integer | No | Number of unused (available) stamps in this series. Only present when `unused=true` is passed. | `258` | | `used` | integer | No | Number of used stamps in this series. Only present when `used=true` is passed. | `142` | | `expired` | integer | No | Number of expired stamps in this series. Only present when `expired=true` is passed. | `0` | | `total` | integer | No | Total number of stamps in this series (across all statuses). **Formula:** `total` = `unused` + `underProcess` + `blocked` + `used` + `expired` + `reserved`. Only present when `total=true` is passed. | `400` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "seriesList": [ { "seriesNumber": "07", "state": "Delhi", "denomination": 53, "firstPartyName": "ABCD Limited", "secondPartyName": "Second party name", "purpose": "General agreement (as per use case)", "legend": "This Stamp Paper forms an integral part of the agreement bearing unique ID No. (Doc. ID.,) , executed between tees and the Borrower.", "underProcess": 0, "blocked": 3, "reserved": 0, "unused": 258, "used": 142, "expired": 0, "total": 400 } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-expiring-stamps # GET /v3.1/series/expiry — List expiring stamp series Returns stamp series that are expiring soon or have already expired. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.1/series/expiry?lookUpPeriod={lookUpPeriod}&includeExpired={includeExpired} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.1/series/expiry` - Sandbox: `https://sandbox.leegality.com/api/v3.1/series/expiry` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `lookUpPeriod` | query | No | integer | Number of days to look ahead for expiring stamps. Only stamps with an expiry date within this many days from today are returned. For example, `lookUpPeriod=30` returns stamps expiring in the next 30 days. **Default:** `30` **Note:** Negative values return 0 results without error. Non-numeric values return a `typeMismatch` error. | — | | `includeExpired` | query | No | boolean | Whether to include already-expired stamp series in the results. When `true`, **all** expired stamps are included regardless of the `lookUpPeriod` value. The expired entries appear alongside the future-expiring entries, sorted by expiry date. **Default:** `false` **Accepted truthy values:** `true`, `TRUE`, `1`. | — | --- ## Responses ### 200 — Expiring stamp series retrieved successfully. Response wrapper for the List Expiring Stamp Series API. On success (`status: 1`), `data.seriesList` contains the array of expiring stamp series. The `messages` array is empty on success. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | StampSeriesExpiryData | No | Contains the list of expiring stamp series. See **StampSeriesExpiryData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### StampSeriesExpiryData Contains the list of expiring stamp series. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `seriesList` | array\ | No | Array of stamp series expiry entries. Each entry represents a unique combination of series number, purchase date, and expiry date. The same series number can appear multiple times if stamps were purchased in separate batches with different expiry dates. Sorted in ascending order by expiry date (earliest expiry first). See **StampSeriesExpiryItem** below. | — | ##### StampSeriesExpiryItem Details of a single stamp series expiry entry. Each entry represents one batch of stamps with a specific purchase and expiry date. The same series number can appear multiple times with different dates. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `expiryDate` | string | No | Expiry date and time of the stamp batch. **Format:** `DD-MM-YYYY HH:MM:SS` (e.g., `"31-12-2025 23:59:59"`). The time component is always `23:59:59` (end of day). | `31-12-2025 23:59:59` | | `purchaseDate` | string | No | Purchase date and time of the stamp batch. **Format:** `DD-MM-YYYY HH:MM:SS` (e.g., `"15-01-2025 12:30:45"`). Contains the actual timestamp of when the stamps were purchased. | `15-01-2025 12:30:45` | | `quantity` | integer | No | Number of stamps in this batch. | `50` | | `seriesNumber` | string | No | Series number identifying the stamp series. **Format:** Numeric string, typically zero-padded (e.g., `"01"`, `"07"`). This is the same value used in the `stampSeries` field of the Create eSigning request API and in the List Stamp Series API. | `07` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "seriesList": [ { "expiryDate": "31-12-2025 23:59:59", "purchaseDate": "15-01-2025 12:30:45", "quantity": 50, "seriesNumber": "07" } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-stamp-groups # GET /v3.0/series/groups/list — List stamp groups Returns details of all stamp groups in your account. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.0/series/groups/list ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/series/groups/list` - Sandbox: `https://sandbox.leegality.com/api/v3.0/series/groups/list` --- ## Responses ### 200 — Stamp groups retrieved successfully. Response wrapper for the List Stamp Groups API. On success (`status: 1`), `data.seriesGroups` contains the array of stamp groups. The `messages` array is empty on success. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | StampGroupListData | No | Contains the list of stamp groups in the account. See **StampGroupListData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### StampGroupListData Contains the list of stamp groups in the account. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `seriesGroups` | array\ | No | Array of stamp group objects. Each object represents one stamp group configured in the account. See **StampGroupItem** below. | — | ##### StampGroupItem Details of a single stamp group. A stamp group bundles one or more stamp series under a common identifier, state, and maximum value limit. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `groupName` | string | No | Display name of the stamp group. | `DL` | | `groupNumber` | string | No | Unique identifier for the stamp group. **Format:** State abbreviation followed by a number (e.g., `"MH01"`, `"DL02"`). | `DL01` | | `maximumValuePermitted` | string | No | Maximum stamp value allowed for this group, in Indian Rupees. **Format:** Numeric string (e.g., `"10000"`, `"1500"`). | `10000` | | `series` | array\ | No | Stamp series belonging to this group. See **StampGroupSeriesItem** below. | — | | `state` | string | No | Indian state associated with this stamp group. **Examples:** `"Maharashtra"`, `"Delhi"`. | `Delhi` | ###### StampGroupSeriesItem A stamp series within a stamp group. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `denomination` | string | No | Stamp paper denomination (face value) in Indian Rupees. **Format:** Decimal string (e.g., `"100.0"`, `"53.0"`). | `100.0` | | `seriesNumber` | string | No | Series number identifying the stamp series. **Format:** Numeric string, typically zero-padded (e.g., `"01"`, `"07"`). This matches the `seriesNumber` from the List Stamp Series API. | `03` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "seriesGroups": [ { "groupName": "DL", "groupNumber": "DL01", "maximumValuePermitted": "10000", "series": [ { "denomination": "100.0", "seriesNumber": "03" } ], "state": "Delhi" } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/get-wallet-balance # GET /v3.0/wallet/balance/details — Get wallet balance Returns the eSign wallet balance for your account. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.0/wallet/balance/details ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/wallet/balance/details` - Sandbox: `https://sandbox.leegality.com/api/v3.0/wallet/balance/details` --- ## Responses ### 200 — Wallet balance retrieved successfully. Response wrapper for the Get Wallet Balance API. On success (`status: 1`), `data` contains the wallet balance breakdown. The `messages` array is empty on success. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | WalletBalanceData | No | eSign wallet balance breakdown. **Balance math:** `total` = `expired` + `consumed` + `unused` + `reserved`. See **WalletBalanceData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### WalletBalanceData eSign wallet balance breakdown. **Balance math:** `total` = `expired` + `consumed` + `unused` + `reserved`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `expired` | number | No | Number of eSign credits that have expired. | `0` | | `reserved` | number | No | Number of eSign credits currently reserved for in-progress documents. | `651` | | `unused` | number | No | Number of eSign credits available for use. | `13194` | | `consumed` | number | No | Number of eSign credits that have been consumed. | `4190` | | `total` | number | No | Total number of eSign credits in the account. **Formula:** `total` = `expired` + `consumed` + `unused` + `reserved`. | `18035` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "expired": 0, "reserved": 651, "unused": 13194, "consumed": 4190, "total": 18035 } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-wallet-purchases # GET /v3.0/wallet/balance/list — List eSign purchases Returns consumption and expiry details of eSign purchases made from your account. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.0/wallet/balance/list?completed={completed}&max={max}&offset={offset} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.0/wallet/balance/list` - Sandbox: `https://sandbox.leegality.com/api/v3.0/wallet/balance/list` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `completed` | query | No | boolean | Filter by purchase consumption status. When `true`, returns only purchases that are fully consumed (no remaining credits). When `false` or omitted, returns purchases that still have eSign credits remaining. **Default:** `false` | — | | `max` | query | No | integer | Maximum number of records to return. **Default:** `20` **Maximum:** `40` | — | | `offset` | query | No | integer | Number of records to skip before returning results. Use with `max` for pagination. **Default:** `0` | — | --- ## Responses ### 200 — eSign purchase list retrieved successfully. Response wrapper for the List eSign Purchases API. On success (`status: 1`), `data.balances` contains the array of purchase entries. The `messages` array is empty on success. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | WalletPurchaseListData | No | Contains the list of eSign purchase entries. See **WalletPurchaseListData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### WalletPurchaseListData Contains the list of eSign purchase entries. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `balances` | array\ | No | Array of eSign purchase entries, sorted by purchase date (oldest first). See **WalletPurchaseItem** below. | — | ##### WalletPurchaseItem Details of a single eSign purchase. **Purchase math:** `purchaseQuantity` = `consumed` + `unused` + `expired`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `consumed` | number | No | Number of eSign credits consumed from this purchase. | `420` | | `expired` | number | No | Number of eSign credits that have expired from this purchase. | `0` | | `expiryDate` | string | No | Expiry date and time of this purchase. **Format:** `DD-MM-YYYY HH:MM:SS`. | `29-05-2025 16:02:12` | | `purchaseDate` | string | No | Date and time when this purchase was made. **Format:** `DD-MM-YYYY HH:MM:SS`. | `29-05-2024 16:02:12` | | `purchaseQuantity` | number | No | Total number of eSign credits in this purchase. **Formula:** `purchaseQuantity` = `consumed` + `unused` + `expired`. | `435` | | `unused` | number | No | Number of eSign credits still available from this purchase. | `15` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "balances": [ { "consumed": 420, "expired": 0, "expiryDate": "29-05-2025 16:02:12", "purchaseDate": "29-05-2024 16:02:12", "purchaseQuantity": 435, "unused": 15 } ] } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/retry-nesl-transaction # POST /v3.3/nesl/neslRetryRequest — Retry NeSL transaction Retries a failed NeSL transaction. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.3/nesl/neslRetryRequest ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/nesl/neslRetryRequest` - Sandbox: `https://sandbox.leegality.com/api/v3.3/nesl/neslRetryRequest` --- ## Request Body **Content-Type:** `application/json` Request body for retrying a NeSL transaction. At least one of `documentId` or `neslTransactionId` must be provided. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | Unique Document ID generated by Leegality for every document in response to a successful create request. | `01KJ7APCJHJZGNRPXWX88MMCRG` | | `neslTransactionId` | string | No | Unique Transaction ID generated by Leegality for every NeSL document. | `kKoJTQ20Pu` | ### Sample Request ```json { "documentId": "01KJ7APCJHJZGNRPXWX88MMCRG", "neslTransactionId": "kKoJTQ20Pu" } ``` --- ## Responses ### 200 — NeSL retry response. Response wrapper for the Retry NeSL Transaction API. On a successful retry, `data.retryStatus` is `"SUCCESS"`. On failure, `data` contains the NeSL error details. When input validation fails (missing IDs, document not found), `data` is empty and errors appear in `messages`. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `0` | | `messages` | array\ | No | Array of response messages. Empty array `[]` when the retry request reaches NeSL (regardless of retry outcome). See **Message** below. | — | | `data` | NeslRetryData | No | NeSL retry result details. This object is empty when input validation fails (missing IDs, document not found). See **NeslRetryData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### NeslRetryData NeSL retry result details. This object is empty when input validation fails (missing IDs, document not found). | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `canRetry` | boolean | No | Whether the transaction can be retried. `true` — retry is allowed, you can call this API again for failed transactions. `false` — retry is not allowed (e.g., due to validation errors that must be fixed first). | `false` | | `responseCode` | string | No | Response code returned by NeSL. **Example:** `"ER00J44"` (Invalid First Party Name). | `ER00J44` | | `responseDescription` | string | No | Human-readable description of the NeSL response code. | `Invalid First Party Name` | | `retryStatus` | string | No | Outcome of the retry attempt. Allowed: `SUCCESS`, `FAILED`. | `FAILED` | ### Sample Response (200) ```json { "status": 0, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "canRetry": false, "responseCode": "ER00J44", "responseDescription": "Invalid First Party Name", "retryStatus": "FAILED" } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/list-nesl-notifications # GET /v3.3/nesl/notification/list — List eBG notifications Returns a list of NeSL eBG (Electronic Bank Guarantee) event notifications. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.3/nesl/notification/list?q={q}&status={status}&requestType={requestType}&sentToMe={sentToMe}&max={max}&offset={offset} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/nesl/notification/list` - Sandbox: `https://sandbox.leegality.com/api/v3.3/nesl/notification/list` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `q` | query | No | string | Search by loan number. Returns all eBG notifications associated with the specified loan number. | — | | `status` | query | No | string | Filter notifications by review status. **Possible values:** `ACCEPTED`, `REJECTED`, `PENDING`. | — | | `requestType` | query | No | string | Filter notifications by eBG event type. **Possible values:** `AMENDMENT`, `RENEWAL`, `EXTEND_OR_PAY`, `CANCELLATION`, `CLOSURE`, `PARTIAL_INVOCATION`, `INVOCATION`. | — | | `sentToMe` | query | No | boolean | Filter by notification recipient. When `true`, returns only notifications sent to the current API user. When `false`, returns all notifications received by any user in the organization. **Default:** `false` | — | | `max` | query | No | integer | Maximum number of results to return. | — | | `offset` | query | No | integer | Number of records to skip before returning results. Use with `max` for pagination. | — | --- ## Responses ### 200 — eBG notifications retrieved successfully. Response wrapper for the List eBG Notifications API. On success (`status: 1`), `data` contains the notification list and total count. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `status` | integer | No | API response status. `1` = success, `0` = failure. Allowed: `0`, `1`. | `1` | | `messages` | array\ | No | Array of response messages. Empty array `[]` on success. See **Message** below. | — | | `data` | NeslNotificationListData | No | Contains the list of eBG notifications and the total count. See **NeslNotificationListData** below. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | #### NeslNotificationListData Contains the list of eBG notifications and the total count. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `notificationList` | array\ | No | Array of eBG notification objects. See **NeslNotificationItem** below. | — | | `totalCount` | integer | No | Total number of notification records matching the query. Use with `max` and `offset` for pagination. | `5` | ##### NeslNotificationItem Details of a single NeSL eBG event notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `eventType` | string | No | Type of the eBG event. **Possible values:** `Amendment`, `Renewal`, `Extend_or_pay`, `Cancellation`, `Closure`, `Partial_invocation`, `Invocation`. | `Invocation` | | `lastUpdated` | string | No | Timestamp of the most recent update to the notification. **Format:** ISO 8601 (e.g., `"2025-08-24T14:15:22Z"`). | `2025-08-24T14:15:22Z` | | `loanNo` | string | No | Loan number associated with the eBG notification. | `LOAN001` | | `notifTxnId` | string | No | Unique notification transaction ID. | `NTX12345` | | `requestId` | string | No | Request ID associated with the eBG notification. | `REQ001` | | `reviewedBy` | string | No | Name of the user who reviewed the notification. Empty or null if not yet reviewed. | `John Doe` | | `status` | string | No | Review status of the notification. **Possible values:** `Accepted`, `Rejected`, `Pending`. | `Pending` | ### Sample Response (200) ```json { "status": 1, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "data": { "notificationList": [ { "eventType": "Invocation", "lastUpdated": "2025-08-24T14:15:22Z", "loanNo": "LOAN001", "notifTxnId": "NTX12345", "requestId": "REQ001", "reviewedBy": "John Doe", "status": "Pending" } ], "totalCount": 5 } } ``` --- URL: https://knowledge.leegality.com/document-execution/api/get-nesl-notification-detail # GET /v3.3/nesl/notification/detail/{notifTxnId} — Get eBG notification detail Returns the complete details of a specific eBG notification. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/v3.3/nesl/notification/detail/{notifTxnId} ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/nesl/notification/detail/{notifTxnId}` - Sandbox: `https://sandbox.leegality.com/api/v3.3/nesl/notification/detail/{notifTxnId}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `notifTxnId` | path | Yes | string | The unique notification transaction ID of the eBG event for which details are to be retrieved. | — | --- ## Responses ### 200 — eBG notification details retrieved successfully. Response object for the Get eBG notification detail API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | NeslNotificationDetailData | No | Wrapper object containing the notification details. See **NeslNotificationDetailData** below. | — | | `messages` | array\ | No | Additional response messages, if any. See **Message** below. | — | | `status` | integer | No | API status code. **Possible values:** - `1` — Success - `0` — Failure | `1` | #### NeslNotificationDetailData Wrapper object containing the notification details. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `notificationDetails` | NeslNotificationDetails | No | Complete details of a single NeSL eBG notification event. See **NeslNotificationDetails** below. | — | ##### NeslNotificationDetails Complete details of a single NeSL eBG notification event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `canReview` | boolean | No | Indicates whether the notification can be reviewed. | — | | `loanDetails` | array\ | No | Contains details of the loan associated with the notification. See **NeslNotificationLoanDetail** below. | — | | `neslTxnId` | string | No | Transaction ID assigned by NeSL. | — | | `notifTxnId` | string | No | Unique notification transaction ID. | — | | `participantDetails` | array\ | No | List of associated participants. See **NeslNotificationParticipant** below. | — | | `portalId` | string | No | Portal ID assigned to the creditor by NeSL. | — | | `rejected` | boolean | No | Indicates if the notification request was rejected. | — | | `requestDetails` | NeslNotificationRequestDetails | No | Details of the request that triggered the eBG notification. See **NeslNotificationRequestDetails** below. | — | | `reviewRemarks` | string | No | Remarks provided during review. | — | | `reviewedBy` | string | No | Name of the reviewer. | — | | `reviewedDate` | string | No | Date when the review was completed. **Format:** ISO 8601 (e.g., `"2025-08-24T14:15:22Z"`). | — | | `status` | string | No | Status of the notification. **Possible values:** `Accepted`, `Rejected`. | — | | `timestamp` | string | No | Timestamp of the notification (if available). | — | ###### NeslNotificationLoanDetail Loan details associated with an eBG notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `claimExpiryDate` | string | No | Claim expiry date of the eBG. **Format:** `YYYY-MM-DD`. | — | | `contractRefNo` | string | No | Contract reference number. | — | | `creditSubtype` | string | No | Credit subtype of the loan. | — | | `currencyOfDebt` | string | No | Currency of the debt (e.g., `INR`). | — | | `event` | string | No | eBG event type. **Possible values:** `INVOCATION`, `AMENDMENT`, `CANCELLATION`, `RENEWAL`, `CLOSURE`, `PARTIAL_INVOCATION`, `ISSUANCE`. | — | | `expiryDate` | string | No | Expiry date of the eBG. **Format:** `YYYY-MM-DD`. | — | | `loanNumber` | string | No | Loan number associated with the eBG. | — | | `loanRemark` | string | No | Remarks related to the loan. | — | | `sanctionAmount` | string | No | Sanctioned amount. | — | | `sanctionCurrency` | string | No | Currency of the sanction (e.g., `INR`). | — | | `totalOutstandingAmount` | string | No | Total outstanding amount. | — | | `vendorCode` | string | No | Vendor code. | — | ###### NeslNotificationParticipant Participant details associated with an eBG notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `businessUnit` | string | No | Business unit of the participant. | — | | `contactRelation` | string | No | Relationship of the participant. **Possible values:** `Beneficiary`, `Creditor`, `Debtor`. | — | | `fullName` | string | No | Full name of the participant. | — | | `officialDocId` | string | No | Official document ID of the participant (e.g., PAN number). | — | | `officialDocType` | string | No | Type of official document (e.g., `PAN card`). | — | ###### NeslNotificationRequestDetails Details of the request that triggered the eBG notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `accountHolderName` | string | No | Name of the account holder. | — | | `accountNumber` | string | No | Account number. | — | | `bankName` | string | No | Name of the bank. | — | | `contactMobile` | string | No | Contact number. | — | | `contactPersonName` | string | No | Full name of the contact person of the party. | — | | `department` | string | No | Department. | — | | `emailId` | string | No | Email address. | — | | `entityName` | string | No | Name of the requesting entity. | — | | `extensionPeriod` | string | No | Extension period. | — | | `ifscCode` | string | No | IFSC code. | — | | `invocationAmount` | string | No | Invocation amount. | — | | `requesRemarks` | string | No | Remarks provided in the request. | — | | `requestDate` | string | No | Date and time when the request was made. | — | | `requestId` | string | No | Unique identifier for the request. | — | | `requestSource` | string | No | Source of the request (e.g., `NeSLPortal`). | — | | `requestType` | string | No | Type of request. **Possible values:** `AMENDMENT`, `RENEWAL`, `EXTEND_OR_PAY`, `CANCELLATION`, `CLOSURE`, `PARTIAL_INVOCATION`, `INVOCATION`. | — | | `requestorRelationship` | string | No | Relationship of the requester to the debt. | — | | `supportingDoc` | string | No | Path to the supporting document. | — | | `userName` | string | No | Name of the user who initiated the request. | — | #### Message Message object containing a machine-readable code and a human-readable description. Used for success confirmations, errors, and warnings. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response message code. | `simpleWorkFlow.success` | | `message` | string | No | Human-readable success or error message. | `Invitations sent successfully.` | ### Sample Response (200) ```json { "data": { "notificationDetails": { "canReview": false, "loanDetails": [ { "claimExpiryDate": "2024-01-01", "contractRefNo": "string", "creditSubtype": "string", "currencyOfDebt": "string", "event": "string", "expiryDate": "2024-01-01", "loanNumber": "string", "loanRemark": "string", "sanctionAmount": "string", "sanctionCurrency": "string", "totalOutstandingAmount": "string", "vendorCode": "string" } ], "neslTxnId": "string", "notifTxnId": "string", "participantDetails": [ { "businessUnit": "string", "contactRelation": "string", "fullName": "string", "officialDocId": "string", "officialDocType": "string" } ], "portalId": "string", "rejected": false, "requestDetails": { "accountHolderName": "string", "accountNumber": "string", "bankName": "string", "contactMobile": "string", "contactPersonName": "string", "department": "string", "emailId": "string", "entityName": "string", "extensionPeriod": "string", "ifscCode": "string", "invocationAmount": "string", "requesRemarks": "string", "requestDate": "string", "requestId": "string", "requestSource": "string", "requestType": "string", "requestorRelationship": "string", "supportingDoc": "string", "userName": "string" }, "reviewRemarks": "string", "reviewedBy": "string", "reviewedDate": "string", "status": "string", "timestamp": "string" } }, "messages": [ { "code": "simpleWorkFlow.success", "message": "Invitations sent successfully." } ], "status": 1 } ``` --- URL: https://knowledge.leegality.com/document-execution/api/review-nesl-notification # POST /v3.3/nesl/notification/review — Review eBG notification Approves or rejects an eBG event notification. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v3.3/nesl/notification/review ``` **Environments:** - Production: `https://app1.leegality.com/api/v3.3/nesl/notification/review` - Sandbox: `https://sandbox.leegality.com/api/v3.3/nesl/notification/review` --- ## Request Body **Content-Type:** `application/json` Request body for reviewing an eBG event notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | object | No | Review details for the eBG notification. See **data** below. | — | #### data Review details for the eBG notification. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `requestId` | string | No | Unique identifier for the request. | — | | `loanNumber` | string | No | The loan number associated with the eBG notification. | — | | `reviewStatus` | string | No | Status of the review. Allowed: `Accepted`, `Rejected`. | — | | `reviewRemarks` | string | No | Remarks or comments provided during the review. | — | | `notifTxnId` | string | No | Unique transaction ID of the notification to be reviewed. | — | ### Sample Request ```json { "data": { "requestId": "string", "loanNumber": "string", "reviewStatus": "Accepted", "reviewRemarks": "string", "notifTxnId": "string" } } ``` --- ## Responses ### 200 — eBG notification review response. Response for the Review eBG Notification API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | object | No | Response data object. Empty on success. | — | | `messages` | array\ | No | Contains details about the response message. See **messages** below. | — | | `status` | integer | No | Indicates API response status. `1` means success. | `1` | #### messages | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | Yes | Response code. | `ebg.notification.review.success` | | `message` | string | Yes | Review confirmation message. | `eBG notification review success.` | ### Sample Response (200) ```json { "data": {}, "messages": [ { "code": "ebg.notification.review.success", "message": "eBG notification review success." } ], "status": 1 } ``` --- URL: https://knowledge.leegality.com/document-execution/api/calculate-nesl-stamp-duty # POST /v4/nesl/stampDuty/calculate — Calculate NeSL stamp duty Calculates the stamp duty amount applicable for a NeSL document based on the consideration amount, article code, and state. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/v4/nesl/stampDuty/calculate ``` **Environments:** - Production: `https://app1.leegality.com/api/v4/nesl/stampDuty/calculate` - Sandbox: `https://sandbox.leegality.com/api/v4/nesl/stampDuty/calculate` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `considerationAmount` | string | Yes | The consideration amount on which stamp duty is to be calculated. - **Format:** Numeric value passed as a string. | `10000` | | `articleId` | string | Yes | Article code applicable for the document type. Use the same article code provided by NeSL. | `115` | | `articleSubCode` | string | No | This is article sub-code. | `159` | | `stateCode` | string | Yes | Two-letter state code where the stamp duty is being paid. Currently supported only for **eGRAS states** (not for SHCIL states). Accepted values are- MH, MP, KL, WB, KA, TS, BH, RJ. Allowed: `MH`, `MP`, `KL`, `WB`, `KA`, `TS`, `BH`, `RJ`. | `MP` | ### Sample Request ```json { "considerationAmount": "10000", "articleId": "115", "articleSubCode": "159", "stateCode": "MP" } ``` --- ## Responses ### 200 — NeSL stamp duty calculation response. Response for the Calculate NeSL Stamp Duty API. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | object | No | Response data object containing the calculated stamp duty. See **data** below. | — | | `messages` | array\ | No | Contains details about the response message. Empty on success. See **messages** below. | — | | `status` | integer | No | Indicates API response status. `1` means success. | `1` | #### data Response data object containing the calculated stamp duty. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `stampDutyAmount` | string | No | The calculated stamp duty amount for the given consideration amount, article code, and state. | `100` | #### messages | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code. | — | | `message` | string | No | Response message. | — | ### Sample Response (200) ```json { "data": { "stampDutyAmount": "100" }, "messages": [ { "code": "string", "message": "string" } ], "status": 1 } ``` --- URL: https://knowledge.leegality.com/document-execution/api/webhooks/webhook-configuration # Webhooks When you send a document for eSigning using Leegality, webhooks can notify you the moment each invitee goes through a signing action — they sign, approve, reject, or fails signature certificate verification, without you having to poll the Check Document Details API. Leegality sends a JSON webhook payload to the endpoint you've configured in the workflow, containing the event type, invitee details, and document status. The payload does not include the signed document or audit trail — use the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to retrieve those once you've received the webhook. ## How It Works 1. You configure webhook URLs for invitee(s) in a document or a workflow in the Leegality dashboard 2. A document is sent using that workflow 3. When an invitee completes or fails a signing action, Leegality sends a JSON payload to the corresponding URL 4. Your server processes the payload and returns any 2XX response 5. If your server does not respond with 2XX, Leegality retries up to 3 more times ## Requirements for Your Endpoint - Must be **publicly accessible** over HTTPS - Must accept **POST** requests with `Content-Type: application/json` - Must return a **2XX** status code (200, 201, or 202) to acknowledge request ## Configuring Webhooks Sender needs to add webhook specific to invitee while creating a workflow. They cannot be set via the Create eSigning Request API. 1. Go to your Leegality dashboard 2. Open the workflow you want to configure (create one if needed) 3. For each invitee, expand **More Options** > **Add custom URLs and webhooks** 4. Enter the URLs you want to receive events on: - **Webhook URL** — for success events - **Error Webhook URL** — for failure and rejection events 5. Set **Webhook Version** to **v2.5** 6. Save the workflow > **Caution** > > Webhook URLs are stored on each document at the time it is sent. Changing URLs on a workflow **does not update documents that have already been sent**. To change webhook URLs for an in-flight document, edit it individually from the dashboard. ## Retry Behavior If your endpoint does not return a 2XX response, Leegality retries the webhook on a fixed schedule: | Attempt | Timing | |---------|--------| | Initial delivery | Immediately when the event occurs | | 1st retry | Immediately after the initial failure | | 2nd retry | 1 hour after the 1st retry | | 3rd retry | 3 hours after the 2nd retry | After 3 failed retries, no further delivery attempts are made. Use the [Check Document Details](https://knowledge.leegality.com/document-execution/api/check-document-details) API to retrieve the document status if a webhook was missed. --- URL: https://knowledge.leegality.com/document-execution/api/webhooks/webhook-event-types # Webhook Event Types ### Success Events Delivered to the **Webhook URL** configured on the invitee. - [Signer Signs Document](https://knowledge.leegality.com/document-execution/api/signer-signs-document) — Signer successfully signed the document - [Reviewer Approves Document](https://knowledge.leegality.com/document-execution/api/reviewer-approves-document) — Reviewer approved the document - [Reviewer Rejects Document](https://knowledge.leegality.com/document-execution/api/reviewer-rejects-document) — Reviewer rejected the document ### Error Events Delivered to the **Error Webhook URL** configured on the invitee. - [Signer Rejects Document](https://knowledge.leegality.com/document-execution/api/signer-rejects-document) — Signer explicitly rejected the document - [Certificate Verification Failed](https://knowledge.leegality.com/document-execution/api/certificate-verification-failed) — Signer's signature certificate details did not match the configured verification criteria and signing was blocked - [Document Expired](https://knowledge.leegality.com/document-execution/api/document-expired) — Document exceeds its configured expiry date ### Coordinate Picker Events Delivered to the **Coordinate Picker Webhook URL**. Only applicable when the **Coordinate Picker** feature is enabled in the workflow. - [Coordinate Picker Webhook](https://knowledge.leegality.com/document-execution/api/coordinate-picker-webhook) — Invitee successfully placed signature coordinates on the document --- URL: https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request # Verify Webhook Request Every webhook payload Leegality sends includes a `mac` field. This is an HMAC-SHA1 signature that lets you confirm the request genuinely came from Leegality and was not tampered with in transit. ## How the MAC Is Computed Leegality computes the `mac` value as: ``` HMAC-SHA1(documentId, privateSalt) ``` Where: - `documentId` is the unique Leegality document ID in the payload - `privateSalt` is your account's private salt from the API Settings tab on the dashboard ## Verification Steps 1. Retrieve your **Private Salt** from **Dashboard** → **API Settings** 2. Extract `documentId` from the incoming webhook payload 3. Compute `HMAC-SHA1(documentId, privateSalt)` on your server 4. Compare your computed value with the `mac` field in the payload 5. If they match — the webhook is authentic. If they don't — discard it. --- URL: https://knowledge.leegality.com/document-execution/api/signer-signs-document # WEBHOOK /your-webhook-endpoint/signer-signs — Invitee Signed Fires when a signer successfully completes a signing action. Delivered to the **Webhook URL** configured on the invitee in the workflow. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/signer-signs ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/signer-signs` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/signer-signs` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Success`, `Error`. | `Success` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KMFEE9T8WPY0WPWXQHQ7DTJ2` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `6b736eb163fba3983a0348bc05ffad62a6cbaea1` | | `messages` | array | No | An array of event messages. | `` | | `verification` | object | No | Certificate verification results. Present as an object when verification is configured, regardless of outcome. - **No verification configured** — all fields are `null`. - **Verification configured** — each field is `true` (match), `false` (mismatch), or `null` (that field not configured). `smartName` is an integer (0–100). If the department is set to **"Reject if failed"**, a mismatch triggers the [Certificate Verification Failed](https://knowledge.leegality.com/document-execution/api/certificate-verification-failed) event instead. If set to **"Accept but show results"**, signing proceeds and results appear here. See **verification** below. | — | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### verification Certificate verification results. Present as an object when verification is configured, regardless of outcome. - **No verification configured** — all fields are `null`. - **Verification configured** — each field is `true` (match), `false` (mismatch), or `null` (that field not configured). `smartName` is an integer (0–100). If the department is set to **"Reject if failed"**, a mismatch triggers the [Certificate Verification Failed](https://knowledge.leegality.com/document-execution/api/certificate-verification-failed) event instead. If set to **"Accept but show results"**, signing proceeds and results appear here. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | boolean | No | Whether the invitee's name matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | | `smartName` | integer | No | Name similarity score against the certificate (0–100). `0` = no match, `100` = exact match. `null` if not configured. | `null` | | `pincode` | boolean | No | Whether the invitee's pincode matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | | `state` | boolean | No | Whether the invitee's state matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | | `title` | boolean | No | Whether the invitee's title matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | | `yob` | boolean | No | Whether the invitee's year of birth matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | | `gender` | boolean | No | Whether the invitee's gender matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `null` | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. Allowed: `Signer`. | `Signer` | | `name` | string | No | The full name of the invitee. | `Abhishek Sharma` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/uuid-here` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `Signed`. | `Signed` | | `error` | string | No | Error message for this event. | `null` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. | `false` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `03-04-2026 23:59:59` | | `rejectionMessage` | string | No | The rejection reason provided by the invitee. | `null` | | `signType` | string | No | The signature method used. - `AADHAAR` - `VIRTUAL_SIGN` - `QUICK_SIGN` - `DSC` - `NESL_SIGN` - `OFFLINE_SIGN` - `DOC_SIGNER` - `AUTOMATED_SIGN` Allowed: `AADHAAR`, `VIRTUAL_SIGN`, `QUICK_SIGN`, `DSC`, `NESL_SIGN`, `OFFLINE_SIGN`, `DOC_SIGNER`, `AUTOMATED_SIGN`. | `AADHAAR` | ### Sample Request ```json { "webhookType": "Success", "documentId": "01KMFEE9T8WPY0WPWXQHQ7DTJ2", "documentStatus": "Sent", "irn": null, "mac": "6b736eb163fba3983a0348bc05ffad62a6cbaea1", "messages": [], "verification": { "name": null, "smartName": null, "pincode": null, "state": null, "title": null, "yob": null, "gender": null }, "request": { "inviteeType": "Signer", "name": "Abhishek Sharma", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/uuid-here", "active": true, "action": "Signed", "error": null, "expired": false, "expiryDate": "03-04-2026 23:59:59", "rejectionMessage": null, "signType": "AADHAAR" } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/reviewer-approves-document # WEBHOOK /your-webhook-endpoint/reviewer-approves — Reviewer Approved Fires when a reviewer successfully approves a document. Delivered to the **Webhook URL** configured on the invitee in the workflow. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/reviewer-approves ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/reviewer-approves` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/reviewer-approves` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Success`, `Error`. | `Success` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KMFEE9T8WPY0WPWXQHQ7DTJ2` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `6b736eb163fba3983a0348bc05ffad62a6cbaea1` | | `messages` | array | No | An array of event messages. | `` | | `verification` | object | No | Certificate verification results. Not applicable to approvers. | `null` | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. Allowed: `Approver`. | `Approver` | | `name` | string | No | The full name of the invitee. | `Abhishek Sharma` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/52b44c7d-803a-4bc2-adb7-e` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `APPROVED`. | `APPROVED` | | `error` | string | No | Error message for this event. | `null` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. | `false` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `03-04-2026 23:59:59` | | `rejectionMessage` | string | No | The rejection reason provided by the invitee. | `null` | | `signType` | string | No | The signature method used. Allowed: `null`. | `null` | ### Sample Request ```json { "webhookType": "Success", "documentId": "01KMFEE9T8WPY0WPWXQHQ7DTJ2", "documentStatus": "Sent", "irn": null, "mac": "6b736eb163fba3983a0348bc05ffad62a6cbaea1", "messages": [], "verification": null, "request": { "inviteeType": "Approver", "name": "Abhishek Sharma", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/52b44c7d-803a-4bc2-adb7-efa58ce45fce", "active": true, "action": "APPROVED", "error": null, "expired": false, "expiryDate": "03-04-2026 23:59:59", "rejectionMessage": null, "signType": null } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/signer-rejects-document # WEBHOOK /your-webhook-endpoint/signer-rejects — Signer Rejected Fires when a signer explicitly rejects a document. Delivered to the **Error Webhook URL** configured on the invitee in the workflow. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/signer-rejects ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/signer-rejects` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/signer-rejects` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Success`, `Error`. | `Error` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KMFPEMC6907ERY22NBBMEEHA` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `7e70aaef3f77eb72d3df19c4411e2d397c48c173` | | `messages` | array | No | An array of event messages. | `` | | `verification` | object | No | Certificate verification results. Not applicable to rejection events. | `null` | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. Allowed: `Signer`. | `Signer` | | `name` | string | No | The full name of the invitee. | `Abhishek Sharma` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/3990a31a-19fa-48f3-b032-e` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `Rejected`. | `Rejected` | | `error` | string | No | Error message for this event. | `Invitation rejected by the signer.` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. | `false` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `03-04-2026 23:59:59` | | `rejectionMessage` | string | No | The rejection reason provided by the signer. Retrieve the signer's reason via the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) using `invitations_invitationStatus_signRejectionMessage`. | `null` | | `signType` | string | No | The signature method used. Allowed: `null`. | `null` | ### Sample Request ```json { "webhookType": "Error", "documentId": "01KMFPEMC6907ERY22NBBMEEHA", "documentStatus": "Sent", "irn": null, "mac": "7e70aaef3f77eb72d3df19c4411e2d397c48c173", "messages": [], "verification": null, "request": { "inviteeType": "Signer", "name": "Abhishek Sharma", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/3990a31a-19fa-48f3-b032-e45b6edd836d", "active": true, "action": "Rejected", "error": "Invitation rejected by the signer.", "expired": false, "expiryDate": "03-04-2026 23:59:59", "rejectionMessage": null, "signType": null } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/reviewer-rejects-document # WEBHOOK /your-webhook-endpoint/reviewer-rejects — Reviewer Rejected Fires when a reviewer rejects a document. Delivered to the **Webhook URL** configured on the invitee in the workflow. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/reviewer-rejects ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/reviewer-rejects` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/reviewer-rejects` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Success`. | `Success` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KGPHV8D39W733W3QBGD5P7SC` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `c1515dd8d930a5accd7934d342cc069b23241b23` | | `messages` | array | No | An array of event messages. | `` | | `verification` | object | No | Certificate verification results. Not applicable to approvers. | `null` | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. Allowed: `Approver`. | `Approver` | | `name` | string | No | The full name of the invitee. | `Abhishek 2nd User` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/ee111a86-5f6d-40e7-9a53-d` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `REJECTED`. | `REJECTED` | | `error` | string | No | Error message for this event. | `null` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. | `false` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `03-04-2026 23:59:59` | | `rejectionMessage` | string | No | The rejection reason provided by the reviewer. | `Document requires amendments before approval.` | | `signType` | string | No | The signature method used. Allowed: `null`. | `null` | ### Sample Request ```json { "webhookType": "Success", "documentId": "01KGPHV8D39W733W3QBGD5P7SC", "documentStatus": "Sent", "irn": null, "mac": "c1515dd8d930a5accd7934d342cc069b23241b23", "messages": [], "verification": null, "request": { "inviteeType": "Approver", "name": "Abhishek 2nd User", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/ee111a86-5f6d-40e7-9a53-d73bfa939473", "active": true, "action": "REJECTED", "error": null, "expired": false, "expiryDate": "03-04-2026 23:59:59", "rejectionMessage": "Document requires amendments before approval.", "signType": null } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/certificate-verification-failed # WEBHOOK /your-webhook-endpoint/verification-failed — Certificate Verification Failed Fires when a signer's signature certificate does not match the verification criteria configured on the invitee (name, pincode, state, title, year of birth, or gender). The signing attempt is blocked and the invitation is terminated. Delivered to the **Error Webhook URL**. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/verification-failed ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/verification-failed` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/verification-failed` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Error`. | `Error` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KFJ9KFSSFV9E97DHM2QTFQJ2` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `b10862af9e05e194e6c6455fc839706ec5c8d554` | | `messages` | array\ | No | An array of event messages. One entry per failed verification field. See **messages** below. | — | | `verification` | object | No | Certificate verification results for each configured field. See **verification** below. | — | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### messages | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Machine-readable verification failure code. - `name.verification.failed` - `smartname.verification.failed` - `pincode.verification.failed` - `state.verification.failed` - `title.verification.failed` - `yob.verification.failed` - `gender.verification.failed` | `name.verification.failed` | | `message` | string | No | Human-readable description of the failure. - `Name doesn't match with the Digital Signature Certificate. Document not signed.` - `Name (Smart Verification) doesn't match with the Digital Signature Certificate. Document not signed.` - `Pincode doesn't match with the Digital Signature Certificate. Document not signed.` - `State doesn't match with the Digital Signature Certificate. Document not signed.` - `Title doesn't match with the Digital Signature Certificate. Document not signed.` - `Year of birth doesn't match with the Digital Signature Certificate. Document not signed.` - `Gender doesn't match with the Digital Signature Certificate. Document not signed.` | `Name doesn't match with the Digital Signature Certificate. D` | #### verification Certificate verification results for each configured field. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | boolean | No | Whether the invitee's name matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | | `smartName` | integer | No | Name similarity score against the certificate (0–100). `0` = no match, `100` = exact match. `null` if not configured. | `0` | | `pincode` | boolean | No | Whether the invitee's pincode matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | | `state` | boolean | No | Whether the invitee's state matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | | `title` | boolean | No | Whether the invitee's title matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | | `yob` | boolean | No | Whether the invitee's year of birth matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | | `gender` | boolean | No | Whether the invitee's gender matched the certificate. - `true` — match - `false` — mismatch - `null` — not configured | `false` | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. Allowed: `Signer`. | `Signer` | | `name` | string | No | The full name of the invitee. | `John Doe` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/2e4ace49-85bd-4dc6-86f9-c` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `null`. | `null` | | `error` | string | No | Error message for this event. | `Verification details doesn't match with the Digital Signatur` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. Can be reactivated from the Leegality dashboard. | `true` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `03-04-2026 23:59:59` | | `rejectionMessage` | string | No | The rejection reason provided by the invitee. | `null` | | `signType` | string | No | The signature method used. Allowed: `null`. | `null` | ### Sample Request ```json { "webhookType": "Error", "documentId": "01KFJ9KFSSFV9E97DHM2QTFQJ2", "documentStatus": "Sent", "irn": null, "mac": "b10862af9e05e194e6c6455fc839706ec5c8d554", "messages": [ { "code": "name.verification.failed", "message": "Name doesn't match with the Digital Signature Certificate. Document not signed." } ], "verification": { "name": false, "smartName": 0, "pincode": false, "state": false, "title": false, "yob": false, "gender": false }, "request": { "inviteeType": "Signer", "name": "John Doe", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/2e4ace49-85bd-4dc6-86f9-c41242c35910", "active": true, "action": null, "error": "Verification details doesn't match with the Digital Signature Certificate. Document not signed.", "expired": true, "expiryDate": "03-04-2026 23:59:59", "rejectionMessage": null, "signType": null } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/document-expired # WEBHOOK /your-webhook-endpoint/invitation-expired — Document Expired Fires when an invitation passes its configured expiry date without the invitee completing the signing action. Delivered to the **Error Webhook URL**. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/invitation-expired ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/invitation-expired` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/invitation-expired` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `webhookType` | string | No | Indicates whether this is a success or error event. Allowed: `Error`. | `Error` | | `documentId` | string | No | The unique Leegality document ID. Use with the [Details API](https://knowledge.leegality.com/document-execution/api/check-document-details) to fetch full document information. | `01KC8ZWZ7ZWNAFTZRYMYMWV84B` | | `documentStatus` | string | No | The document's status at the time of this event. - `"Sent"` — one or more invitees are still pending. - `"Completed"` — all invitees have acted. Allowed: `Draft`, `Sent`, `Completed`. | `Sent` | | `irn` | string | No | Internal Reference Number from the original eSigning request. | `null` | | `mac` | string | No | HMAC-SHA1 of `documentId` using your Private Salt. Use to [verify the webhook](https://knowledge.leegality.com/document-execution/api/webhooks/verify-webhook-request). | `9fc04ef2ce66849096b6c8e393f557794ddd61ac` | | `messages` | array | No | An array of event messages. | `` | | `verification` | object | No | Certificate verification results. | `null` | | `request` | object | No | Details about the invitee associated with this webhook event. See **request** below. | — | #### request Details about the invitee associated with this webhook event. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `inviteeType` | string | No | The role of the invitee in the workflow. | `Signer` | | `name` | string | No | The full name of the invitee. | `Abhishek 2nd User` | | `email` | string | No | The email address of the invitee. | `abhishek@example.com` | | `phone` | string | No | The phone number of the invitee. | `null` | | `invitationUrl` | string | No | The URL for this invitee to sign or review the document. | `https://sandbox.leegality.com/sign/1e330008-e8e6-46b2-8564-d` | | `active` | boolean | No | Indicates whether it is this invitee's turn to act in the signing sequence. | `true` | | `action` | string | No | The action taken by the invitee. Allowed: `null`. | `null` | | `error` | string | No | Error message for this event. | `Transaction timed out.` | | `expired` | boolean | No | Indicates whether the invitation has been terminated. | `true` | | `expiryDate` | string | No | The date and time the invitation is configured to expire. Format: `dd-MM-yyyy HH:mm:ss`. | `null` | | `rejectionMessage` | string | No | The rejection reason provided by the invitee. | `null` | | `signType` | string | No | The signature method used. Allowed: `null`. | `null` | ### Sample Request ```json { "webhookType": "Error", "documentId": "01KC8ZWZ7ZWNAFTZRYMYMWV84B", "documentStatus": "Sent", "irn": null, "mac": "9fc04ef2ce66849096b6c8e393f557794ddd61ac", "messages": [], "verification": null, "request": { "inviteeType": "Signer", "name": "Abhishek 2nd User", "email": "abhishek@example.com", "phone": null, "invitationUrl": "https://sandbox.leegality.com/sign/1e330008-e8e6-46b2-8564-d55f906bfd24", "active": true, "action": null, "error": "Transaction timed out.", "expired": true, "expiryDate": null, "rejectionMessage": null, "signType": null } } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/coordinate-picker-webhook # WEBHOOK /your-webhook-endpoint/coordinate-picker — Coordinate Picker Leegality sends this payload to the **Coordinate Picker Webhook URL** configured in the invitee-level options when eSign coordinates are successfully placed on the document. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` WEBHOOK https://app1.leegality.com/api/your-webhook-endpoint/coordinate-picker ``` **Environments:** - Production: `https://app1.leegality.com/api/your-webhook-endpoint/coordinate-picker` - Sandbox: `https://sandbox.leegality.com/api/your-webhook-endpoint/coordinate-picker` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentId` | string | No | The unique Leegality document ID for the eSigning request. | `01KJ4SVYM95J35XVVJAXDPA7JW` | | `irn` | string | No | The Internal Reference Number passed in the original eSigning request. Returns `null` if no IRN was provided. | `123456` | | `mac` | string | No | HMAC-SHA1 hash of the `documentId` computed with your Private Salt. Use this to verify the webhook is genuinely from Leegality. | `a9cb19205a780900d33acef52cbf86ae04b3023c` | | `invitations` | array\ | No | Array of invitee objects for this document. Each object represents one invitee with their updated signing URL and status after coordinate placement. See **invitations** below. | — | #### invitations | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | The full name of the invitee. | `John Doe` | | `email` | string | No | The email address of the invitee. | `john@example.com` | | `phone` | string | No | The phone number of the invitee. | `9876543210` | | `signUrl` | string | No | The unique signing URL for this invitee, generated after coordinate placement. Share this URL with the invitee to proceed to signing. | `https://app1.leegality.com/sign/uuid-here` | | `active` | boolean | No | Whether this invitation is currently active. | `true` | | `expiryDate` | string | No | The expiry date and time of the invitation. | `07-03-2026 23:59:59` | ### Sample Request ```json { "documentId": "01KJ4SVYM95J35XVVJAXDPA7JW", "irn": "123456", "mac": "a9cb19205a780900d33acef52cbf86ae04b3023c", "invitations": [ { "name": "John Doe", "email": "john@example.com", "phone": "9876543210", "signUrl": "https://app1.leegality.com/sign/uuid-here", "active": true, "expiryDate": "07-03-2026 23:59:59" } ] } ``` --- ## Responses ### 2XX — Return any 2XX status code (200, 201, or 202) to acknowledge receipt. No specific response body is required. Any 2XX status code is accepted. --- URL: https://knowledge.leegality.com/document-execution/api/customise-signing-journey # Customise Signing Journey Leegality customers can now control the user experience of the signing journey without relying on our SDKs. This option provides new query parameters to enhance the user experience of the Success Page. ## Dynamic Redirect URL - **Parameter:** `redirectUrl` - **Description:** Redirect invitees to a specific URL after they complete the signing process. - **Possible value:** Any https URL with a valid format. **Example:** `https://app1.leegality.com/sign/ea83da79-b228-492b-9e81-dad68trea4b5?redirectUrl=https://google.com` > **Info** > > If a redirect URL is specified in the workflow, it will override any redirect URL appended to the signURL using the `redirectUrl` parameter. ## Custom Countdown Timer - **Parameter:** `timer` - **Description:** Set how long the success page stays open before redirecting to the redirectUrl. - **Possible value:** 0 to 60 **Example:** `https://app1.leegality.com/sign/ea83ee79-b228-999b-9e49-faf68dade4b5?timer=30` > **Info** > > If the invitee clicks the **OK** button before the timer expires, they will be redirected immediately. ## Control the Visibility of the OK Button - **Parameter:** `Okbutton` - **Description:** Decide whether the **OK** button is shown on the success page. By default, OK button is always visible to the invitee. - **Possible value:** `false` **Example:** `https://app1.leegality.com/sign/ea83ee79-b999-492b-9e44-faf68dade4b5?timer=30\&Okbutton=false` In this example, the OK button will not be displayed on the success page because `Okbutton=false`. > **Info** > > The OK button will be displayed if the parameter is not passed. --- URL: https://knowledge.leegality.com/document-execution/api/error-reference # Error Reference Error code reference for the Document Execution APIs. ### SSL/TLS Connection Errors SSL/TLS Connection Errors occur when a secure HTTPS connection cannot be established between the client application and the Leegality server. As a result, the API request fails before it reaches the application layer. **Common Root Causes:** - **TLS Version Mismatch:** Client is using an older TLS version (e.g., TLS 1.0 or TLS 1.1) while the server supports only TLS 1.2 or above. - **Untrusted or Missing Root/Intermediate Certificates:** The client system does not trust the certificate chain presented by the server. - **SSL Certificate Validation Failure:** Hostname mismatch, expired certificate, or invalid certificate chain. - **Firewall or Proxy Interference:** Corporate firewall or proxy is intercepting SSL traffic and preventing successful handshake. - **SSL Handshake Failure:** Cipher suite mismatch between client and server, or unsupported encryption algorithms. - **Network Connectivity Issues:** Intermittent network failures causing connection termination during SSL negotiation. - **Incorrect Trust Store Configuration:** Required root/intermediate certificates are not imported into the application's trust store (Java Keystore, Windows Certificate Store, etc.). - **Mutual TLS (mTLS) Configuration Issues:** If applicable, client certificate is missing, expired, or incorrectly configured.
CodeMessageDescriptionSolution
(TLS handshake failure)
  • SSLHandshakeException
  • PKIX path building failed
  • Certificate path validation failed
  • Received fatal alert: handshake_failure
  • Unable to find valid certification path to requested target
  • javax.net.ssl.SSLException
  • A timeout error occurred whilst performing an SSL socket operation
The client cannot establish a secure TLS connection with the Leegality server.
  1. Verify the endpoint URL is HTTPS.
  2. Confirm the client supports TLS 1.2 or higher.
  3. Check whether the SSL certificate is valid and trusted.
  4. Verify firewall/proxy restrictions.
  5. Review application logs for SSL handshake exceptions.
  6. Test connectivity using tools such as OpenSSL, Postman, or Curl.
  7. Compare successful and failed requests.
  8. Check whether the issue occurs for all API calls or only specific endpoints.
### Authentication Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Access Denied | The `X-Auth-Token` header is missing from the request | Add the `X-Auth-Token` header with a valid authentication token | | *(empty)* | *(HTTP 401/403)* | The provided authentication token is invalid or expired | Obtain a new valid authentication token from the dashboard | ### Required Field Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Property profileId cannot be null | The `profileId` field is missing or set to null | Provide a valid workflow profile ID in the `profileId` field | | null | Property file cannot be null | The `file` object is missing from the request | Include a `file` object with either `base64` content or `fields` array | | workflow.api.fields.or.file.required | Either file base64 or fields required for file. | The `file.fields` array is empty, OR the `profileId` is invalid/non-existent | Provide either `file.file` with document content OR `file.fields` with form field values. Also verify the `profileId` exists | | simpleWorkFlow.no.payload.invitee | Either send Invitees data or configure at least one Invitees in dashboard | The `invitees` array is empty and no invitees are configured in dashboard | Provide at least one invitee in the `invitees` array with name and email/phone | ### Invitee Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Invitee(N) name is required. | The invitee at index N has an empty or missing name | Provide a non-empty `name` for each invitee | | null | Invitee(N) email or phone is required. | The invitee at index N has neither email nor phone | Provide at least one of `email` or `phone` for each invitee | | null | Invitee(N) email is invalid. | The email format for invitee at index N is invalid | Provide a valid email address (e.g., `user@domain.com`) | | signer.reviewer.name.invalid[N] | Signer/Reviewer name is invalid for invitee N. | The invitee name contains invalid special characters (`<`, `>`, `'`, `&`, etc.) or Unicode | Use only alphanumeric characters, spaces, and basic punctuation (`.`, `-`, `,`) in names | | invitee.org.name.invalid[N] | Organisation name, under company seal, is invalid for Invitee N. | The `organizationName` contains invalid characters (HTML tags, `<`, `>`, etc.) | Use only alphanumeric characters and basic punctuation in organization name | | invalid.group.name[N] | Invalid input in Group Name. | The `groupName` contains invalid special characters | Use only alphanumeric characters and allowed special chars: `| - : () , _. [] & / # + @` | ### File & Fields Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Property file cannot be null | The `file` object is completely missing | Include a `file` object in your request | | workflow.api.fields.or.file.required | Either file base64 or fields required for file. | Neither `file.file` nor `file.fields` is provided, or `fields` is an empty array | Provide `file.file` with base64-encoded document content, OR provide `file.fields` array with field values matching the workflow template | ### IRN Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | irn.length.invalid | IRN can not be greater than 255 characters. | The Internal Reference Number exceeds 255 characters | Shorten the IRN to 255 characters or less | ### Stamp Configuration Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Stamp Series required for this Workflow Profile | Stamp is enabled in workflow but `stampSeries` or `multipleStampSeries` is missing/empty/null | Provide a valid `stampSeries` or `multipleStampSeries` array when stamp is enabled in the workflow | | invalid.stamp.series.value | Invalid input in stamp series. Allowed input includes numeric characters only. | The `stampSeries` contains non-numeric characters | Use only numeric characters (0-9) for stamp series. Example: `"03"` not `"TEST-03"` | | no.active.series.or.no.stamp.found | No active series found or sufficient active stamps not found in the series. | The stamp series doesn't exist, has no available stamps, or the format doesn't match exactly | Verify the series exists in dashboard, check stamp availability, match format exactly (e.g., `"03"` not `"3"` or `"003"`) | | workflow.stamp.series.mismatch | Stamp Series Number [X] mismatch with configured workflow. | The API-provided stamp series doesn't match the pre-configured series in dashboard | Use the exact stamp series configured in the workflow dashboard | | multiple.stamp.states.used | Please use stamps of same state only. | The `multipleStampSeries` array contains stamps from different states | Ensure all stamps in `multipleStampSeries` are from the same state | | stamp.quantity.less.than.1 | For multiple series minimum quantity per series is 1. | The `seriesQuantity` is 0, empty, or missing | Provide `seriesQuantity` with a value of at least `"1"` for each entry | | invalid.stamp.series.group | Invalid input in stamp group. Allowed input includes alphanumeric characters only. | The `seriesGroup` contains special characters | Use only alphanumeric characters (A-Z, a-z, 0-9) for `seriesGroup` | | workflow.excel.stamp.amount.invalid | Invalid Stamp Amount/Quantity. | The `stampValue` contains non-numeric characters | Provide a numeric string for `stampValue`. Example: `"100"` not `"abc"` | | stamp.value.exceeds.maximum.allowed.group.limit | Stamp value exceeds maximum allowed series group limit. | The `stampValue` exceeds the maximum allowed for the series group | Reduce the `stampValue` to within the allowed limit | | invalid.revenue.stamp.series | Invalid input in revenue stamp. Allowed input includes numeric characters only. | The `revenueStampSeries` contains non-numeric characters | Use only numeric characters for `revenueStampSeries` | | stamp.group.does.not.exist | Stamp group does not exist. | The `seriesGroup` value doesn't match any existing stamp group | Use a valid stamp group code that exists in your account | | no.stamp.combinations.found | Insufficient stamps in the stamp group to create desired stamp value. | The stamp group doesn't have enough stamps to create the requested value | Reduce the `stampValue` or ensure the stamp group has sufficient stamps | | selected.group.max.value.exceeded | Maximum allowed value for the selected group is Rs [X]... | The `stampValue` exceeds the maximum configured for the stamp group | Reduce the `stampValue` to be within the group's configured maximum | | null | Stamp Group is required for this Profile. | `seriesGroup` is missing when stamp group feature is enabled | Provide a valid `seriesGroup` value | | null | Stamp Amount is required. | `stampValue` is missing or zero when stamp group feature is enabled | Provide a valid non-zero `stampValue` | ### Face Match Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | workflow.face.match.invalid.image | The reference image for face match is either empty or invalid (max size - 4.5MB, formats - jpg, jpeg or png). | The `faceMatchImage` is empty, missing, or exceeds size/format limits | Provide a valid base64-encoded image (jpg/jpeg/png, max 4.5MB) | | invitee.invalid.face.match.image | Face Match Image type is invalid. | The `faceMatchImage` contains invalid base64 data or includes a data URI prefix | Remove any data URI prefix (e.g., `data:image/png;base64,`) and provide only the raw base64 string | ### GPS Configuration Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | typeMismatch | Property allowedLatitude is type-mismatched | The GPS coordinates are not in the correct format (non-numeric) | Provide coordinates as string decimal values. Example: `"29.982643"` | | location.restriction.true.allowed.longitude.required | allowedLongitude configured mandatory when applyLocationRestriction=true, value is required. | GPS location restriction is enabled but longitude is empty | Provide both `allowedLatitude` and `allowedLongitude` when `applyLocationRestriction` is true | | location.restriction.true.allowed.latitude.required | allowedLatitude configured mandatory when applyLocationRestriction=true, value is required. | GPS location restriction is enabled but latitude is empty | Provide both `allowedLatitude` and `allowedLongitude` when `applyLocationRestriction` is true | | invalid.gps.accuracy.permissableRadius | Invalid Permissible Radius. Enter any number from 0 to 9999999 | The `permissibleRadius` is negative or outside the valid range | Provide a value between 0 and 9999999 | | invalid.gps.accuracy.deviation | Please enter a valid value for Default Allowed Accuracy Deviation Acceptance Condition (Range : 0-99999) | The `accuracyThreshold` is negative or outside the valid range | Provide a value between 0 and 99999 | ### Group Invitee Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Group Id: [ID], Group name is required. | A group invitee is missing the `groupName` field | Provide `groupName` for all invitees with a `groupId` | | null | Group Name: [name], Completion Threshold is required. | The `completionThreshold` is missing, empty, or zero for a group | Provide a `completionThreshold` value of at least 1 | | null | GroupName: [name], Completion Threshold value cannot be greater than invitees in group. | The `completionThreshold` exceeds the number of invitees in the group | Set `completionThreshold` to be less than or equal to the number of invitees in the group | | group.invitees.workflow.incorrect.payload | Group ID [ID] cannot have more than 0 Invitees. | The `groupId` doesn't match the workflow-configured group | Use the exact `groupId` configured in the workflow dashboard | ### 2FA Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | Invitee(N) Two-Factor Authentication enabled hence Email and Phone No. can not be empty. | 2FA is enabled but the invitee is missing email or phone | Provide BOTH `email` AND `phone` for all invitees when 2FA is enabled | ### CC Recipients Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | null | CCInvitee(N) email is invalid. Either send CC Invitees data or configure in dashboard. | The CC recipient email format is invalid OR CC configuration mismatch | Provide a valid email address for CC recipients and ensure CC invitees are configured in dashboard | ### Signing-Time Errors These errors occur during the signing process, not at document creation. The API accepts these configurations but signing fails. | Code | Message | Description | Solution | |------|---------|-------------|----------| | *(signing error)* | You are outside the permissible area. | The signer's GPS location is outside the allowed radius | Verify coordinates are correct, increase `permissibleRadius`. Do not use `permissibleRadius: 0` | | *(signing error)* | Your GPS location accuracy is low. | The signer's device GPS accuracy doesn't meet the threshold | Increase `accuracyThreshold` to a reasonable value (e.g., 100-1000). Do not use `accuracyThreshold: 0` | ### GPS Config Ignored (Feature Not Enabled) > **Warning — warnings** > > These are warnings returned in a successful response (status: 1). The request succeeds but values are ignored. | Code | Message | Description | Solution | |------|---------|-------------|----------| | workflow.captureLocation.off.allowed.latitude.ignored | Invitee(N) captureLocation is not on. allowedLatitude value ignored. | GPS is not enabled in workflow but coordinates were sent | Enable GPS in workflow dashboard, or remove `gpsConfig` from request | | workflow.captureLocation.off.allowed.longitude.ignored | Invitee(N) captureLocation is not on. allowedLongitude value ignored. | GPS is not enabled in workflow but coordinates were sent | Enable GPS in workflow dashboard, or remove `gpsConfig` from request | | workflow.captureLocation.off.permissable.radius.ignored | Invitee(N) captureLocation is not on. permissableRadius value ignored. | GPS is not enabled in workflow but radius was sent | Enable GPS in workflow dashboard, or remove `gpsConfig` from request | ### GPS Config Ignored (Toggle OFF) > **Warning — warnings** > > These are warnings returned in a successful response (status: 1). The request succeeds but values are ignored. When "Allow sender to make changes while running" toggle is OFF in dashboard: | Code | Message | Description | Solution | |------|---------|-------------|----------| | workflow.allowGpsConfigChange.off.allowed.latitude.ignored | Invitee(N) allowGpsConfigChange is not on. allowedLatitude value ignored. | API latitude is ignored; dashboard value used instead | Turn ON "Allow sender to make changes" toggle in workflow | | workflow.allowGpsConfigChange.off.allowed.longitude.ignored | Invitee(N) allowGpsConfigChange is not on. allowedLongitude value ignored. | API longitude is ignored; dashboard value used instead | Turn ON "Allow sender to make changes" toggle in workflow | | workflow.allowGpsConfigChange.off.permissable.radius.ignored | Invitee(N) allowGpsConfigChange is not on. permissableRadius value ignored. | API radius is ignored; dashboard value used instead | Turn ON "Allow sender to make changes" toggle in workflow | | workflow.allowGpsConfigChange.off.accuracy.deviation.ignored | Invitee(N) allowGpsConfigChange is not on. accuracyThreshold value ignored. | API accuracy threshold is ignored; dashboard value used instead | Turn ON "Allow sender to make changes" toggle in workflow | | workflow.allowGpsConfigChange.off.location.restriction.ignored | Invitee(N) allowGpsConfigChange is not on. applyLocationRestriction value ignored. | API location restriction flag is ignored | Turn ON "Allow sender to make changes" toggle in workflow | | workflow.allowGpsConfigChange.off.accuracy.restriction.ignored | Invitee(N) allowGpsConfigChange is not on. applyLocationAccuracy value ignored. | API accuracy restriction flag is ignored | Turn ON "Allow sender to make changes" toggle in workflow | ### Stamp Group Ignored (Dashboard Pre-defined) > **Warning — warnings** > > These are warnings returned in a successful response (status: 1). The request succeeds but values are ignored. | Code | Message | Description | Solution | |------|---------|-------------|----------| | workflow.stamp.warning | Warning: Stamp series already assigned to profile, given value for stamp series ignored. | seriesGroup is pre-defined in dashboard; API value is ignored | Use the dashboard-configured seriesGroup value, or remove seriesGroup from request | ### Aadhaar Config Ignored (Verification Disabled) > **Warning — warnings** > > These are warnings returned in a successful response (status: 1). The request succeeds but values are ignored. | Code | Message | Description | Solution | |------|---------|-------------|----------| | invitee.aadhaar.config.verify.certificate.off.property.ignored | Invitee(N) verify certificate details is not on. [property] value ignored. | Aadhaar verification master toggle not enabled | Enable Aadhaar verification in workflow dashboard | | invitee.aadhaar.config.verify.off.name.ignored | Invitee(N) verifyNameOn is not on. verifyName value ignored. | Name verification toggle disabled | Enable "Verify Name" toggle on dashboard | | invitee.aadhaar.config.verify.off.smartname.ignored | Invitee(N) verifySmartNameOn is not on. verifySmartName value ignored. | Smart name verification toggle disabled | Enable "Verify Smart Name" toggle on dashboard | | invitee.aadhaar.config.verify.off.yob.ignored | Invitee(N) verifyYobOn is not on. verifyYob value ignored. | Year of birth verification toggle disabled | Enable "Verify YOB" toggle on dashboard | | invitee.aadhaar.config.verify.off.gender.ignored | Invitee(N) verifyGenderOn is not on. verifyGender value ignored. | Gender verification toggle disabled | Enable "Verify Gender" toggle on dashboard | | invitee.aadhaar.config.verify.off.title.ignored | Invitee(N) verifyTitleOn is not on. verifyTitle value ignored. | Title verification toggle disabled | Enable "Verify Title" toggle on dashboard | | invitee.aadhaar.config.verify.off.pincode.ignored | Invitee(N) verifyPincodeOn is not on. verifyPincode value ignored. | Pincode verification toggle disabled | Enable "Verify Pincode" toggle on dashboard | | invitee.aadhaar.config.verify.off.state.ignored | Invitee(N) verifyStateOn is not on. verifyState value ignored. | State verification toggle disabled | Enable "Verify State" toggle on dashboard | ### Aadhaar Config Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | typeMismatch[N] | Property N is type-mismatched | Aadhaar field has wrong type (e.g., string instead of boolean, or invalid enum value) | Check field types: verifyName/verifySmartName are booleans; verifyYob/verifyGender/verifyState/verifyPincode are strings | | certificate.pin.code.invalid[N] | Certificate pin code is invalid for invitee N. | Invalid pincode format in verifyPincode | Use valid 6-digit numeric pincode string (e.g., `"110001"`) | | certificate.title.invalid[N] | Certificate title is invalid for invitee N. | Invalid verifyTitle format | Use last 4 digits of Aadhaar number (e.g., `"3870"`), NOT titles like "Mr"/"Shri" | | null | Invitee(N) configured mandatory for Aadhaar [field] verification, value is required. | Toggle is enabled on dashboard but API didn't send value | Provide value for enabled verification fields | ### NeSL Required Data Errors These errors occur when required NeSL data is missing or incomplete. | Code | Message | Description | Solution | |------|---------|-------------|----------| | nesl.sign.neslRequestData.required | Required nesl api data for nesl sign. | The `neslData` object is missing from the request when an invitee has NeSL eSign type | Include the `neslData` object with `documentDetail`, `participants`, and optionally `stampData` | | nesl.stamp.data.required | At least one stamp data is required for stamping flow. | stampData array is empty and participants are missing or invalid | Provide at least one entry in `stampData`, or ensure `participants` array is valid | | nesl.participants.equal.nesl.invitees | Participants should be equal to nesl invitees. | The number of entries in `participants` doesn't match the number of NeSL-type invitees | Ensure `participants` count equals the number of invitees with NeSL eSign type | | nesl.first.invitee.party.debtor | Invitee/Party 1 should have Contact Relation 'Debtor'. | The first participant doesn't have `contactRelation` set to `DEBTOR`, or `fullName` is missing | Set the first participant's `contactRelation` to `DEBTOR` and ensure `fullName` is provided | | null | Invitee(N) configured mandatory for Nesl [field] verification, value is required., | NeSL verification is enabled on dashboard but the corresponding `neslConfig` field is missing | Provide all mandatory `neslConfig` verification fields (verifyPincode, verifyState, verifyYob, verifyTitle, verifyGender) | ### NeSL Document Detail Errors ### Missing Required Fields These errors follow the pattern `neslData.documentDetail.[field].validator.invalid` or `neslData.documentDetail.[field].nullable`. | Code | Message | Description | Solution | |------|---------|-------------|----------| | neslData.documentDetail.[field].validator.invalid | [field] is required for document detail. | A required documentDetail field is missing | Provide the required field. Required fields vary by `registrationType` — see below | | neslData.documentDetail.[field].nullable | [field] is required for document detail. | A required documentDetail field is null | Provide a non-null value for the field | | neslData.documentDetail.docRefNo.validator.invalid | docRefNo is required for document detail. | `docRefNo` is missing for `NON_LENDING` registrationType | Provide an alphanumeric `docRefNo` value | ### Enum Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | registration.type.invalid | Invalid registration type. | The `registrationType` value is not recognized | Use one of: `INDIVIDUAL_LOAN`, `NON_INDIVIDUAL_LOAN`, `NON_LENDING`, `EBG` | | debt.type.invalid | Invalid debt type. | The `typeOfDebt` value is not recognized | Use one of: `FINANCIAL`, `OPERATIONAL` | | acount.closed.flag.type.invalid | Invalid account closed flag. | The `accountClosedFlag` value is not recognized. Note: error code has typo "acount" | Use one of: `YES`, `NO`, `ASSIGNED` | | fund.type.invalid | Invalid fund type. | The `fundType` value is not recognized | Use one of: `FUNDED`, `NON_FUNDED` | | sanction.currency.type.invalid | Invalid currency type. | The `sanctionCurrency` value is not recognized | Use `INR` (only accepted value) | | credit.sub.type.invalid | Invalid credit sub type. | The `creditSubtype` value is not valid for the given `registrationType` | Use `CREDIT_FACILITY` or `PROPERTY_BUYER` for INDIVIDUAL_LOAN / NON_INDIVIDUAL_LOAN | | event.type.invalid | Invalid event type. | The `event` value is not recognized (EBG only) | Use a valid event type value for EBG | ### Format Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | nesl.field.date.error | Please enter date Of Sanction in format YYYY-MM-DD. | The `dateOfSanction` is not in the required date format | Use `YYYY-MM-DD` format (e.g., `2018-02-02`) | | field.value.alphanumeric | Please enter the correct value of Document Reference Number in alphanumeric characters only. | The `docRefNo` contains non-alphanumeric characters (hyphens, spaces, etc.) | Use only letters and numbers (e.g., `DOCREF001` not `DOC-REF-001`) | ### NeSL Participant Errors ### Missing Required Fields | Code | Message | Description | Solution | |------|---------|-------------|----------| | invitee.field.required | Mobile Number is required for NESL request for invitee N. | The participant is missing `mobileNumber` | Provide `mobileNumber` for each participant | | invitee.field.required | Date of Birth is required for NESL request for invitee N. | The participant is missing `dob` | Provide `dob` in `YYYY-MM-DD` format | | invitee.field.required | Official DocId is required for NESL request for invitee N. | The participant is missing `officialDocId` | Provide the document ID matching the `officialDocType` | | invitee.field.required | Official Doc is required for NESL request for invitee N. | The participant is missing `officialDocType` | Provide one of: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID` | | invitee.field.required | Legal Constitution is required for NESL request for invitee N. | The participant is missing `legalConstitution` | Provide a valid `legalConstitution` value (e.g., `RESIDENT_INDIVIDUAL`, `PRIVATE_LTD`) | | invitee.field.required | PartyType is required for NESL request for invitee N. | The participant is missing `partyType` | Provide one of: `INDIAN_ENTITY`, `RESIDENT_INDIVIDUAL`, `FOREIGN_ENTITY`, `NRI` | | invitee.field.required | Registered Address is required for NESL request for invitee N. | Required for `NON_INDIVIDUAL_LOAN` participants | Provide `registeredAddress` for NON_INDIVIDUAL_LOAN | | invitee.field.required | Registered Pin Code is required for NESL request for invitee N. | Required for `NON_INDIVIDUAL_LOAN` participants | Provide `registeredPinCode` for NON_INDIVIDUAL_LOAN | | invitee.field.required | Communication Address is required for NESL request for invitee N. | Required for `NON_INDIVIDUAL_LOAN` participants | Provide `communicationAddress` for NON_INDIVIDUAL_LOAN | | invitee.field.required | Communication Address Pin Code is required for NESL request for invitee N. | Required for `NON_INDIVIDUAL_LOAN` participants | Provide `communicationAddressPinCode` for NON_INDIVIDUAL_LOAN | ### Enum Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | party.type.invalid | Invalid party type. | The `partyType` value is not recognized | Use one of: `INDIAN_ENTITY`, `RESIDENT_INDIVIDUAL`, `FOREIGN_ENTITY`, `NRI` | | constitution.type.invalid | Invalid constitution type. | The `legalConstitution` value is not recognized | Use one of: `RESIDENT_INDIVIDUAL`, `PUBLIC_LTD`, `PRIVATE_LTD`, `LLP`, `PROPRIETORSHIP`, `PARTNERSHIP`, `ENTITY_CREATED_BY_STATUTE`, `TRUST`, `HUF`, `CO_OP_SOCIETY`, `ASSOCIATION_OF_PERSONS`, `GOVERNMENT`, `SELF_HELP_GROUP`, `NON_RESIDENT`, `FOREIGN_COMPANY` | | invitee.field.invalid | Please enter Contact Relation valid value for invitee N. | The `contactRelation` value is not recognized | Use one of: `CREDITOR`, `DEBTOR`, `GUARANTOR`, `CO_OBLIGANT`, `SECURITY_PROVIDER`, `ASSIGNEE`, `BENEFICIARY` | | official.doc.type.invalid | Invalid doc type. | The `officialDocType` value is not recognized | Use one of: `PAN_CARD`, `DRIVING_LICENSE`, `VOTER_ID`, `PASSPORT`, `ANY_OTHER_OFFICIAL_ID`. Note: `AADHAAR` is not valid | ### Format Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | invitee.field.date.error | Please enter Date of Birth in format YYYY-MM-DD for invitee N. | The `dob` is not in the required date format | Use `YYYY-MM-DD` format (e.g., `2020-12-10`) | | invitee.field.value.alphanumeric | Please enter the correct value of Contact Person in alphanumeric characters only for invitee N. | The `contactPersonName` contains non-alphanumeric characters (hyphens, etc.) | Use only letters, numbers, and spaces in `contactPersonName` | | invitee.field.pan | Please enter Pan Card valid pan number for invitee N. | The `officialDocId` is not a valid PAN format when `officialDocType` is `PAN_CARD` | Provide a valid 10-character PAN number (e.g., `BHSPM9753J`) | | invitee.field.pan.error | Please enter valid pan number(C or E as fourth letter) for invitee N. | For `NON_INDIVIDUAL_LOAN`, the PAN must be a company PAN (4th letter C or E) | Use a company PAN with C or E as the 4th character (e.g., `AABCE1234F`) | ### NeSL Stamp Data Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | neslData.stampDatas.validator.invalid | firstParty is required for stamp N | The `firstParty` field is missing in stamp data entry N | Provide `firstParty` name for each stamp data entry | | neslData.stampDatas.validator.invalid | secondParty is required for stamp N | The `secondParty` field is missing in stamp data entry N | Provide `secondParty` name for each stamp data entry | | neslData.stampDatas.validator.invalid | stampDutyAmount is required for stamp N | The `stampDutyAmount` field is missing in stamp data entry N | Provide `stampDutyAmount` for each stamp data entry | | neslData.stampDatas.validator.invalid | considerationPrice is required for stamp N | The `considerationPrice` field is missing in stamp data entry N | Provide `considerationPrice` for each stamp data entry | | neslData.stampDatas.validator.invalid | descriptionOfDocument is required for stamp N | The `descriptionOfDocument` field is missing in stamp data entry N | Provide `descriptionOfDocument` for each stamp data entry | | neslData.stampDatas.validator.invalid | stampDutyPaidBy is required for stamp N | The `stampDutyPaidBy` field is missing in stamp data entry N | Provide `stampDutyPaidBy` for each stamp data entry | | neslData.stampDatas.validator.invalid | articleCode is required for stamp N | The `articleCode` field is missing in stamp data entry N | Provide `articleCode` for each stamp data entry | ### NeSL Security Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | neslData.neslSecurities.validator.invalid | assetsType is required for security N | The `assetsType` field is missing in security entry N | Provide one of: `MOVABLE`, `IMMOVABLE`, `INTANGIBLE`, `NOT_CLASSIFIED` | | neslData.neslSecurities.validator.invalid | chargeType is required for security N | The `chargeType` field is missing in security entry N | Provide one of: `MORTGAGE`, `HYPOTHECATION`, `CHARGE`, `ASSIGNMENT`, `PLEDGE`, `LIEN`, `NEGATIVE_LIEN`, `GUARANTEE`, `OTHERS`, `NOT_CLASSIFIED` | | neslData.neslSecurities.validator.invalid | assetId is required for security N | The `assetId` field is missing in security entry N | Provide an asset ID string | | neslData.neslSecurities.validator.invalid | securityDescription is required for security N | The `securityDescription` field is missing in security entry N | Provide a description of the security | ### NeSL Config Validation Errors | Code | Message | Description | Solution | |------|---------|-------------|----------| | typeMismatch[N] | Property N is type-mismatched | A neslConfig field has an invalid value (e.g., invalid `verifyGender` like "X") | Check field values: `verifyGender` must be `M`, `F`, or `T`; `verifyYob` accepts integer or string | | certificate.pin.code.invalid[N] | Certificate pin code is invalid for invitee N. | The `verifyPincode` is not a valid 6-digit pin code (e.g., `"ABC"`) | Use a valid 6-digit numeric pincode string (e.g., `"247667"`) | ## POST /v3.0/sign/request/reactivate — Reactivate Document | Code | Message | Description | Solution | |------|---------|-------------|----------| | signinvitation.activate.success | Invitation activated successfully | *(Success — not an error)* | — | | no.expired.invitation.found | No expired invitation exists | The document is completed, rejected, active, or already reactivated — no expired invitation to reactivate | Verify the document status before calling this endpoint. Only expired documents can be reactivated | | no.document.found | No document found | The provided document ID does not exist | Check that the `documentId` is correct and belongs to your account | | invalid.expiry.days.value | Invalid expiry days value | `expiryDays` is outside the valid range | Provide a value between `-1` and `365`. Use `-1` for no expiry | | invalid.expiry.time | Invalid expiry time | `expiryTime` is in the past or is a negative timestamp | Provide a future Unix timestamp (milliseconds) for `expiryTime` | | invalid.expiry.time.maxerror | Invalid expiry time — exceeds maximum | `expiryTime` is more than 365 days from now | Provide an `expiryTime` within 365 days from the current date | --- URL: https://knowledge.leegality.com/document-execution/api/resources # SDKs and Utilities SDKs and utilities to help you integrate Leegality APIs into your platform. [Web SDK Front-end SDK for integrating Leegality into web applications](https://gitlab.leegality.com/leegality-public/web-sdk) [Android SDK Front-end SDK for integrating Leegality into Android applications](https://gitlab.leegality.com/leegality-public/android-sdk) [Android Biometric SDK APK file for front-end biometric integration on Android](https://gitlab.leegality.com/leegality-public/leegality-helper) [iOS SDK Front-end SDK for integrating Leegality into iOS applications](https://gitlab.leegality.com/leegality-public/ios-sdk) [Document Signer Server Utility Backend utility for server-side document signing integration](https://gitlab.com/leegality-public/docsigner) [USB Dongle Utility Windows and Mac desktop utility for DSC-based signing. Requires Java 8.](https://gitlab.leegality.com/leegality-public/dsc-utility) --- URL: https://knowledge.leegality.com/deal-collaboration/getting-started # Introduction to Deal Collaboration This article provides an overview of the capabilities of Leegality’s Contract Lifecycle Management tool—**Deal Collaboration**. [Leegality](https://leegality.com/) is a leader in the Document Execution space, and as a company with the goal to digitize paperwork, we are here with the next leg of productive digital transformation. From draft to execution, Deal Collaboration has been tailor-made for the unique needs of Indian businesses, enabling them to manage contracts with minimal effort. It allows business teams to review, negotiate, and collaborate on a deal without the handholding of the legal teams. We have mindfully kept this tool simple and eliminated all the clutter and chaos of conventional CLM tools. ### Home Page The homepage gives you an overview of all your deals. You can see the number of contracts under review, contracts under negotiation and the contracts that have been executed. The left panel on the home page offers you easy navigation to various capabilities of the tool. - [**Tasks:**](https://knowledge.leegality.com/deal-collaboration/tasks) A collaborator can see all the tasks assigned to them by accessing tasks. A list of tasks is also visible in the middle section of the home page. Here you can also see the name of the task, the document that the task has been assigned, and the status of such document - directly from the home page.s - [**Contracts:**](https://knowledge.leegality.com/deal-collaboration/Contracts/initiate-contract) This is where you go to initiate a deal. This is also a repository of all contracts where you get access to all the information about the contracts that you are currently negotiating as well as the deals that you have closed. - [**Templates:**](https://knowledge.leegality.com/deal-collaboration/Templates/create-template) Templates allow you to create drafts with dynamic variables and sections simplifying document creation and management. This enables you to reuse fixed formats without the need to draft from scratch. - [**Workflows:**](https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow) With Workflows, you can automate your contract review processes by customizing the review and negotiation journeys and assigning specific users different roles and responsibilities. - [**Settings:**](https://knowledge.leegality.com/deal-collaboration/Settings/global-variables) Currently settings allow you to add global variables. ## How do you collaborate and negotiate on Deal Collaboration? There are various steps involved in negotiating a contract on Deal Collaboration. 1. You start with creating a contract with variables and sections—this is called a Template. 2. Once you have created a Template, you can either save it as a draft to edit later or publish the template. 3. Once a Template is published, it is ready to be used in a Workflow. A workflow can be set up using a template (outbound deals) or you can upload a draft received from a counterparty (inbound deals). 4. Setting up the Workflow involves various steps like selecting the relevant document, assigning specific roles to different users and enabling TAT to conclude the deal on time. 5. To initiate a deal, you need a pre-existing Workflow. It is at this stage that you introduce the counterparty, check internal collaborators and send the agreement to be reviewed. 6. The collaborators are now assigned tasks and as they complete the assigned tasks, the status of the contract keeps changing. - Reviewers review the contract - The initiator sends it for external review and uploads the document it receives from the Counterpart POC. - The business negotiator negotiates the business terms of the contract and the legal negotiator approves the document after checking for legal risks. 7. Once all the collaborators have performed their tasks, the contract can be configured for signing by the Legal Negotiator or the Initiator. 8. A task is created on the Contract Listing page to configure signing, this redirects you to Leeglaity’s Execution Platform - where you can easily configure a signing journey. 9. As soon as all the parties sign the document, the status of the document is changed to executed and the journey of your contract is complete. --- URL: https://knowledge.leegality.com/deal-collaboration/Templates/create-template # Creating a Template To create a template in Deal Collaboration’s software, follow these steps: 1. Select **Templates** from the left navigation panel. 2. Click **+ Add Template** on the top right and select: - **Create Template:** Start with a blank document and create a template from scratch. - **Upload Template:** Upload a pre-built document and create template using it. (**Note:** Allowed documet format is `.docx`) 3. Enter an appropriate **Template Name**. 4. A MS Word-like editor will open. You can use this editor to type and format your template similar to MS Word. > **Tip** > > The template name is displayed in the top-left corner of the window, along with the template version. Click the __Edit__ icon to rename the template. ## Add Variables to Templates Variables are dynamic fields within templates where users can input specific information. To add a variable to your template: 1. Click on the document where you want to add a variable and then click on **Add Variables** from the right side panel. 2. In the Select Variable dropdown, you have two options. - **Global Variables**: [Global variables](https://knowledge.leegality.com/deal-collaboration/Settings/global-variables) are pre-built variables available to all users in organization. In a situation where your internal terminology does not match the global variables, you can set an alias. > **Info — Example** > > Suppose you refer to the execution date as the effective date in your contracts. In that case, you can simply add the execution date as a variable and put the effective date (your terminology) as an alias for this variable. > > Now this variable will show as an effective date for all contracts. If you want to add an alias, just select the **Set Alias** checkbox, and add the **Variable Name (Alias)**. Now this alias will appear throughout the document. - **Custom Variables**: Alternatively, you can add a custom variable. To do this, select the **+ Add Custom Variable** option to add a new custom variable. 3. Enters the **Name** of the variable. 4. In Variable Type, you have five options. - **Text:** Allows users to input textual information, such as names, addresses, descriptions, etc. - **Number:** Used for capturing numerical data, such as tenure, amount or any other numeric values. - **Dropdown:** Provides users with a predefined list of options from which they can select one. Useful for presenting users with a limited set of choices, such as categories, statuses, or predefined values. - **Checkbox:** Used for capturing Yes or No responses. - **Date:** Specifically used for capturing date. It could be date of initiation, appointment dates, deadlines, or any other date values. 5. In **Placeholder Text:** Enter text to provide hints or examples of the expected input. > **Info — Note** > > You can mark a variable as **Optional**, allowing the deal initiator to decide whether to fill it or leave it blank. ## Create a Section in Template Sections provide flexibility and control over the contents of a template. They enable deal initiators to customise documents by keeping or removing specific sections according to the requirements of each agreement. You can select different parts of the document and mark them in the same section. The deal initiator has option to keep or remove specific sections when they use the template, without having to change the template itself. Specific sections can be assigned to Reviewer so they can review the text within those sections during deal negotiation. To add a section to your template: 1. Select a portion of the text you want to convert into a section. 2. After that click on **Add Section** from the right side panel. 3. Click the **Select Section** dropdown and choose **+ Add Custom Section** to create a new section. 4. Enter the **Section Name** and the **Placeholder Text**. - **Mark as Optional**: Enable this and the deal initiator will have the option to keep or remove this section. You can also add a **Question for Initiator**. 5. Click **Save**. After adding required variable fields and creating sections, you can either Save template as a **Draft** or **Publish Template** to use in the workflow. --- # Templates URL: https://knowledge.leegality.com/deal-collaboration/Templates/Templates > A template is a pre-designed contract format used to create standardized agreements efficiently. Instead of building a new contract from scratch each time, temp A template is a pre-designed contract format used to create standardized agreements efficiently. Instead of building a new contract from scratch each time, templates allow users to define the full content of a document including dynamic components that can be tailored for each use case. Templates are especially useful for commonly used agreements and other recurring legal or business documents. ### Key Features of Templates: * __Reusable Format:__ Once created, templates can be reused across multiple contracts, significantly reducing effort and ensuring consistency. * __Customizable Content:__ Templates support variable fields (also called metadata) that can be configured to reflect dynamic information. These variables enable smart contract behavior by allowing filtering, reporting, and the generation of insights based on key contract data. * __Section Management:__ Contract sections can be customized, making the template adaptable to various use cases and business requirements. * __Smart Document Functionality:__ Templates function similarly to intelligent Word documents that integrate seamlessly with the broader contract lifecycle management system. Templates that are still in progress or under review appear under the __Drafts__ section. Once finalized, templates are moved to the __Published__ section, making them available for active use across workflows. --- URL: https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow # Create a Workflow Workflows are useful for contracts you use often. You can create a standard process for review and negotiation once and then use it again and again. With Workflows, you can customize the review and negotiation process for contract journeys by designating specific users, different roles and responsibilities within the journey. There are three steps involved in creating a Workflow. ## Workflow Details 1. Select **Workflows** from the left navigation menu. 2. Click the **+ Create Workflow** button on the top right. 3. Select **Workflow Type**. Choose between **Outbound Deal** or **Inbound Deal** or both, depending on your requirements. - **Outbound Deal:** If you want to use your template for this deal. - **Inbound Deal:** If you want to upload the document shared by the counterparty. 4. Enter **Workflow Name** and **Description**. - For __Outbound Deals__, select the template(s) you want to use from the dropdown. A second field appears, allowing you to choose the version of the selected template. For each selected template, an **Assign Folder** button appears: - Click **Assign Folder** to open a popup and select a pre-configured folder for that template now. - Leave it **unassigned** to let the user select a folder at the Deal Initiation stage when running the workflow. - **Assign to Selected Templates:** After assigning a folder to the first template, check this box to apply the same folder to all selected templates. This avoids repetitive action. > **Info — Note** > > The **Assign to Selected Templates** checkbox is only available at the Edit Workflow stage. - For __Inbound Deals__, you can assign a folder for the documents that will be uploaded during deal initiation. You can configure it now or leave it open for the user to assign while running the workflow. > **Info** > > Both options can be enabled to accommodate documents received from the counterparty and those generated internally. ## Configure Collaborators On the next screen, you will see a list of collaborators. You can add the reviewers and the negotiators to the workflow at this stage. Below is a brief description of each collaborator. ### Initiator The initiator will [initiate the contract](https://knowledge.leegality.com/deal-collaboration/Contracts/initiate-contract) using this workflow. ### Pre-sharing Reviewer The pre-sharing reviewer reviews the document or a variable or a section in the document. You can add one or more reviewers, and different reviewers can review different variables and sections of the document. You can assign specific variables or sections to specific reviewers. 1. Click **+ Add Reviewer**. 2. You can either **assign a reviewer immediately or add them during deal initiation**. a. __To assign during workflow setup:__ Search and select the reviewer’s name, then choose the relevant template from the __Assign Template__ dropdown. b. __To assign during deal initiation:__ Simply select the template to be reviewed; reviewers can be added at that stage. - **Review Complete Document:** Specify the template that the reviewer needs to review. - **Review Specific Variables:** Enable this to assign particular variables to reviewers. Use the dropdown menu to select the specific variables that reviewers will review after deal initiation. - **Review Specific Sections:** Enable this to assign specific sections to reviewers. Use the dropdown menu to select the sections that reviewers will review after deal initiation. 3. You can include multiple pre-sharing reviewers and assign them different variables and sections to review. > **Info — ALERT** > > Pre-sharing reviewer unavailable with Inbound Workflow. ### Counterparty POC The Counterparty POC (Point of Contact) is the individual who negotiates on behalf of the counterparty during [deal negotiation](https://knowledge.leegality.com/deal-collaboration/deal-negotiation/introduction). You need to provide their contact details when initiating a deal. Configure how the document is shared with the counterparty using the __Counterparty Sharing Mode__ section. - Click __Share via Leegality Link__ to send the contract using a Leegality link. This link is specially configured to allow counterparty members that you configure, to access and review the document by logging in as **Guest Users** and getting access to the contract. An automated email is sent to those invited via this link, and they can login as Guest Users, view, download, upload their own version of the document and mark it as Final. Enable this option to share the Leegality link when sending the document for external review. - To share it outside the platform, click **Share Manually** and send the downloaded document manually. > **Info** > > You can also select both options to share the document. ### Negotiator The person who will be handling the negotiation of the contract. There are two types of negotiators. - **Business Negotiator:** Business negotiators will handle the negotiation with the counterparty POC. - Enable **Same as Initiator** if you want the business negotiator to be the same as the deal initiator. - Or, you can either **assign a Business Negotiator immediately** or **add them during deal initiation**. To Assign Now, simply search for their name, and then specify the template to the negotiator. - **Legal Negotiator:** Engages in legal review of documents during deal negotiation. - Click **+ Add Legal Reviewer** button. - You can either **Assign Now** or you can **Add during deal initiation**. To Assign Now, simply search for their name, and then specify the template. You can add multiple negotiators by clicking the **+ Add Business Negotiator** button below. 1. Click **Continue** to go to the **Workflow Settings** page. 2. Click **Previous** to go back. 3. Click **Cancel** to exit the workflow configuration. The progress made will be saved in the Workflow page as draft. A pop-up window appears as below: 4. Click **Exit** to confirm the cancellation. Click **Stay** to continue on the page. ## Workflow Settings ### TAT (Turnaround Time) Settings TAT allows you to set deadlines for specific collaborators. If a collaborator exceeds the set deadline, they will receive email notifications. ![TAT Settings](\img\DC-Counterparty-TAT.PNG) 1. Open the **TAT Settings**. 2. Select the **Collaborator** to whom you want to send the TAT notifications. 3. **Specify the TAT for Task** by entering the number of days within which the task should be completed. TAT value can be between 1 to 20 days. 4. Enable **Send TAT Breach email notification/s** to send recurring mail notifications. Upon enabling the same, the following fields appear: - **Repeat Breach Notifications**: Enable the toggle if you want to send recurring notifications for missed TAT deadlines. - __Repeat Every__: Enter how often the TAT breach notifications should be sent (in days). (Example: If set to 1, an email will be sent daily; if set to 2, an email will be sent every 2 days.) - __At Time__: Set the time of day (in HH:MM) when the notification should be sent. - __Ends After__: Specify the number of notifications after which the repeated TAT breach notifications should stop. 5. Add __Additional notification recipients__ for TAT breach notifications, if needed. (Note: The additional recipients will receive the CC email notification.) 6. Repeat the same steps to configure TAT notifications for other collaborators. 7. Click the __Continue__ button to save the workflow. The workflow has been created successfully. You will now get redirected to the **Workflow** page. --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/ai-smart-extraction # AI Smart Etraction AI Smart Extraction automatically detects and extracts key data points from your contracts using artificial intelligence. This feature reduces manual data entry and ensures all critical contract metadata is centralised in a searchable repository. ## How Smart Extraction Works Smart Extraction uses AI to analyse your contracts and extract variables such as deal value, effective date, tenure, renewal date, counterparty details, and any custom variables configured in your account. You can use Smart Extraction in two ways: | Method | When to Use | | :---- | :---- | | **During Upload** | Extract variables from new contracts as you upload them | | **From Repository** | Extract variables from contracts already uploaded to your repository | For Smart Extraction during upload, refer to the [Uploading Contracts](https://knowledge.leegality.com/deal-collaboration/Contracts/upload-contracts) page. --- ## Smart Extraction from Repository Extract variables from contracts already in your repository without re-uploading them. This is particularly useful when: - You have legacy contracts that need variable extraction - You create new global variables and need historical data populated - You want to extract additional variables not selected during upload ### Access Smart Extraction #### Single Contract 1. Go to **Contracts** from the left. 2. Click on a contract to open its **Contract Details** page. 3. Click the **Extract** button displayed on the page. #### Multiple Contracts (Bulk Extraction) 1. Go to **Contracts** from the left. 2. Select multiple contracts using the checkboxes. Make sure you select contracts in the **Executed** stage. 3. Click the **Smart Extraction** button. > **Info — Note** > > The **Smart Extraction** button is always visible, even if the contract has been extracted before. Clicking it will initiate a re-extraction. ### Select Variables for Extraction When you initiate Smart Extraction, a popup appears with variable selection options. 1. Review the variable chips under **All Variables**. 2. Click the variables you want the AI to extract. 3. Selected variables move to the **Selected Variables** section. 4. Click **Proceed** to start extraction. > **Info — Note** > > Core variables such as counterparty name, deal name, and document name are skipped during extraction from the repository since they already exist in the system. ### Review and Confirm Extracted Values After extraction completes, a toast message confirms that the extraction is done and ready for review. To review the AI-extracted values for accuracy: 1. Go to the **Contract Details** page for the processed contract. 2. Click **Review** to go to the **Review Extraction** page. This page allows you to validate the information and resolve flagged issues. 3. Edit any values that need correction manually. 4. Click **Confirm** next to each variable to verify it. 5. Click **Add Variables to Contract**. This moves the contract from the Pending section to the Add to Contracts Queue section. > **Tip** > > Click **Confirm All** to confirm all variables the AI has extracted at once. > **Warning — Important** > > Unconfirmed variables (those with the AI icon) do not appear in filters or search results. Confirm all extracted values to enable full filtering capabilities. Once you confirm a variable, it is stored as a permanent data point in your repository and the AI icon is removed. > > Always confirm previously extracted variables before running a new extraction. If you re-run Smart Extraction without confirming existing values, the new batch will replace all previously extracted but unconfirmed values — even if you select different variables in the new batch. To learn more about the detailed review process, refer to [Contracts Processing Hub](https://knowledge.leegality.com/deal-collaboration/Contracts/Contracts%20Processing%20Hub/contracts-processing-hub). ### Re-extract Variables You can re-extract variables from any contract at any time. This is useful when: - You need to extract additional variables not selected initially - New custom variables have been added to your account - You want to refresh extracted values from the source document To re-extract: 1. Go to the **Contracts** page. 2. Open the contract — a banner displays "AI-generated values detected!" indicating the document has been extracted before. 3. Click **Re-extract** from the banner to repeat extraction. 4. Alternatively, click **Review** to see the details of the last extraction. > **Info — Note** > > There is no restriction on the number of times you can perform re-extraction. > **Warning — Important** > > Before re-extracting, make sure all previously extracted variables are confirmed. Running a new extraction will replace any unconfirmed values from previous batches, even if the new batch targets different variables. Always review and confirm extracted values before initiating another round of extraction. ## Processing Status After initiating extraction, contracts go through the following states: | Status | Description | | :---- | :---- | | **Pending** | Contract is queued for AI analysis | | **Ready for Review** | Extraction complete — review and confirm extracted values | | **Completed** | All variables confirmed and available in filters | Monitor bulk extraction progress in the [Contracts Processing Hub](https://knowledge.leegality.com/deal-collaboration/Contracts/Contracts%20Processing%20Hub/contracts-processing-hub). ## Version History To view the history of extractions performed on a contract: 1. Go to the **Contract Details** page of the selected contract. 2. Click the **Clock** icon next to any variable to view its history. 3. A popup opens displaying: - All actions performed on that variable - Who made the change and what value was set - The original extracted value - An AI icon alongside variables that are not yet confirmed --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/initiate-contract # Initiate a Contract This article guides you through the step-by-step process for initiating a new contract within the ***Deal Collaboration*** by Leegality. #### Prerequisite Ensure you have created following before proceeding. - [Template](https://knowledge.leegality.com/deal-collaboration/Templates/create-template) - [Workflow](https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow) To initiate a new deal, select **Contracts** from the left navigation panel and Click the **+ Initiate Contract** button on the top right. The deal initiation process is divided into four steps. ## Step 1 - Deal Form 1. Enter the **Counterparty name**. Start typing to search existing users, or click **+ Add Counterparty** to add a new one. Once added, the counterparty details can be reused in future deals. 2. Enter the **Deal Name**. Start typing to search existing deals, or click **+ Add Deal Name** to add a new one. > **Info** > > Deal name must be unique. 3. Select the desired **Workflow** by searching its name. 4. Select **Template** configured under the workflow. > **Info — Note** > > In case you have used an Inbound Workflow- you need to upload the documents received from the counterparty. > * Supported format: Docx > * Maximum file size: 14 MB 5. **Assign Folder:** A folder field appears in the deal form. - If a folder was **pre-assigned** during [workflow configuration](https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow), the field appears **disabled** — the folder mapping is already set and cannot be changed here. - If the folder was **left unassigned** in the workflow, select a folder from the available options now. 6. Click **Proceed**. ## Step 2 - Document Details 1. On the next screen, you’ll be able to preview the document with all **Variable Fields** and **Sections** in the panel on the right side. > **Info — Note** > > You cannot edit the document content at this stage. 2. You need to input values for variable fields in the panel on the right. 3. You also keep or remove sections at this stage. 4. Click **Preview** to see what the filled template looks like and then **Proceed**. ## Step 3 - Collaborators In this step, the deal initiator needs to provide the details of all collaborators. 1. Enter the **Counterparty POC’s Name**.Note that special characters are not allowed. 2. Enter the **Counterparty Email Address**. The counterpart POC name and email address can be modified at certain stages following **Deal Initiation**. This flexibility ensures that users are not constrained by the need to finalize POC details during the initial setup. If the correct POC is not known at the time of initiation, the information can be updated later as needed based on evolving requirements. > **Info** > > The **Share via Leegality link** option is not available at this stage. To use this option, it must be configured during the **Workflow creation** process. 2. For other collaborators: - **Pre-sharing Reviewer** - **Business Negotiator** - **Legal Negotiator** The initiator will see the details as configured in the workflow. If these collaborators were not added at the time of [workflow creation](https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow) they have to be added at this stage. > **Info** > > In the above example, collaborator details were configured during workflow creation. ## Step - 4 Review and Confirm You can review all provided information before initiating the deal. 1. Here, you will see the final document with filled variable fields and sections. 2. In the right panel, you can confirm variable fields and their respective values. 3. Also, you can check collaborators along with sections and variables assigned to them. 4. Once satisfied with all the document details, click **Initiate Deal**. After a deal is initiated, it moves to the [negotiation](https://knowledge.leegality.com/deal-collaboration/deal-negotiation/introduction) stage. User is redirected to the **Contracts** page. > **Info** > > A pop-up appears: > **Deal initiated! View Deal.** 5. Click **View Deal** to to go to the list of contracts under the deal. --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/upload-contracts # Uploading Contracts The **Upload Contract** feature lets you upload completed agreements into the Deal Collaboration platform for centralized management and efficient processing. ## Why Upload Previous Contracts? * **Centralised Management:** All contracts will be stored in one place, making them easier to manage. * **Efficient Search:** You can [filter contracts](https://knowledge.leegality.com/deal-collaboration/Contracts/find-contracts) based on variables such as deal value, effective date, tenure, renewal date, and more, streamlining the process of finding specific documents. ## Upload a Single Contract Use this method to upload and process one contract document at a time. ![Upload Document window in DC](\img\DC_Upload_Contract.png) ### Step 1: Upload the Document ![Upload individual document](\img\DC_Upload-individually.PNG) 1. Select **Contracts** from the left navigation panel. 2. Click the **Upload Contracts** button in the top-right corner. 3. Upload the contract in __PDF__ format. > **Note:** The maximum file size is 14 MB. 4. **Assign Folder (Optional):** Select a folder to organise this contract. Choose from the pre-configured folders available in the dropdown. 5. Click **Next**. ### Step 2: Select Upload Type In this step, you can select how to populate the contract details: **Smart Extraction** or **Add Contract Data Manually**. #### Smart Extraction #### AI Smart Extraction **AI Smart Extraction** can automatically detect and pull key data points from your uploaded contract. Smart Extraction enables users to upload contracts in bulk or individually and extract key insights. The feature performs two primary functions: * **Data Extraction:** The AI model analyses the uploaded document and extracts key data points/metadata that you have selected. * **Repository Organization:** Extracted information is automatically organized into a single, searchable repository within the system. This automation significantly reduces the time required for data validation and ensures all critical contract metadata is centralized for quick access and complex querying. ![Smart extraction in single upload](\img\DC_Smart_Extraction_Individual.PNG) 1. Click **Smart Extraction** as **Select Upload type**. 2. Review the variable chips displayed under the **All variables** section. 3. Click the chips for the variables you want the AI to detect and extract. The selected variables will move to the **Selected variables** section. The AI scans your contract for all selected variables, confirming their presence and providing accurate, keyword-extracted insights. 4. **Add data manually:** Users can manually fill variable data with known values. The Smart AI will prioritize these manual entries and skip extraction for those specific fields. This optional step is ideal when you are certain about specific metadata and wish to bypass AI processing. 5. Click **Proceed**. #### Manual Upload #### Add Contract Data Manually If you choose to skip smart extraction, you must fill in all required contract details directly on the screen. 1. Fill in the following **Mandatory Fields:** * Counterparty Name * Counterparty POC Name * Counterparty POC Email address * Deal Name * Document Name Custom variables configured in your account are also available here. 2. Click **Proceed**. ## 2. Bulk Contract Upload Use this method to upload and process multiple contracts that fall under a single deal or batch. It is particularly useful when supporting contract details are pre-collected in an XLS template. ### Step 1: Upload the ZIP File ![Upload bulk contract](\img\DC_Upload-in-Bulk.PNG) 1. Go to the **Contracts** section using the left navigation panel. 2. Click the **Upload Contracts** button at the top-right corner. 3. Choose the **Upload in Bulk** option. 4. **Prepare Your Files:** * Each contract must be in __PDF format__. * Compress multiple PDF files into a single ZIP file. * **Size Limits:** Individual contract: Max 15 MB. ZIP file: Max 500 MB. 5. Upload your ZIP file. 6. **Assign Folder (Optional):** Select a folder to organise these contracts. Choose from the pre-configured folders available in the dropdown. 7. Click **Next** to continue. ### Step 2: Select Upload Type In this step, you select how to populate the contract details: **Smart Extraction** or **Add Contract Data Manually**. #### Smart Extraction #### Smart Extraction The system automatically begins AI extraction on the documents within the uploaded ZIP file. The AI extracts data fields from the contracts to populate relevant details. ![Smart extraction in bulk upload](\img\DC_Smart_Extraction_Bulk_Upload.png) 1. Review the variable chips displayed under the **All variables** section. 2. Click the chips for the variables you want the AI to detect and extract. The selected variables will move to the **Selected variables** section. The AI scans your contracts for all selected variables and provides keyword-extracted insights. 3. **Upload XLS:** Users can upload an excel file with values they already have. Smart AI will prioritize these and skip extraction. Note that this is optional. 4. Click **Proceed**. #### Manual Upload #### Add Contract data Manually (Using XLS Template) After uploading the ZIP file, you must provide supporting details for each contract using an XLS template. 1. **Download and Fill the XLS Template** - Click the **Download XLS** button to get the template. - **Fill in Mandatory Fields:** Fill out the contract details into downloaded excel sheet. The first row (header) contains fixed fields that **must not be altered**. Enter the following details for each contract (each row is one contract): * **File Name:** The exact name of the contract file (e.g., `MLA-Leegality.pdf`). This field is case-sensitive. * **Document Name:** The name that will appear in the repository. * **Deal Name:** The name of the deal. * **Counterparty Name** * **Counterparty POC Name** * **Counterparty POC Email** - Save the XLS file. 2. Upload the filled XL file. 3. Click **Proceed**. > **Tip** > > Additional fields correspond to global variables. If a contract detail is missing from the template, create the custom variable in your account and download the template again. Once uploaded, the contract status is automatically set as **Pending**. User is redirected to the **Contracts Processing Hub**. Once the AI review is complete, the status changes to **Ready for Review**. --- # Contracts Processing Hub URL: https://knowledge.leegality.com/deal-collaboration/Contracts/Contracts Processing Hub/contracts-processing-hub > On the **Processing Hub** page, monitor your bulk upload with the following details: On the **Processing Hub** page, monitor your bulk upload with the following details: * **Batch ID:** A unique identifier for your ZIP batch. Click the Batch ID to view the contracts added from that batch. * **Created By:** The user who uploaded the batch. * **Date Created:** The date and time when the upload was initiated. * **Status:** Current progress of the batch (e.g., Pending, Completed). * **Added to Contracts:** The number of contracts successfully added to the repository. * Use the **Three Dots (⋮)** to select **Download Success Report**, which includes contracts from a batch that have been successfully added to the contracts repository. * **Failed Documents:** The number of contracts that failed to upload due to errors. * **Documents with Issues:** The count of contracts flagged with critical processing errors. ### Contract Processing Status and Functions The Contracts Processing Hub tracks the real-time status of your bulk upload batch, reflecting its stage within the AI extraction and review workflow. ![Contract processing hub](\img\DC_Status.PNG) | Status | Definition | Available Actions | | :--- | :--- | :--- | | **Pending** | The contract has been uploaded and is queued for AI analysis. | 1. **Refresh**: Click to update the page and check for a status change. | | **Ready for Review** | The AI analysis is complete, and key data points have been extracted. | 1. If **Critical Issues Flagged**: Click **Review** to go to the Review Extraction page. 2. **Download Report**: View the details of the extracted data in an XLS file. 3. If **No Critical Issues are found**: Click **Add to Contracts** to finalize and add documents to the repository. | | **Completed** | The AI review is finalized, and the contract has been successfully added to the central repository. |1. **Refresh**: Click to update the page and check for a status change. 2. **Download Input XLS File**: Click to download the uploaded excel sheet. 3. **Download Success Report**: Only visible if the batch had no failed documents. 4. __Download Error Report:__ Only visible if the batch included documents that failed. | | **Failed** | The document upload or AI processing failed due to critical errors (e.g., corrupted file, unreadable format). | 1. **Refresh**: Click to update the page and check for a status change. 2.**Download Input XLS File**: Click to download the uploaded excel sheet. | ## Review Extraction ![Review extraction page](\img\DC_Review_Extraction_Page.png) The **Review Extraction** page displays the data identified and pulled from your uploaded documents by the Smart Extraction AI. This page allows you to validate the information, resolve flagged issues, and prepare the contracts for indexing. ### Identify and Filter Issues The system automatically flags potential data issues for review: * **Critical issues:** Major flaws or unreadable data points. * **Low confidence score:** AI uncertainty about the extracted value. * **Value missing:** A selected variable was not detected in the document. Use the following tools to manage the document list: * **Filters:** Use filters to prioritize documents based on the major flags listed above. * **Search:** Use the search option to quickly locate a specific document in the batch. * **Data Source Indicators:** An icon denotes which data was manually provided (via the XLS template) and which was extracted by the AI. * **Delete Icon:** Click the **Delete** icon to remove any documents from the current list. ### Detailed Document Review ![Detailed document review](\img\DC_SmartAI_Detailed_Review_Page.PNG) 1. Click the **Review** button to open the uploaded document alongside a detailed, categorical breakdown of the extracted data and corresponding flaws. 2. User can toggle **Show only AI extracted variables** to narrow the focus to AI-sourced data. 3. Once reviewing the detailed breakdown, two primary options are available: #### a. Confirm All - Click **Confirm All**. If critical issues are present, a pop-up appears, requiring resolution. - User can manually go through each flagged value to edit, remove, or confirm the data - After resolving all issues, click **Confirm All** again. > **Info** > > The document is verified, and the following message is displayed: > > *Review successfully completed! Document added to contracts is in queue. It can be viewed in the Added to Contracts Queue tab.* #### b. Remove All Click **Remove All** to clear variable values from the document. > **Info** > > Only non-mandatory variable values will be removed. Mandatory fields must be reviewed and confirmed individually to be cleared. 4. After detailed reviewing and resolving all errors: * Click the **Add to Contract** button to finalize the document and send it to the contracts repository. * Click **Delete document** to permanently remove the document entry. Once added to the contracts, the document is moved to the **Contracts** page with the **Executed** status. ### Reuploading Failed Documents If some contracts fail to upload, follow these steps: 1. **Download Error Report:** Click the **Three Dots (⋮)** and select **Download Error Report**. The XLS file will list failed contracts along with the *Failure Reason*. 2. **Correct Errors:** Fix the errors indicated in the report. Remove the *Failure Reason* column before reuploading. 3. **Download Failed Files:** Click the **Three Dots (⋮)** and select **Download Failed Files**. Create a new ZIP file containing the corrected contracts. 4. **Reupload:** Upload the new ZIP file to process the failed contracts. --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/find-contracts # Filter Contracts The Filters functionality in the **Contracts** section allows you to refine search results, helping you easily find specific contracts based on various criteria. ## To Apply Filters 1. Go to the **Contracts** from the left. 2. Click on the **Filters** on the top-right corner. 3. Select criteria to filter contracts. 4. Click on **Apply**. Contracts matching the applied criteria will be displayed. In the Filters panel, the selected filters are displayed at the top. To reset all applied filters, simply click the **Clear All** button in the Filters panel. ## Types of Filters Filters in the Contracts section are divided into two types: **General Filters** and **Variable-Based Filters**. ### General Filters General filters help you search for contracts based on their status, template used, counterparty, and creation or update date. * **Status:** You can filter contracts based on their current stage in the workflow. Available status options include: * Under Internal Review * Ready for External Review * External Review * Negotiation Internal * Negotiation External * Ready for Signing * Sent for Signing * Executed * Discarded * **Template:** Allows you to search for contracts by the name of the template used. You can select multiple templates simultaneously to broaden your search. * **Counterparty:** Allows you to search by **counterparty name**. Like the Template filter, you can select multiple counterparties. * **Create Date**: Filters contracts by the **date of creation**. Options include filtering by predefined periods such as days, months, quarters, or years. You can also specify a **custom date range**. * **Update Date:** This option allows you to filter contracts by the **last update date**. You can use predefined periods or select a **custom date range**. ### Variable-Based Filters Variable-based filters allow you to search and filter contracts based on the specific data entered into these dynamic fields. This makes it easier to locate contracts that match criteria like contract term, renewal date, etc. For example, in a template, a default variable like "Deal Value" is added. When a contract is initiated using that template, the initiator fills in the actual value of the deal. You can then filter contracts based on deal values using options like "less than," "greater than," or "equal to" a specific value. > **Info — Note** > > - Only active variables will be shown as filter options. > - Both Default and Custom Variables are supported in the filter. > **Tip — Reference** > > Learn more about [**Global Variables**](https://knowledge.leegality.com/deal-collaboration/Settings/global-variables). #### **Default Variable Filters** Below is a list of the system's default variables that can be used for filtering contracts. **Custom variables** can also be used similarly in the filters if they are active. * **Effective Date:** Filter contracts by the date they became effective. * **Deal Value:** * A field to input a specific deal value. * A dropdown to choose filtering criteria (e.g., Less than, Less than or equal to, Greater than, Greater than or equal to and Equals to). * **Region:** Filter contracts based on the specific region. * **Location:** Filter contracts by location. * **Counterparty:** Enter the counterparty name involved in the contract. * **Counterparty Signatory:** Filter by the name of the counterparty’s signatory. * **Deal Type:** Filter contracts by their deal type. * **Description of Services:** Filter contracts based on the description of service. * **Expiry Date:** Filter contracts by their expiry date. * **Renewal Date:** Filter contracts by their renewal date. * **Term Filters:** These allow you to filter contracts by their duration. * **Term (Months):** Enter the number of months and use the dropdown to filter by Less than, Less than or equal to, Greater than, Greater than or equal to and Equals to the specified number of months. * **Term (Years):** Enter the number of years and filter similarly. * **Term (Days):** Enter the number of days and filter accordingly. * **Payment Date:** Filter contracts by their payment date. --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/contract-renewal # Contract Renewals Contract Renewal option allows you to configure renewal tasks and reminders for contracts in the *Executed* status. ## Steps to Configure Renewal --- ## Common Errors and Solutions When Configuring Renewals
Error Resolution Steps
Renewal already configured for the document

Unselect the contract for which renewal has already been configured. Steps to filter contracts pending renewal configuration:

  1. Click Filters.
  2. Choose Executed status.
  3. Choose Renewal Configuration as Not Configured.
  4. Click Apply.
Contract Expired The contract has already expired and is not eligible for renewal.
Expiry Date not available

The contract does not have an expiry date. To set an expiry date:

  1. Click the document name to open the detail view.
  2. Click the Configure Renewal button.
  3. Enter the Effective Date and Term of Contract. Click Save and Exit.
Task Creation date should lie between current date and expiry date

The entered number of days for task creation must fall within the range from the current date to the contract's expiry date.

Example:

  • Current Date: 01-Mar-2025
  • Expiry Date: 31-Mar-2025

The Task creation date (days) should be 30 days maximum. If you enter a value greater than 30 (e.g., 40), the task creation date would fall on 19-Feb-2025, which is in the past and not valid.

TAT should lie between current date and expiry date

The entered number of days for TAT must fall within the range from the current date to the contract's expiry date.

Example:

  • Current Date: 01-Mar-2025
  • Expiry Date: 31-Mar-2025

The TAT to complete the task should be 29 days (1 less day than the Task Creation Date) maximum.

--- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/folders # Manage Folders The **Folders** feature lets you organise contracts into a structured hierarchy within Deal Collaboration. You can create folders, nest subfolders, and move contracts into them for easier management and retrieval. ## Folder Permissions Access to folders is permission-driven based on the user's role: | Role | Permissions | |---|---| | **Business Users** | View folders only | | **Admins & Legal Users** | Create, edit, move, and delete folders | > **Info — Note** > > During workflow execution, **Business Users can assign folders** to contracts, even though they do not have folder edit access in general. This is because the permission to work on a workflow is granted to Business Users. ## The Folders Panel Folders are accessible from the left sidebar on the Home screen. All existing folders are listed here. The icon next to each folder name indicates its structure: - `* Folder name` — The folder has **no subfolders**. - `> Folder name` — The folder **has subfolders**. Click the arrow to expand and view the nested structure. 1. Use the **search bar** in the panel to find a folder by name. 2. Click on any folder to open its details page. > **Info — NOTE** > > There is no limit to the number of folders you can create or the depth of subfolders you can nest within them. ## Create a New Folder 1. From the Home screen, click the **+** icon in the **Folders** section of the left sidebar. 2. Enter a **Folder Name**. 3. Click **Add Folder**. The new folder appears in the Folders panel. ## Folder Details Page Clicking a folder in the sidebar opens the **Folder Details** page, where you can view all contracts and subfolders within it. ### Add a Subfolder 1. Click **Add Subfolder**. 2. Enter a name for the subfolder. 3. Review the **path** shown to confirm its location in the hierarchy. 4. Click **Create**. ### Rename and Delete a Folder #### Rename a Folder To rename the selected folder: 1. Click the **edit icon** alongside the folder name. 2. Enter the new name. 3. Click **Save**. #### Other Actions Available * **View Folder Path**: Click the **info icon** alongside the folder name to see the full path of the folder in the hierarchy. * **Remove a Folder**: Click the **remove icon** alongside the folder name. * **Move to Another Folder**: 1. In the **Folder Details** page, Click **More Options**. 2. Select the folder you want to move the contract to. 3. Click **Move**. > **Warning — Important** > > Removing a folder **also removes all child folders** nested within it. The contracts inside are **not deleted** — they become unassigned from the folder structure. ## Move a Contract to a Folder 1. Go to **Contracts** from the left navigation panel. 2. Select the contract(s) you want to move. 3. Click **More Actions**. 4. Select **Move to Folder**. 5. Choose the target folder or subfolder from the list — you can move to a different top-level folder or to any subfolder within one. > **Info — Note** > > Moving a contract to a folder does not affect the contract itself — the contract's data, status, and workflow remain unchanged. ## Search and Filter by Folder You can locate contracts by folder in two ways: - **From the Folders panel** — Use the search bar in the left sidebar to find a folder by name. - **From the Contracts page** — Use the **Filters** panel and filter by folder. This works at every level — top-level folders, child folders, and deeply nested subfolders all return matching contracts. ## Other Ways to Assign Folders Folders can also be assigned to contracts through the following flows: - [Uploading Contracts](https://knowledge.leegality.com/deal-collaboration/Contracts/upload-contracts) — Assign a folder when uploading a legacy contract (single or bulk), before clicking Proceed. - [Create a Workflow](https://knowledge.leegality.com/deal-collaboration/Workflows/create-workflow) — Assign a folder per template during workflow configuration, or leave it open for the user to assign at runtime. - [Initiate a Contract](https://knowledge.leegality.com/deal-collaboration/Contracts/initiate-contract) — Assign a folder at the Deal Form step during deal initiation, if not already set in the workflow. --- URL: https://knowledge.leegality.com/deal-collaboration/Contracts/configurable-columns-and-saved-views # Configurable Columns and Saved Views The **Contracts** page lists every contract in your Deal Collaboration workspace, but not every user needs to see the same information. A legal reviewer may want to track status and counterparty, while a business owner may care more about deal value and renewal date. The **Configurable Columns and Saved Views** feature lets each user shape the Contracts page to match their workflow. This feature gives you two key capabilities: - **Curated views** — Display only the data points you actually need, keeping the Contracts page clean and relevant to your role. - **Repeated use** — Save your column and filter combinations so you don't have to reconfigure them each time you open the page. By default, when you open the Contracts page, a **Default View** is applied showing a standard set of columns. You can switch to a saved view at any time using the **views dropdown** in the page header, or create a new view of your own. ## Configure Columns The **Configure Columns** option lets you choose which data points appear as columns on the Contracts page. You can pick from a combination of general contract fields (such as Status, Counterparty, Create Date, Update Date) and active variables (both default and custom) used in your templates. The **Configure Columns** button is located at the top-right of the Contracts page header. 1. Click **Configure Columns**. 2. In the dropdown, select or deselect the data points you want to display. There is no limit on the number of columns you can select. 3. Click **Apply**. Your custom column view is now active on the Contracts page. > **Info — Note** > > **Document Name** is a constant column and is always displayed. It cannot be removed from the view. ## Apply Filters to the View Once your columns are configured, you can further narrow down the contracts displayed using filters. Filters work alongside the column selection — your chosen columns control **what data** you see, while filters control **which contracts** are listed. 1. Click the **Filters** option. 2. Use the checkboxes under each filter to select the values you want to apply. 3. To start over, click **Clear All** to deselect all selected filters. 4. Click **Apply** to apply the selected filters. > **Tip — Reference** > > For a full breakdown of the available filters, including general filters (Status, Template, Counterparty, dates) and variable-based filters, see [**Filter Contracts**](https://knowledge.leegality.com/deal-collaboration/Contracts/find-contracts). ## Save a View A **Saved View** captures your current column configuration along with the filters applied to the Contracts page. Saved views are useful when you regularly need the same slice of contracts — for example, a legal user can save a view that shows all contracts under internal review, while a business owner can save a view that lists all contracts expiring this quarter. To save your current column configuration and filters for repeated future use: 1. Click **Save your new view**. 2. Enter a **View Name**. 3. Select the **Visibility**: - **Team** — Makes the view accessible to your entire team. - **Private** — Keeps the view visible only to you. 4. Click **Save**. Your saved views are accessible from the **views dropdown** in the Contracts page header. There is no limit on the number of saved views per account. > **Info — Note** > > **Team** views are shared across every user in your organisation, so any change you make to a team view affects what others see. Use **Private** if the view is meant only for your own workflow. ## Edit a Saved View You can update the name or visibility of a saved view at any time. This is useful when a view needs to be renamed for clarity, or when a private view needs to be shared with the rest of the team (or vice versa). 1. Select the saved view from the dropdown. 2. Click **More Options**. 3. Click **Edit Details**. 4. Update the **View Name** or **Visibility** as needed. 5. Click **Save**. ## Delete a Saved View If a saved view is no longer needed, you can remove it from the views dropdown. 1. Select the saved view from the dropdown. 2. Click **More Options**. 3. Click **Delete**. 4. A confirmation pop-up appears — click **Delete** to confirm. > **Warning — Important** > > Deleting a **Team** view removes it for everyone in the organisation. --- URL: https://knowledge.leegality.com/deal-collaboration/deal-negotiation/introduction # Overview This article will give you an overview of the deal negotiation process, explaining the key stages and actions involved. ## What is Deal Negotiation? Deal negotiation is the process of discussing and agreeing on the terms of a contract with external parties. Using our software, you can create, review, edit and share documents until both parties are satisfied and the contract is ready for signing. ## Stages of Deal Negotiation 1. **Initiate the Deal:** The negotiation process begins when a deal is initiated in the Leegality Deal Collaboration. 2. **Internal Review:** The contract is reviewed internally to ensure all terms are correct before sharing with the external party. 3. **Ready for External Review:** Once the internal review is complete, the contract is prepared to be sent to the counterparty. 4. **External Review:** The counterparty reviews the contract and may suggest changes. 5. **Negotiation Internal:** Your team reviews the counterparty’s changes and decides whether to accept them, propose further changes, or finalize the contract. 5. **Ready to Sign:** When both parties agree on the terms, the contract is ready for signing. ## Key Collaborators and Their Roles This part of the article explains the roles of key collaborators in the deal negotiation process. Being familiar with the roles and responsibilities of the collaborators can help you navigate through a negotiation more effectively. ### 1. Initiators - **Role:** Initiators start the deal negotiation process by creating the contract. - **Responsibilities:** - Create the initial draft of the contract using templates and workflows. - Ensure all necessary information is included. - Assign tasks to the appropriate team members for review. ### 2. Pre-sharing Reviewer - **Role:** Review the assigned fields and sections in the contract before sending it to the External Review. - **Responsibilities:** - Review document before sending it to counterparty. - Approve, Edit, or Discard the variable fields and sections assigned to them. ### 3. Business Negotiators - **Role:** Business negotiators focus on the business terms of the contract. - **Responsibilities:** - Review the contract for business-related terms and conditions. - Suggest changes or improvements to the terms of the contract if required. - Communicate with the counterparty to negotiate business terms. ### 4. Legal Negotiators - **Role:** Legal negotiators ensure the contract is compliant with the law and is free from legal risks. - **Responsibilities:** - Review the contract for legal accuracy and compliance. - Suggest changes to ensure legal protection and compliance as and when required. - Collaborate with business negotiators to align business and legal terms. - Approve the contract before it goes for execution. ### 5. Counterparty POC - **Role** The counterparty POC (Point of Contact) is the representative from the external party involved in the negotiation. - **Responsibilities:** - Review the contract sent by the initiator or the negotiator. - Suggest changes or provide feedback on the contract terms. - Communicate any concerns to your team. --- URL: https://knowledge.leegality.com/deal-collaboration/deal-negotiation/deal-negotiation-flow-diagram # Deal Negotiation Flow Diagram This article summarises the negotiation workflow in Leegality Deal Collaboration software. Understanding the overall flow helps you navigate the process smoothly. The stage-wise process that a deal undergoes is captured in the chart below. ## Step-by-Step Explanation | **STAGE** | **ACTION** | **RESULT** | |----------|----------|----------| | **Initiate Contract**| The initiator configures the deal and selects the workflow and the template relevant for that deal.| Stage changes to “Ready for Internal Review.”| | **Internal Review**| The Reviewer(s) approve, reject or edit the variable fields and approve or reject the sections. If they have edit access, they can also click on “View Document” to make edits and leave comments on the document.| Stage changes to “Ready for External Review.”| | **Ready for External Review**| The initiator can click on the “Send for External Review” task and download the draft contract. All the internal comments are removed. Once the document is downloaded- the document cannot be edited.| The contract marked as External Review.| | **External Review**| The Counterparty reviews the contract and sends it back. This document is now uploaded back to Deal Collaboration.| Stage changes to “Negotiation Internal”| | **Negotiation Internal**| The internal negotiators can now review the document for any further changes that might be required. The legal negotiator is required to approve the document at this stage.| After the Legal Negotiator approves the document, the document can either be sent for another external review or be marked as ready to sign.| | **Send for External Review**| You can share the revised contract with the counterparty.| Contract status changes to Negotiation External.| | **Negotiation External**| Negotiations can go on till the draft contract is finalized.| Stage changes to “Ready for Signing”| | **Ready to eSign**| A task is created to “Configure Signing”. You can now select the draft that is required to be executed.| You will be redirected to the Document Execution platform where you can set up an eSigning flow.| --- URL: https://knowledge.leegality.com/deal-collaboration/deal-negotiation/ai-review # AI Review The AI Review feature enables collaborators to efficiently assess documents for potential risks and compliance issues at any stage of negotiation. This feature is available to every user who has access to the deal collaboration product. The AI Review system utilises a customisable Rule Set—a collection of pre-configured smart rules or guidelines—to ensure your contracts align with organisational standards. - **File Format:** The review functionality is currently open to .docx files only. - **Negotiation Stage:** The review can be run at all document negotiation stages but is only available before the contract reaches the final PDF state. ## Run AI Review Follow these steps to run an AI Review on a document: 1. While the document is in a negotiation stage, click **Open Document** to load the document in **OnlyOffice**. 2. On the document toolbar, click **AI Review**. A right-hand panel will open, displaying the review interface. 3. In the right-hand panel, select the Rule Set you wish to use for the review. > **Info** > > To learn how to define and manage rules, see [Rule Set Management](https://knowledge.leegality.com/deal-collaboration/Settings/rules-set). 4. Click **Run**. The system will thoroughly process the document against the selected rules. ### Re-running the Review You can run the AI Review as many times as needed to ensure confidence in the results. > **Warning — Note on Re-running** > > To see a change in the results, you must click **Re-run** after you have: > - Changed the content within the document. > - Modified the content of the selected Rule Set (e.g., if you closed the AI Review panel, navigated to the settings page, and edited a rule). After the review is complete, the right-hand panel displays a detailed answer for each rule within the chosen Rule Set. ## Detailed Review Results The AI Review results are categorised into three statuses: | Status | Description | Review Display | Possible User Action | |--------|-------------|----------------|---------------------| | **Met** | Required values or clauses fully meet the rule's expectations. | Displays the rule and reason for compliance. No clause suggestions are provided. | No changes needed. The condition is satisfied. | | **Not Met** | Required values or clauses are found but do not meet the rule's expectations. | Shows clauses that need review along with suggested additions. | Add the suggested clause or edit the document to meet the rule's requirements. | | **Not Found** | Required values or clauses are not found in the document. | Indicates missing details and provides suggested additions. | Add the suggested clause or manually edit the document to include the required information. | To view a detailed analysis of a specific rule, click the right arrow (→) alongside that rule in the results panel. The detailed review section provides critical information for remediation: - **Rule:** The specific guideline being checked. - **Rule Description:** A detailed explanation of the rule's purpose. - **Suggested Clause:** The original clause recommended by the user. - **Reason:** A clear explanation of why the rule was Met, Not Met, or Not Found. For issues, the reason includes a direct reference (e.g., text snippet) to the relevant section. - **Clause Suggestions:** For rules with **Not Met** or **Not Found** status, the Clause Suggestions section displays two components: 1. **Original Clause:** Shows what is currently mentioned in the document with respect to the rule. Click **Find** to locate the clause inside the document. 2. **Suggested Addition:** Provides a recommended alternative or addition to address the issue. After making changes and reviewing the document, click **Save** to save your work and return to the Document Details page. ## Bulk AI Review Bulk AI Review allows you to run AI Review on multiple executed contracts simultaneously. This is useful for reviewing a batch of contracts against a specific rule or rule set. > **Info — Note** > > - Bulk AI Review is available only for contracts in the **Executed** stage > - You can run **one rule** or **one rule set** individually at a time ### Run Bulk AI Review 1. Go to the **Contracts** page. 2. Select multiple contracts to be reviewed (must be in the Executed stage). 3. Click the **AI Review** button from the action bar above. 4. In the popup, select the rule or rule set you want to run the AI Review on. 5. Click **Run**. You will be redirected to the **Contracts Processing Hub** where the contracts under review are listed. ### Review Results Once the status changes from **Queued** to **Complete**, you can review the results: 1. Click the **Review** button next to the completed batch. 2. A tabular representation displays all documents under the contract with their status: - **Rules Met** - **Rules Not Met** - **Rules Not Found** 3. Click on any document to open the **Detailed Review Page** for individual review. The Detailed Review Page displays the same information as described in the [Detailed Review Results](#detailed-review-results) section above. ### Rerun AI Review To rerun the AI Review on a document: 1. Click **Rerun** next to the document you want to review again. 2. You will be redirected to the main PDF viewer page. 3. Click **Proceed** to access the page where you can rerun the rule or rules under the selected rule set. > **Info — NOTE** > > You can rerun documents one at a time from the repository or from clicking contracts individually. --- URL: https://knowledge.leegality.com/deal-collaboration/deal-negotiation/deal-negotiation-process # Deal Negotiation Process ## 1. Internal Review Internal Review is the first stage in the contract status workflow where your internal team reviews the contract to ensure all terms and conditions are correct before sharing it with the external party. ### Collaborator and Responsibilities **Pre-Sharing Reviewer(s):** The person responsible for reviewing the contract during the Internal Review stage. They will review and complete assigned tasks, including reviewing entire document, variable fields, and/or sections. ### To Perform an Internal Review 1. The pre-sharing reviewer can find the tasks assigned to them in the [**Tasks**](https://knowledge.leegality.com/deal-collaboration/tasks) section. Click on the **Review** to proceed. The tasks assigned to a user are also reflected on the contract details page and home page. > **Info** > > The reviewer also receives email notifications of the review process. 2. The reviewer then examines either the entire document or specific assigned variable fields and sections of the contract. 3. For entire document review, reviewer can either **Accept** or **Reject**. > **Warning — Note** > > If reviewer **Reject** the document, the entire deal will be discarded. The initiator will need to start a new deal again. 4. For each variable field and section, the pre-sharing reviewer can: - **Approve:** Confirm that the information is correct. - **Discard:** Remove any incorrect or unnecessary information. (**Note:** If a variable is rejected, a task will be created for the initiator to refill the variable field. Once the initiator has made the change, it’ll go back to the reviewer for approval.) - **Edit:** Make necessary changes. The pre-sharing reviewer completes their review tasks by making edits, discarding, or approving the fields and sections. 5. Once all variable fields are **Approved**, the contract status will change to *Ready for External Review*. This indicates that the contract is now ready to be shared with the counterparty for their review. > **Info — Note** > > User can also make Online Edits (if they have edit access) to the Contracts and these edits will be visible to other collaborators. ## 2. Ready for External Review Ready for External Review is the stage in the contract status workflow where the contract is prepared and deemed ready to be sent to the counterparty for review. This stage ensures that all internal reviews are complete and the document is ready for external review. ### Collaborators and Responsibilities **Initiators:** Initiator is responsible for sending the document to the counterparty for external review. ### To Send for External Review 1. The initiator will get a new task when the document status changes to *Ready for External Review*. Click on the **Review** to proceed. 2. On the Contracts detail page, the initiator can click on the **View Document** button to review the document before sending it. 3. Then the initiator needs to click on the **Send for External Review** button. A new window displaying the __Counterparty Sharing Mode__ opens: ![send for external review](\img\DC-CP-Share-for-external-review.PNG) Here, you can view the sharing mode selected during the workflow creation. You also have the option to update the Counterparty POC name and email. 4. To delete an existing __Counterparty POC__, first create a new credential using the __Add Counterparty POC__ section. 5. Click __Save__ to add the new details. 6. Remove the previous entry by clicking the delete icon. 7. You may also include an __additional message__ to be sent to your Counterparty POCs. This is sent as part of the automated email generated to the Counterparty POC when you hit __Proceed__. 8. Once you've made all necessary changes, click __Proceed__ to continue. > **Info — NOTE** > > Users can also execute this step during external review. 9. If the Counterparty POCs have not received the email, you can resend notification so that those emails can be resent to the users. To share the document manually, 1. **Download the document** to share it with the counterparty’s point of contact (POC). The format of the document is docx. Before the document is sent, all the internal comments are deleted. 2. After downloading, the status changes to *External Review*. 3. Share the document with the counterparty with your preferred mode of communication e.g. Email. The counterparty reviews the document and returns it with any revisions. This review cycle can continue until both parties are satisfied with the terms and ready to proceed with e-signing. > **Warning — Note** > > Once the document is sent for external review, all online editing is restricted. This restriction prevents discrepancies between the shared document and the internal document version. ## 3. Counterparty Review The Counterparty POCs receive an automated email from the initiator, which includes an attachment of the document. This allows the POCs to preview the document without needing to click any CTA, ensuring both safety and legitimacy. ![Email received by CP-POC](\img\DC-CP-POC-Inbox.PNG) 1. Click __View Document__ to review the document to be signed. 2. Click __Upload Document__ if the Counterparty POC needs to share any attachments with the initiator. > **Info** > > Clicking either button will initiate a one-time verification process. The email ID will be pre-filled and match the one provided during the Counterparty POC configuration. ![Guestuser signin](\img\DC-Guestuser-signin.PNG) 3. Enter the OTP sent to that email to complete the verification. 4. Once verified, a guest portal opens, providing access to options for reviewing, verifying, and editing the document. 5. The guest user can __Download__ the document to make changes and then __Upload__ the revised version. ![Guestuser upload window](\img\DC-Guestuser-Uploadwindow.PNG) 6. Click __Mark as Final and Send__ to send the uploaded document. 7. Click __Comments__ to view any external feedback or remarks on the document. 8. Once all the changes are made, click __Accept as Final and Send__. 9. The guest user can also mark it as final and send if they have no changes to offer. ## 4. Negotiation Internal Negotiation Internal is the stage where the contract, after being reviewed by the counterparty, is uploaded back to Leegality Deal Collaboration for further review and possible modification. During this stage, the internal negotiator examines the changes suggested by the counterparty, makes necessary adjustments, and decides on the next steps. ### Roles and Responsibilities - **Business and Legal Negotiators:** The primary responsibility is to review the document, compare versions, make necessary changes, and decide whether to send it back for external review or mark it as ready for signing. ### Internal Negotiation Process Once you receive the revised document from the counterparty, you need to upload the document on Leegality DC. For this: 1. On the __Contracts detail__ page, click on the **Upload** button. 2. Select the document you received from the counterparty and click **Proceed**. The status will change to *Negotiation-Internal*. 3. A task is created for the Legal Negotiator to review the document. The negotiator can click on the **View Document** to see the changes. 4. The negotiator can also review the changes by [comparing the document versions](https://knowledge.leegality.com/deal-collaboration/Collaboration/comparing-document-versions). Any necessary edits can be made directly using the online editor. 5. Save the edited document to ensure changes are visible to other collaborators. You can [add comments](https://knowledge.leegality.com/deal-collaboration/Collaboration/add-comments) for other collaborators and external stakeholders as well. 6. After reviewing and making the necessary changes, click the **Approve** button. 7. The Business Negotiator has two options: - **Send for External Review:** If further review by the counterparty is needed, the negotiator can send the document back for external review. - **Mark as Ready for Signing:** If no further review is required, the negotiator can mark the document as ready for signing. In this case, you need to [send contract for eSigning](https://knowledge.leegality.com/deal-collaboration/signing-journey). --- URL: https://knowledge.leegality.com/deal-collaboration/deal-negotiation/upload-signed-document # Upload Signed Document The Upload Signed Document option allows you to upload a signed contract when negotiations are completed. This is useful if the document was signed physically or using a platform other than Leegality. ## Prerequisites * The document Status must be Ready for Signing. * You must be a collaborator in the deal with one of the following roles: Initiator, Business Negotiator, or Legal Negotiator. ## Steps to upload a signed document 1. In the contract, click on the three dots (**…**). 2. Select the **Upload Signed Document** option. 3. Upload a signed PDF document. (**Note:** Maximum upload size is 20 MB.) Once the document is uploaded, the status will change to Executed. > **Info — Note** > > This action cannot be undone. You can click on the **View Document** button to see the uploaded PDF document. The activity log will be updated. You can see; * The user who uploaded the signed document. * The date and time when the document was uploaded. The document status will change to Executed. All collaborators will receive a notification informing them that the document status has changed to Executed. --- URL: https://knowledge.leegality.com/deal-collaboration/signing-journey # Sending a contract for eSign The contract status must be in the **Ready for Signing** in order to send it for eSigning. ### Roles and Responsibilities - **Initiator or Legal Negotiator:** Responsible for finalising documents and configuring eSigning. ## To Send contract for eSigning 1. A task will be assigned to Initiator/Legal Negotiator to Configure Signing. 2. On the Contract's detail page, click on **Configure Signing** button. 3. Select the **Document(s)** you wish to send for eSigning. > **Warning — Note** > > Proceeding further will convert the document to PDF, delete all comments, and accept changes made in tracked changes. This ensures that a clean document is sent for execution. 4. Click the **Finalise and Continue** button. 5. You will now be redirected to Leegality’s Document Execution platform. The contract that needs to be executed will automatically appear here. You will also have the option to affix stamps to the contract. 6. Click **Next** to add invitees. All the collaborators apart from the Counterparty POC will automatically be in CC. 7. Click on the **+ Add Invitee** button to add signers. 8. Add the Name, Email Address and/or Phone number of each signer. > **Tip** > > Explore advanced options such as signature types, security features, reference attachments for invitees, and more. Check out more about our [**Document Execution Platform**](https://knowledge.leegality.com/getting-started/sending-journey). 10. Click on the **Next** at the bottom right. 11. Set the signing coordinates where signers should place their signatures on the contract. 12. Click the **Send** button. Every invitee will receive a notification to sign the contract. All the relevant stakeholders like Reviewers, Business Negotiator and Legal Negotiator marked in CC will also get relevant notifications. To view the Signing details, click on the **View Document** button on the Contract's details page. Here, you can track the signing status of each invitee. --- URL: https://knowledge.leegality.com/deal-collaboration/tasks # Tasks The Tasks section in the DC software is a centralised place where users can manage and track their assigned tasks. Whenever a collaborator needs to perform an action, a task will be assigned to them. To access the Tasks section, click on **Tasks** in the left navigation menu. > **Info** > > Collaborators will receive a notification whenever a task is assigned to them. ## Task Statuses - **Pending Tasks:** Tasks needing your action. Click "Review" to go to the contract's detail page and complete the task. - **Completed Tasks:** Tasks that have been finished and no longer require any action. They are marked as "Resolved" in the system. - **Cancelled Tasks:** Tasks that have been aborted and no longer require any action. This occurs when the associated document is discarded. ## Common Tasks - **Send for External Review:** This means the internal review is complete and the document is ready for external review. - **Send for External Review or Sign:** Internal negotiation is complete. You need to either send the document for another external review or send it for signature. - **Configure Signing:** Negotiations are complete, and the document is ready to be sent for eSigning. - **Review Document:** Review the entire document. - **Review Variable:** Review specific variables in the document. - **Review Section:** Review specific sections in the document. - **Re-fill Value of Variable:** Update the values of specific variables. ## Find Tasks - **Search:** Use the search bar to find tasks by deal, counterparty, or document name. - **Filters:** Apply filters to narrow down the tasks based on Status. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/comparing-document-versions # Comparing Document Versions Comparing document versions ensures all changes can be identified and reviewed accurately. When you compare the two documents, all the changes are visible in track mode. ## To Compare Document Versions 1. On the Contract Details page, click on the **Compare Versions** icon at the top. 2. Select the two versions of the document you want to compare: the **Base version** and the **Revised version**. > **Info — Note** > > You can also download the previous versions from here. 3. The changes will be in track mode, showing inserted and deleted text. Carefully review the highlighted changes to ensure they are correct before approving them. Review the highlighted changes to ensure they are correct and acceptable. > **Info — Note** > > Whenever a document is modified, a new version of the document is saved. ## Example Scenario 1. The negotiator sends version 1 of the contract to the counterparty for external review. 2. The counterparty reviews the contract and sends back version 2 with their changes. 3. The negotiator compares version 1 (Base version) and version 2 (Revised version) using the Leegality Deal Collaboration’s comparison feature. 4. The software shows all changes made by the counterparty in version 2 compared to version 1 in track mode. 5. The negotiator reviews the changes, if the changes are acceptable, the negotiator can approve them. Otherwise, they can edit the document and send it for external review. By following these steps, users can effectively compare document versions, ensuring all changes are thoroughly reviewed and approved, maintaining the integrity and accuracy of the contract throughout the negotiation process. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/remarks # Remarks Remarks allow you to add notes or comments to a contract for internal purposes. Unlike [Comments](add-comments.mdx), Remarks are not linked to a specific part of the document and are not stage-dependent. They remain on the contract regardless of its current status. Remarks are available for all contracts and are useful for adding context, sharing internal notes, or attaching supporting files. > **Info — Key Points** > > - Remarks are for **internal purposes** only and add context to the contract. > - Remarks are **not stage-dependent** — they persist across all contract stages. > - Each remark supports up to **2,000 characters**. > - You can upload up to **5 attachments** per remark in various file formats. > - Remark activities are **not recorded** in the Activity Log. ## Add a Remark 1. Go to the **Contract Details Page**. 2. Navigate to the **Remarks** section. 3. Click **+Add Remark**. 4. In the popup: - Type your remark text (up to 2,000 characters). - **Tag users** by typing **@** followed by their name. The tagged user will receive an email notification about the remark. - **Upload Reference Attachment(s)** — add any supporting documents, screenshots, or spreadsheets for reference. Supported formats: **JPG, PNG, DOCX, TXT, CSV**. You can upload up to **5 files** per remark. - You can **rename uploaded files** by clicking the edit option before submitting. 5. Click **Add Remark** to submit. The remark will now be visible on the contract. ## View Remarks Anyone who has access to the contract can view all remarks. For remarks with reference attachments, you can: 1. Click the **Preview** button to preview the reference document. 2. Click the **Document** icon to download the attached reference document. > **Info — NOTE** > > You can sort remarks using the **Sort** icon. Available options: **Sort by Newest** and **Sort by Oldest**. ## Edit Remarks 1. Locate the remark you want to edit on the **Contract Details Page**. 2. Click on the **Edit** option on your remark. 3. Make your changes to the text, tags, or attachments. 4. Click **Save** to update the remark. ## Delete a Remark 1. Locate the remark you want to delete on the **Contract Details Page**. 2. Click on the **Delete** option on your remark. 3. Confirm the deletion when prompted. > **Info — NOTE** > > You can only edit or delete remarks that **you** created. Remarks created by other users cannot be deleted. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/add-comments # Add Comments Comments are a collaborative tool designed to enhance communication within the software, enabling users to collaborate effectively. 1. Go to the Contract Details Page and click on the **View Document** and then click on the **Comment** 💬 icon on the top right. 2. In the right panel, click on **+ Add Comment**. 3. There are two types of comments. a. **Internal Comment:** For the internal users and collaborators. All internal comments are deleted before the document is sent to the counterparty for signing. b. **External Comment:** For external stakeholders and counterparties. 4. You can also tag an individual in a comment, by mentioning their email address. For example `@person@email.com`. 5. Click on the **Comment** button. > **Info — Note** > > The individual mentioned in the comment will receive an email notification. Comments added to a contract will be visible to all collaborators. The person who added the comment can Resolve, Edit, and Delete it. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/manage-collaborators-and-reassignment # Manage And Reassign Collaborators The Manage Collaborators feature allows you to replace, add, or remove team members with specific roles at any stage of the deal negotiation process without discarding the document. This is particularly useful when a Legal Negotiator or Business Negotiator needs to change during an active deal. ## Access the collaborators modal 1. Open any document that is in a **pre-execution stage**. 2. Go to the **Document Details** page. 3. Click the **Share** icon (🔗) or the **Collaborators** section. 4. The collaborators modal opens, showing all collaborators associated with the document. ## Collaborator actions In the collaborators modal, click the **three dots (⋮)** next to any collaborator to see the available options: - **Replace**: Replace the current assignee with a new person - **Remove**: Remove the collaborator from the document ## Add a collaborator Add team members to view, comment on, or edit contracts based on their role. 1. In the collaborators modal, click **Add**. 2. Select the user you want to add. 3. Assign a role: - **Collaborator**: Basic access to view and comment - **Legal Negotiator (LN)**: Full legal workflow responsibilities - **Business Negotiator (BN)**: Business workflow responsibilities - **Pre-Sharing Reviewer (PSR)**: Access to assigned variables or sections 4. **Attach additional deal documents**: You can select which contracts of the specific deal the person should have access to. You can select multiple contracts by clicking the checkbox. This option is available only to the Collaborator role. When you are added as an LN or BN, you automatically get access according to your role. 5. Click **Add** to confirm. The collaborator will receive access to the contract based on their assigned role and underlying user permissions. > **Info — NOTE** > > Every collaborator receives at least 'share and comment' access. Business users with limited visibility will be able to view and comment on the contract even if they don't normally have access. ## How roles affect collaborator rights The rights a collaborator receives depend on both their assigned role and their underlying user role in the system. ### Admin users Adding an admin as a collaborator is redundant since they already have broad access to all contracts. ### Legal users When added as a collaborator, legal users gain edit access to the contract in addition to viewing and commenting rights. ### Business users Business users added as collaborators can view and comment on contracts. However, if a business user is assigned as a Legal Negotiator but their underlying role lacks edit permissions, they will not be able to edit the contract. ### Pre-Sharing Reviewers Pre-Sharing Reviewers have a limited role that is active only at the start of the contract, before it is shared with external parties. They are assigned specific variables or sections to fill in. Only one PSR can be assigned per variable. > **Info — Note** > > A user's underlying role determines their actual permissions. The collaborator role you assign cannot grant permissions beyond what their user role allows. ## Reassign Legal Negotiator or Business Negotiator Replace the current LN or BN with a different user to transfer workflow responsibilities. 1. Open the document and go to the **Document Details** page. 2. Click the **Share** icon (🔗) or **Collaborators** section. 3. Locate the current Legal Negotiator or Business Negotiator. 4. Click the **three dots (⋮)** next to their name. 5. Select **Replace**. 6. Choose the new user from the list. 7. Confirm the replacement. The newly assigned user will gain all responsibilities associated with the LN or BN role. > **Info — NOTE** > > - New assignees receive **immediate access** to the contract > - New assignees can view the **full activity and version history** > - Activity logs are **updated** to reflect the change > - The contract lifecycle is **not affected** — the contract remains at its current stage ## Reassign Pre-Sharing Reviewers Pre-Sharing Reviewers are assigned at the start of a contract to fill specific metadata or contract sections. Their role is active only **before the contract is shared** with external parties. > **Info — Note** > > - Only **one PSR can be assigned per variable** — no two users can review the same variable in a contract > - To assign a variable to a different PSR, you must first unassign it from the current PSR ### Replace a Pre-Sharing Reviewer To replace a PSR or reassign their variables: 1. Go to the **Collaborators** modal. 2. Click on the PSR you want to replace. 3. A popup opens showing their **Assigned Variables** and **Assigned Section(s)**. 4. You can either: - **Delete the user** to remove them entirely, or - **Uncheck specific variables** that you want to assign to another PSR 5. Optionally, change the name in the **Name** section to assign a different user. 6. Click **Replace** to confirm the changes. ### Add a new Pre-Sharing Reviewer To add a new PSR and assign variables: 1. Go to the **Collaborators** modal. 2. Click **Add**. 3. Select **Role** as **Pre-Sharing Reviewer**. 4. **Assign Variables**: Select one or more unassigned variables for the PSR to review. 5. **Assign Section(s)**: Select specific sections from the document for the PSR to review. 6. Click **Add** to confirm. > **Warning** > > You can only assign variables that are currently unassigned. If a variable is already assigned to another PSR, you must unassign it first before adding it to a new PSR. ## Bulk add collaborators across contracts Add collaborators across multiple contracts at once from the Contracts page. 1. Go to the **Contracts** page. 2. Select multiple contracts by checking the **checkboxes** next to each contract. 3. Click **+Add Collaborators** from the panel that appears above. 4. In the pop-up, under **Add User**, enter the name of the user you want to add as a collaborator. 5. Under **Select Role**, choose the role for the user: - **Legal Negotiator** - **Business Negotiator** - **Collaborator** 6. Click **Add** to confirm. The selected user will be added as a collaborator with the chosen role across all the selected contracts. > **Info — NOTE** > > The **Pre-Sharing Reviewer** role is not available for bulk add. To assign a PSR, use the single document flow described above. ## Remove a collaborator Collaborators can be removed when they no longer require access to the contract. 1. Open the collaborators modal from the **Share** icon (🔗). 2. Locate the collaborator you want to remove. 3. Click the **three dots (⋮)** next to their name. 4. Select **Remove**. 5. Confirm the removal. > **Warning — Minimum requirement** > > Every contract must have at least **1 Legal Negotiator** and **1 Business Negotiator**. You cannot remove a collaborator if it would leave the contract without a required role. ## Who can reassign collaborators Users with access to the contract can reassign collaborators. No special permissions are required beyond contract access. To learn more about the different collaborators and their entitlements, refer to the [Deal Negotiation Process](https://knowledge.leegality.com/deal-collaboration/deal-negotiation/deal-negotiation-process) page. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/offline-review # Offline Review The Offline Review option allows you to download a document, make changes offline, and then upload the edited document back into the software. Documents with the status *Internal Review, Ready for External Review* or *External Review* can be downloaded for offline review. To offline review a document: 1. **Download the document** 1. Click on the **Download** icon 2. Select **Download to Review** and click the **Download** button. 2. **Edit Document** 1. Make the necessary changes to the downloaded document. 3. **Upload Document** 1. Click on the **Upload** button. 2. Upload the edited document. 3. Click **Proceed.** During the offline review, other collaborators will see that the document is under Offline Review and who is performing the review. In addition to the collaborator who downloaded the document for Offline review, other collaborators with edit access can also upload the document and finish the offline review process. > **Info — Note** > > - Online editing is disabled for all collaborators until the offline review is completed. > - Variables and sections cannot be reviewed while the document is being reviewed offline. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/rename-document # Rename Document The Rename Document option allows you to update the document name at any stage of the collaboration — including after the contract has been Executed. This is useful when the document title needs to be corrected, standardised, or updated to reflect changes made during negotiation, without affecting the contract content or its execution status. 1. On the **Contracts** page, click on the document you want to rename. 2. Click the **Edit** ✏️ icon alongside the document name. 3. The document name becomes editable. Update the name as required. 4. Click **Save**. The document will be updated with the new name across the platform. The contract status and all existing data — collaborators, comments, versions, and signatures — remain unchanged. > **Info — Note** > > Renaming a document is available at every stage of the contract lifecycle, including the Executed stage. --- URL: https://knowledge.leegality.com/deal-collaboration/Collaboration/unlock-document # Unlock Document The Unlock Document option allows you to make changes to the document even after the document status is marked as Ready for Signing. Normally, once negotiations are complete and the contract is marked as Ready for Signing, the document is locked, and no further editing is allowed. However, there might be instances where last-minute changes are necessary before the contract goes for signing. In such cases, you can unlock the document and make the required changes. > **Info — Note** > > The user must have permission to Unlock the document and the Document Status should be Ready for Signing. 1. In the contract, click on the three dots (**…**). 2. Select the **Unlock Document** option. 3. Click **Confirm**. Once unlocked, collaborators with edit access can make changes to the document. The document status will change to Negotiation Internal. A task will be created for the Legal Negotiator to Review the document. After reviewing and approving the changes, the legal Negotiator can mark the document as Ready for Signing again. --- URL: https://knowledge.leegality.com/deal-collaboration/Leegality Word Add-in/word-plugin # Leegality Word Add-in The **Leegality Word Add-in** is your essential extension, integrating Deal Collaboration (DC) directly into Microsoft Word. It streamlines your entire contract lifecycle in one familiar interface, eliminating the need to switch applications. Post-initiation, you can perform most of your core document management, approval, and negotiation actions **directly from Word.** With the add-in, you can perform core Leegality actions without leaving Microsoft Word, including: * Securely accessing your Deal Collaboration account. * Browsing your assigned contracts and pending tasks. * Executing key actions like reviewing, **comparing versions**, uploading revisions, and **sharing the document** with internal and external stakeholders. * Maintaining visibility into document status and the **audit trail**. > **Info — NOTE** > > All the changes made using the Add-in are reflected in the DC platform in real-time. ## Getting Started ### Finding and Installing the Add-in If your organization has enabled the Leegality Word Add-in, it will be visible in your Microsoft Word application. 1. **Access the Add-in** * Open **Microsoft Word** and create or open a document. * Navigate to the **Home** tab on the ribbon. * Click the **Add-ins** button. 2. **Launch the Add-in** * Once installed by your IT team, the **Leegality** button will be visible on the Word ribbon. * Click this button to open the sidebar and begin using the Deal Collaboration features. > **Info — INFO** > > If you do not see the Add-in, it may not be enabled for your organization. To enable the Word Add-in, verify that your organization meets the requirements for centralized deployment. [Click to know more](https://learn.microsoft.com/en-us/microsoft-365/admin/manage/centralized-deployment-of-add-ins?view=o365-worldwide). ### Logging In ![Word Add-in sign in window](\img\DC-WordPlugin-Signin.PNG) 1. Once installed, open the Deal Collaboration Add-in. 2. Click **Sign In**. 3. Enter your Leegality credentials. 4. Click **Get Started** once the authentication is complete. > **Info — NOTE** > > Your authentication is saved, so you won't need to sign in every time you open Word until the session expires after the DC session time of **60 minutes**. --- URL: https://knowledge.leegality.com/deal-collaboration/Leegality Word Add-in/Review a Contract Using the Word Add-in # How to Review a Contract Using the Word Add-in This guide walks you through the simple steps to review (edit, comment, and then approve or reject) a contract directly within Microsoft Word using the Leegality Add-in. ![Word Add-in window](\img\Review-document.png) ### 1. Find the Contract: 1. Open the **Leegality Add-in** in the side panel. 2. You can view all pending actions from your end in the **Task List** (which is the same list seen in the DC browser). ![Task List](\img\My-Tasks.png) 3. Locate the contract needing your review in the **Contract List**. You can use **Filters** or **Search** if needed. You can also click on the task of your choice to route you to the contract. ### 2. Download for Review: ![Download for review](\img\Download-document.png) 1. Click the **Download icon** next to the contract name. This action is available during internal negotiation stages. 2. Check the box for **Enable offline review mode**. This prevents others from editing the contract on the Leegality platform while you work in Word. 3. The contract will open in your main Word window. ### 3. Make Your Edits & Comments: Use Microsoft Word's standard features to make changes: * Turn on **Track Changes** (**Review** tab) to clearly show your edits. * Add **Comments** (**Review** tab) to ask questions or provide feedback without changing the text directly. * Save the document periodically as you work, just like you would do in a Word document. > **Info — NOTE** > > Edits and comments made in Word are marked as **external** comments. If you want to use **internal** comments, please use the DC browser's online editor. ### 4. Upload Your Revised Version: The upload feature is unique; it automatically detects and uploads the document currently open in your Word window, eliminating the need for manual file selection. ![Upload document](\img\upload-document.png) 1. Once you've finished editing and commenting, go back to the **Leegality Add-in side panel**. 2. Click the **Upload** button. 3. Optional: You can optionally give this version a specific name. 4. This saves your edited Word document back to the Leegality platform as a new version and removes the offline lock if you enabled it. --- ## Extended Functionality in the Plugin ### AI Review In Word Add-In The **AI Review** feature is available in the Leegality Word Add-in, allowing you to efficiently assess documents for potential risks and compliance issues without leaving Microsoft Word. You can access AI Review directly from the right-side panel in the Add-in. ![AI review in Word Add in](\img\WordAddin-AIReview.png) #### Key Differences in Word Add-in The AI Review feature in Word Add-in offers unique advantages compared to the browser version: 1. **Open-Ended Document Review:** You can open any document directly in Word and use AI Review—no need to initiate it through the DC platform first. This provides greater flexibility for ad-hoc contract reviews. 2. **Insert Text with Track Changes:** When AI Review identifies issues (Not Met or Not Found cases) and provides suggested additions: * Click **Insert Text** to add the suggested clause directly into your Word document. * Click **Insert Text [Track Mode]** to add the suggestion with Track Changes enabled, making it easy to review and accept or reject the changes later. > **Info — NOTE** > > These insertion options are not available in the browser version. #### How to Use AI Review in Word Add-in 1. Open your document in Microsoft Word with the Leegality Add-in active. 2. In the right-side panel, locate and click on **AI Review** above the other features. 3. Select the Rule Set you wish to use for the review from the dropdown menu. 4. Click **Run** to start the AI Review process. 5. Review the results categorized as: * **Met:** Requirements fully satisfied * **Not Met:** Requirements found but need improvement * **Not Found:** Required clauses missing from the document 6. For **Not Met** and **Not Found** cases, use the **Insert Text** or **Insert Text [Track Mode]** buttons to add suggested clauses directly into your document. 7. Click **Re-run** after making changes to see updated results. > **Info — NOTE** > > For detailed information about AI Review functionality, see [AI Review](https://knowledge.leegality.com/deal-collaboration/deal-negotiation/ai-review). To learn how to create and manage Rule Sets, see [Rule Set Management](https://knowledge.leegality.com/deal-collaboration/Settings/rules-set). All other features available in the DC browser are also accessible in the Word Add-in, providing a consistent experience across platforms. ### Approve or Reject After uploading, the workflow buttons for the contract might become active in the side panel (depending on the contract stage and your permissions). * Click **Approve** if the contract (with your revisions, if any) is satisfactory for the current stage. * Click **Reject** if the contract requires significant changes from others before proceeding. This action advances the contract's stage on the Leegality platform. ### Comparing Document Versions Compare the currently open document (the Base Version) with any historical version uploaded to the DC platform. ![Compare documents](\img\Compare-document.png) 1. Click the **Compare icon** ($\approx$) in the side panel. 2. **Base version:** This is the version currently opened in your Word window. 3. **Revised version:** Select any one of the revised versions uploaded in DC under the contract to compare against. 4. Click **Run Compare**. The Add-in displays the changes between the current document and the selected revised version. ### Sharing a Document Share the latest document version with other collaborators on the contract (this mirrors the functionality in the DC platform). ![Share the Document](\img\share-document.png) 1. Click the **Share icon** ($\rightarrow$). 2. Select users from the organization's user list. 3. Attach additional deal documents, if any. 4. Optional: Provide any additional message you want to share. 5. Click **Share**. ### Viewing the Activity Log The **Activity Log** shows all actions logged in real-time, remaining consistent with the DC web platform audit trail. ![Activity log](\img\DC-Plugin-Activity log.PNG) > **Info — NOTE** > > All these features are also available in the DC platform, providing similar functionality. ### Additional Actions Depending on the contract stage, multiple options may appear. Click the **More** icon (⋮) to view all available actions. ![More actions](\img\More-actions.png) | Action | Description | | :--- | :--- | | **Discard** | Permanently deletes the document from the platform. Use this action with caution. This feature is always available. | | **Unlock document** | Manually removes the lock on the document, allowing others to access and edit it on the DC platform. | | **Upload signed documents** | Uploads the copy of the document back to the Deal Collaboration platform. | ### Advance Contract Workflow to DC You can move the document to the next stage of its pre-defined workflow (e.g., from 'Draft' to 'Awaiting Approval') directly from the Add-in, pushing the status update to the DC platform. | Action | Purpose | | :--- | :--- | | **Approve / Reject** | Used during internal review stages. | | **Send for External Review** | Moves the contract to the counterparty negotiation stage. Internal comments are automatically deleted before sharing. | | **Mark as Ready for Signing** | Moves the document to the final configuration stage. | These actions work the same in the browser and the plugin. The Word Add-in handles the collaboration and negotiation lifecycle but hands off specific final processes to the DC web platform. ![Configure signing window](\img\Configure-signing.png) > **Info — NOTE** > > Clicking the **Configure Signing** button will redirect the user to the specific configuration page on the DC web platform. Here, once you login, you will see your [configure signing](https://knowledge.leegality.com/deal-collaboration/signing-journey) journey. For E-Signing, users will be redirected from DC to the Document Execution platform. --- URL: https://knowledge.leegality.com/deal-collaboration/activity-logs # Activity Logs The Activity Logs page gives you a complete record of every action taken across your deals — who did what, when, and on which document. Use it to stay on top of your contract workflows and maintain a clear audit trail. ## How to Access Activity Logs 1. Sign in to your Deal Collaboration platform. 2. Select **Activity Logs** from the left navigation panel on the Deal Collaboration home page. ![DC Activity Log](https://knowledge.leegality.com/img/DC_ActivityLogs.png) The Activity Logs table displays the following information for each entry: | Column | What It Shows | | :---- | :---- | | **User** | Name and email address of the person who performed the action | | **Document Name** | Title of the document along with its unique Document ID | | **Action** | A description of what happened (e.g., "Document approved"), along with the exact date and time | | **Document Status** | A colour-coded badge showing the current stage of the document | ## Search Activities 1. Head to the **Search bar** at the top. 2. Type in a document name, Document ID, or any keyword from the Action column. The table will instantly filter to show matching results. ## Download Report To export your activity logs: 1. Click **Select Dates** to choose a time range. The available options are: Today, Yesterday, Last 7 days, Last 30 days, Last month, This month, All time, and Custom (pick a specific start and end date). 2. Click **Download Report** to export the logs as an `.xlsx` file. > **Tip** > > If you skip selecting a date range and directly click **Download Report**, it will export the all-time report by default. ## Refresh Click the **Refresh** button to pull in the latest activity. This is handy when you're actively monitoring a deal and want to see real-time updates. ## Document Status Reference Each log entry shows a status badge indicating where the document currently stands. Here's what each status means: | Status | What It Means | | :---- | :---- | | **Under Internal Review** | The document is being reviewed by your internal team | | **Ready for External Review** | Internal review is done — the document is ready to be shared with the counterparty | | **External Review** | The counterparty has received the document for their review | | **Negotiation Internal** | Your team is redlining or discussing changes internally | | **Negotiation External** | The document is in active negotiation with the counterparty | | **Ready for Signing** | Negotiation is complete — the document is ready to be sent for signatures | | **Sent for Signing** | Signature requests have been sent out to the signatories | | **Executed** | All parties have signed — the document is fully executed | | **Discarded** | The document process has been cancelled | --- URL: https://knowledge.leegality.com/deal-collaboration/Settings/global-variables # Global Variables Global variables are accessible to all users, allowing them to add these pre-built variables when [creating a template](https://knowledge.leegality.com/deal-collaboration/Templates/create-template). ## Types of Global Variables ### Default Variables These are system-defined variables that come pre-configured and cannot be edited. You can enable or disable these variables as needed, but their core definition remains unchanged. If the default terminology does not align with your organization's usage, you can assign an **alias**—a different name that fits your context. > **Info — Example** > > If the default variable is "Term" but your organization uses "Tenure," you can set "Tenure" as the alias for "Term." ### Custom Variables These variables can be created to fit your specific needs from the settings. You have complete control over custom variables, including the ability to edit or delete them at any time. Both Default and Custom variables are available for use in templates during the creation process. ## To create a Global Variable 1. Click **Settings** on the left. 2. Click on the **+ Add Custom Variable** button. 3. In the **Add Custom Variable** pop-up. - **Variable Name:** Enter a suitable variable name. - **Variable Type:** Select the variable type from available options. - **Placeholder Text:** Enter text to provide hints or examples of the expected input. 4. Click **Save**. --- URL: https://knowledge.leegality.com/deal-collaboration/Settings/rules-set # Rule Set ## What are Rule Sets? Rule Sets are collections of rules that guide AI in reviewing your contracts. Think of a Rule Set as a checklist and each Rule as an item on that checklist. When AI reviews your documents, it needs to know what to look for—specific clauses, conditions, terms, or compliance requirements. Rule Sets ensure the AI review is: - **Consistent** across all your documents - **Customized** to your organization's requirements - **Reusable** without reconfiguring for each document ## How Rule Sets and Rules Work Together Each Rule Set is a collection of related rules. One Rule Set can contain multiple Rules, allowing you to organize your review criteria logically. **Important Limits:** - Each Rule Set must contain **at least 1 rule** - Each Rule Set can contain **up to 50 rules** - You can create **unlimited** Rule Sets ## Create a Rule Set ### 1. Navigate to the Rule Set tab 1. From the **Settings** page, click the **Rule Set** tab. A table showing all configured rule sets appears. 2. Click **+ Add Rule Set** to begin creating a new rule set. ### 2. Enter rule set details 1. In the **Name** field, enter a unique name for the rule set. 2. In the **Description** field, provide a brief summary of the rule set's purpose. This is optional. 3. Click **Proceed**. A new window opens for you to define rules within the rule set. ## Add Rules to a Rule Set ### 1. Add a rule 1. Click **+ Add Rule**. A configuration panel appears on the right side of the screen. ### 2. Configure rule details 1. In the **Rule** field, define the condition or logic the AI will use to review the document. This is a mandatory field. 2. In the **Rule Description** field, provide a brief summary that explains the rule's purpose and scope. 3. In the **Suggested Clause** field, enter a recommended alternative clause to ensure compliance. You can modify this clause as needed before finalizing the contract. > **Info — Character Limits** > > Each field— **Rule, Rule Description**, and **Suggested Clause** —can accommodate up to 2000 characters. 4. Click **Save** to save the rule and return to the rule set overview page. > **Info — NOTE** > > A confirmation message, "Rule added successfully!" appears. 5. To add more rules, click **Add New Rule**. 6. Once you have added all rules, click **Finish** to complete the process. > **Tip — Best Practice** > > While **Rule Description** and **Suggested Clause** are optional, providing them clearly helps the AI deliver more accurate and actionable reviews. --- URL: https://knowledge.leegality.com/sign-station/introduction # Introduction to SignStation SignStation is a **self-hosted DocSigner utility** that lets your organisation apply its own eSign on large volumes of documents, such as invoices, policies and official letters. ## Built for High-Volume Organizations SignStation is meant for documents that only require your organisation’s signature and do not need your customer’s signature—documents like insurance policies, invoices and official letters. ## Why SignStation? Many enterprises sign large volumes of simple documents (invoices, policies, letters) every day. This is often handled either manually through shared DSC tokens—which is repetitive and time-consuming—or through generic DocSigner utilities that can be more complex and expensive than necessary for this specific use case. SignStation is designed to provide automated, server-side signing for these documents in a cost-efficient, secure way, while comfortably handling large daily volumes. ## The SignStation Advantage SignStation transforms the economics of digital signing through a **fixed yearly license model**: - **Pay Once, Sign Unlimited**: A single annual license fee covers unlimited signatures for the entire year. - **Massive Cost Savings**: Prospect to save a huge sum compared to pay-per-signature models. - **Predictable Expenditure**: No surprises—know your exact annual signing costs upfront. - **Self-Hosted Control**: Deploy on your own infrastructure for complete data sovereignty and security. ## How It Works SignStation operates on a simple principle: 1. **Purchase an annual license** for your organization 2. **Deploy the platform** on your own servers (self-hosted) 3. **Sign unlimited documents** throughout the license period using digital certificates 4. **Scale without limits**—no per-signature fees, no hidden costs ## The Impact By switching to SignStation, high-volume organizations achieve: - **Financial Efficiency** - **Operational Freedom** - **Budget Certainty** - **Enterprise Control** ## Next Steps Ready to get started? Head over to [Logging In](https://knowledge.leegality.com/sign-station/getting-started/logging-in) to access your SignStation account. --- URL: https://knowledge.leegality.com/sign-station/getting-started/logging-in # Logging In to SignStation Learn how to access your SignStation account and get started with document signing. > **Tip — New to SignStation?** > > If you're unfamiliar with SignStation, start with the [Introduction](https://knowledge.leegality.com/sign-station/introduction) to understand its features and benefits. ## Steps to Log In Open your web browser and navigate to the SignStation URL provided by your administrator. 1. Enter your **Email address** or **Phone number** in the login field 2. Enter your **Password** in the password field 3. Click the **Sign In** button to access your account > **Info — Admin Credentials** > > The initial admin credentials are provided by Leegality. Once logged in, the admin can create new users and assign them credentials (username and password). ## After Logging In Once you successfully log in, you'll be directed to the SignStation dashboard where you can begin managing licenses, certificates, and signing documents. **Next:** Learn about the [Dashboard Overview](https://knowledge.leegality.com/sign-station/getting-started/dashboard-overview) to familiarize yourself with the interface. --- URL: https://knowledge.leegality.com/sign-station/getting-started/dashboard-overview # Dashboard Overview The Dashboard functions as the application's control center, providing key statistics on signing activity, certificate status, and centralized navigation to all core features. ![Dashboard](\img\dashboard_overview_img.PNG) ## Application Header and Controls The static header provides essential global controls and user context. | Element | Description | |---------|-------------| | **Department Selection** | The **All Departments** dropdown displays the currently active department. A department must be selected before initiating any new document signing workflow. | | **Settings Icon** (⚙️) | Provides access to global application configuration settings, user preferences, and system management options. | | **Profile/User Icon** | Accesses user account management, including profile details and the application logout function. | ## Navigation Sidebar The sidebar provides immediate access to the primary functional modules of SignStation. | Link | Function | |------|----------| | **Sign New Document** (Button) | Initiates the three-step document signing workflow: Upload → Configure → Sign. | | **Home** | Navigates back to the current Dashboard view. | | **Documents** | Directs the user to the document management module for viewing transaction history and document status. | | **Certificates** | Navigates to the Certificate Manager for reviewing, adding, and modifying digital certificates. | ## Document Signing Statistics This section summarizes the volume of successful document signing activity across defined periods: - **Today**: Displays the total count of documents successfully signed on the current calendar day. - **Last 30 Days, Last 90 Days, Last 365 Days**: Show the rolling count of documents successfully signed within these respective historical windows. Each card includes a trend indicator reflecting performance compared to the previous period. The metric is based on final signed documents. ## Certificate Status Overview This area monitors the status and inventory of all digital certificates configured within the system: - **Total Certificates:** Reports the total number of certificates configured. The accompanying text indicates how many of these are currently **Configured** and active. - **Certificates Expiring Within Next 30 Days:** This critical warning indicator shows the count of active certificates scheduled to expire within the next 30 days. - **Review Certificates**: Provides direct navigation to the Certificate Manager for certificate maintenance. ## Recently Signed Documents This section functions as a quick-access activity log, displaying the most recent document signing transactions. Each entry lists the **File Name**, the **Signed By** user (who signed the document), the **Department** context, the **Certificate Name** used, and the **Date** of the successful signing. > **Tip** > > The **Show More** link, located in the top right, directs the user to the full Documents module for a complete transaction history. The section displays a fixed, recent number of entries. --- URL: https://knowledge.leegality.com/sign-station/getting-started/initial-setup # Initial Setup Guide This guide outlines the essential steps to set up SignStation for the first time. Follow these steps in order to ensure your organization is ready to start signing documents. > **Tip — Before You Start** > > Make sure you have received your license file from Leegality and gathered all necessary information about your organization's structure, users, and digital certificates. ## Step 1: Upload Your License Your SignStation instance requires a valid license file to activate and operate. This license file is provided by Leegality and should be uploaded first before any other configuration. **What You Need:** - License file from Leegality (`.lic` or similar format) Without an active license, you cannot access SignStation features. Once uploaded, verify that the license status shows as **ACTIVE**. 📖 **Learn More:** [Create a License](https://knowledge.leegality.com/sign-station/license-manager/create-license) ## Step 2: Create Departments Departments represent organizational units within SignStation and help organize users and control access to certificates. Think of them as divisions in your company structure like Legal, Finance, HR, or Operations. **What You Need:** - List of department names based on your organizational structure Start with at least one department. You can always add more later as your needs grow. Use clear, descriptive names that align with your document signing workflows. 📖 **Learn More:** [Department Management](https://knowledge.leegality.com/sign-station/user-management/department-management) ## Step 3: Create Roles Roles define permission levels and control what users can do within SignStation. Each role contains a set of entitlements (permissions) such as signing documents, managing certificates, creating users, or modifying system settings. **What You Need:** - Understanding of user responsibilities in your organization - Permission structure based on job functions Common roles include Super Admin (full access), Document Signer (basic signing permissions), Certificate Manager (certificate handling), and Department Admin (departmental oversight). Design roles based on job functions rather than individual users for easier management. 📖 **Learn More:** [Role Management](https://knowledge.leegality.com/sign-station/user-management/role-management) ## Step 4: Add Users Once departments and roles are configured, create user accounts for everyone who will access SignStation. Each user is assigned to one or more departments and given a specific role. **What You Need:** - User's full name and email address - Department assignment(s) for each user - Role assignment for each user - Initial passwords (can be set manually or auto-generated) Users must be marked as "Active" to log in. You can choose to set passwords manually or have the system generate secure passwords and email them automatically. 📖 **Learn More:** [User Management](https://knowledge.leegality.com/sign-station/user-management/user-management) ## Step 5: Add Digital Certificates Digital certificates are required to electronically sign documents. Each certificate is linked to a specific department, and users can only access certificates from their assigned departments. **What You Need:** - PFX/P12 certificate files in PKCS12 format - Certificate passwords (passkeys) - Department assignment for each certificate Certificates must be in .pfx or .p12 format, under 5MB, and not expired. Store certificate files and passwords securely, and never share passwords through unencrypted channels. 📖 **Learn More:** [Adding Certificates](https://knowledge.leegality.com/sign-station/certificate-management/adding-certificates) ## Step 6: Configure Settings (Optional) Customize SignStation with additional settings for notifications, security policies, and data retention. **Email Notifications:** Set up SMTP configuration to send notifications for events like user creation, document signing, and certificate expiry warnings. Learn more in [Notification Settings](https://knowledge.leegality.com/sign-station/notifications). **Security Policies:** Configure password requirements including minimum length, complexity rules, and special character requirements. Learn more in [System Settings](https://knowledge.leegality.com/sign-station/system-settings). **Data Retention:** Define how long signed documents, audit trails, and system logs are retained before automatic deletion. ## Verification Checklist Before starting production use, ensure: - [ ] License is uploaded and shows **ACTIVE** status - [ ] At least one department is created - [ ] At least one role is created with appropriate permissions - [ ] Admin user account is created and active - [ ] At least one digital certificate is uploaded and linked to a department - [ ] You can log in successfully with a user account - [ ] You can select a department from the header dropdown - [ ] Email notifications are configured (if required) ## Next Steps Once initial setup is complete, test the signing workflow by signing a test document to ensure everything works correctly. Train your users on how to log in and sign documents, and monitor certificate expiry dates to set up renewal reminders. **Ready to sign your first document?** Head to [Uploading Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/uploading-documents) to get started. ## Need Help? If you encounter issues during setup such as license validation errors, certificate upload problems, or user creation failures, contact Leegality support for assistance. --- URL: https://knowledge.leegality.com/sign-station/license-manager/create-license # Create a New License Before you can start using SignStation, you need to acquire a valid license from Leegality and upload it to your system. ## How to Obtain a License To obtain a new license or renew an existing license, contact our support team. They will assist you with license generation and provide the license file. > **Info** > > Our support team will guide you through the license acquisition process and ensure you receive the appropriate license file for your SignStation instance. ## Upload Your License to SignStation Once you receive your license file from our support team, follow these steps to upload and activate it: ### Steps to Upload License 1. Navigate to **License Manager** in the Settings menu 2. Click the **Create License** button 3. Upload the license file provided by our support team 4. Click **Create License** to activate ### License Activation After uploading: 1. The system will validate the license file 2. If valid, the license will be activated immediately 3. You'll see a success message confirming the license has been applied 4. The new license will appear in the License Management table with an **ACTIVE** status ## Understanding License Upload Errors If your license file upload is unsuccessful, you may encounter one of the following error messages. ### Common Error Messages | Error Message | Description | |---------------|-------------| | "Your license has expired. Please renew your license or contact support." | The license file has passed its expiration date. | | "License validation failed. The license may be invalid or corrupted. Please contact support." | License validation failed due to invalid JWT format, tampered file, invalid signature, public key mismatch, or file corruption. | | "You have reached the limit for [resource] in your current license. Please upgrade your license or contact support." | The current license has reached its capacity for a specific resource (such as signatures, users, or other features). | > **Info** > > If you encounter any of these errors, contact our support team with the error message. They will assist you in resolving the issue and provide a new license file if necessary. --- URL: https://knowledge.leegality.com/sign-station/license-manager/viewing-managing-license-status # Managing License Status The License Management page provides a comprehensive overview of all active and historical licenses applied to your SignStation instance, along with detailed usage statistics. This page helps you track license validity, monitor consumption, and ensure uninterrupted service. ## Accessing License Management To access the License Management page: 1. Click the **Settings** icon (⚙️) in the application header 2. In the left sidebar, click **License Manager** 3. The License Management page displays all your licenses. ## License Management Table The main view displays a table listing all licenses with the following information: | Field | Description | |-------|-------------| | **License ID** | The unique identifier for the license file. | | **Customer ID** | The identifier associated with the purchasing customer or organization. | | **Expiry Date** | The date the license will cease to be valid. | | **Status** | The current operational state of the license (e.g., Active, Expired). | | **License Type** | The specific tier or feature set enabled by the license. | | **Created At** | The date and time the license was uploaded to the system. | > **Tip** > > Keep track of the **Expiry Date** to ensure you renew your license before it expires, avoiding any service interruption. #### License Status Types The **Status** field indicates the following operational states: | Status | Description | |--------|-------------| | **ACTIVE** | The license is currently valid and fully operational. | | **SUSPENDED** | The license has been temporarily deactivated, typically due to administrative action. | | **REVOKED** | The license has been permanently canceled and cannot be used. | | **EXPIRED** | The license validity period has ended. | > **Warning** > > If your license shows **SUSPENDED**, **REVOKED**, or **EXPIRED**, contact your administrator or vendor immediately to resolve the issue and restore service. #### License Types The **License Type** field specifies the granted features: | License Type | Description | |--------------|-------------| | **Normal** (Standard License) | The primary license that provides the standard set of features and usage rights. | | **Topup** (Resource Topup) | Adds extra resources or capacity on top of an existing license. | | **Validity** (Validity Extension) | Extends the duration or expiration date of the current license. | | **Trial** (Trial License) | A temporary license for evaluating features before purchase. | | **Feature** (Feature License) | Unlocks specific add-on features beyond the standard license. | > **Info** > > You can have multiple licenses active simultaneously. For example, a NORMAL license for base operations plus a FEATURE license for premium capabilities. ## Viewing Usage Statistics To view detailed usage metrics for a specific license: ### Steps to Access Usage Statistics 1. Locate the desired license in the License Management table 2. Click the **three-dot menu** (⋮) associated with that license row 3. Select **View Usage Statistics** A **License Usage Statistics** pop-up window appears, displaying the current utilization metrics under this license: | Metric | Description | |--------|-------------| | **Number of Users** | Total users utilizing the license. | | **Number of Departments** | Total departments utilizing the license. | | **Number of Signatures** | Total signatures consumed under the license. | | **Number of Certificates** | Total certificates configured under the license. | > **Info — INFO** > > Usage statistics help you understand how your license is being consumed across your organization and plan for future capacity needs. ## Best Practices - **Monitor Expiry Dates**: Regularly check license expiry dates to avoid service disruptions. - **Track Usage Metrics**: Review usage statistics periodically to understand consumption patterns. - **Understand License Types**: Know which license types you have to maximize their benefits. - **Plan Renewals**: Contact your vendor well in advance of expiry to ensure timely license renewal. - **Watch for Status Changes**: Be alert to any status changes from ACTIVE to ensure continuous operation. --- URL: https://knowledge.leegality.com/sign-station/profile-management # Profile Settings The Profile section allows individual users to view their personal account information and manage their password. Access this section by selecting **Profile** from the sidebar. Users cannot modify their email address from this interface. ## Personal Info | Field | Description | |-------|-------------| | **Name** | The full name associated with the user account. | | **Username** | The user's email address, which serves as their login identifier. | | **Role** | The system role(s) assigned to the user, defining their permissions. | | **Departments** | A list of all organizational departments to which the user has been assigned access. | > **Info** > > Personal information displayed here is managed by your administrator. Contact your administrator if you need to update your role, or department assignments. #### Profile Restrictions The admin user **cannot** modify their own: - Email address - Username - Department assignment However, the admin user **can**: - Modify their own role assignments - Update other users' profile details (including email, name, roles, and departments) > **Warning — System Protection** > > To ensure continuous system access, at least one admin user must exist at all times. If you attempt to delete or demote the last remaining admin user, the system will prevent the action and display an error message: **"Cannot delete the last admin user"** ## Change Password To update the password for the current user account: 1. Click the **Change Password** button located in the "Personal Info" section. A "Change Password" pop-up window will appear. 2. Enter the following information: - **Current Password**: Enter your existing password in this field - **New Password**: Enter the desired new password. Ensure it meets the system's password policy requirements. - **Confirm New Password**: Re-enter the new password to confirm accuracy 3. Click **Save Changes** to update your password. - Click **Cancel** to dismiss the pop-up without making any changes > **Caution — Password Requirements** > > Your new password must comply with the organization's [password policy](https://knowledge.leegality.com/sign-station/system-settings). This may include minimum length, special characters, numbers, and uppercase letters. If your password doesn't meet these requirements, the system will display an error message. > **Tip — Security Best Practice** > > Change your password regularly and avoid reusing old passwords. Never share your password with others. --- URL: https://knowledge.leegality.com/sign-station/user-management/user-management # User Management User management controls access to the SignStation application, defining user credentials, permissions, Roles, and scope (Departments). To access the section, - Navigate to **Settings** section. - Select **User Management**. - Go to the **Users** section. This centralized interface allows administrators to create user accounts, assign roles and departments, manage passwords, and control account status. ## Adding a New User 1. Click the **Add User** button. A creation window will appear. 2. **Enter User Details:** - Enter the full **Name** of the user - Enter the user's primary **Email address** 3. **Configure Access:** - **Select Role**: Choose a single Role from the dropdown list. Roles define the user's permissions within the system. Refer to [Role Management](https://knowledge.leegality.com/sign-station/user-management/role-management) for configuration details. - **Select Departments**: Choose one or more Departments from the dropdown list to assign the user access scope. Refer to [Department Management](https://knowledge.leegality.com/sign-station/user-management/department-management) for configuration details. 4. **Set Credentials and Status:** - Enter the initial **Password** for the user - Ensure the **Enable Active User** option is checked to make the account immediately usable 5. Click **Add User** to finalize the creation of the new account ## Managing Existing Users The main Users section displays a list of configured users, their assigned roles, and departments. ### Searching and Filtering - **Search**: Use the Search bar to quickly locate a specific user by name or email - **Show Inactive User**: Check this box to display users whose accounts are currently disabled ### User Actions (More Options Menu) Click the **three-dot menu** (⋮) next to a user's entry to access the following management options: #### Edit User This option allows modification of user profile and status details: 1. Click **Edit** from the options. 2. Edit the fields as per your requirement. **Editable Fields:** - Update the user's **Name** - Update the user's **Email** - Change the assigned **Role** and **Department** 3. Toggle the user's account status by marking the user as **active** or **not active** 4. Click **Update User** after making changes. #### Set Password This option provides two methods for resetting a user's password: #### Set Manual Password Click this option to enter a custom password in the provided field. **Steps:** 1. Enter a custom password in the password field. 2. Optionally, check the **"Send email notification to user"** box to deliver the new password via email. 3. Click **Set Password** to apply the change, or **Cancel** to exit. > **Caution** > > Ensure manually set passwords meet your organization's security requirements. #### Generate System Password Click this option to generate a secure, randomized password. **Steps:** 1. The system automatically generates a secure password. 2. Click **Generate and Send Password** to automatically email the new password to the user. 3. Click **Cancel** to exit. > **Tip** > > System-generated passwords are cryptographically secure and meet security best practices. #### Delete User Clicking **Delete** removes the selected user account from SignStation. A confirmation prompt will appear before the deletion is executed. > **Warning** > > User deletion is permanent and cannot be undone. Ensure you no longer need this account before proceeding. --- URL: https://knowledge.leegality.com/sign-station/user-management/department-management # Department Management Department management allows administrators to create the organizational units used to scope user access and categorize documents. To Access this section, 1. Navigate to **Settings** menu. 2. Select **User Management** 3. Select the **Departments** tab. Departments help organize users and control access to resources within SignStation. ## Adding a New Department 1. Click the **+Add Department** button. A creation window will appear. 2. **Enter Department Name**: Provide a unique name for the new department (e.g., Finance, Legal). 3. Click **Add Department** to save the new department and add it to the list. - To exit without saving, click **Cancel** > **Caution — Error Handling** > > If the provided department name is already in use, the system displays an error message: **"Department with name '[Name]' already exist."** ## Managing Existing Departments The main view lists all configured departments in a table format. | Field | Description | |-------|-------------| | **Department** | The name of the organizational unit. | | **Users** | The total number of users currently assigned to this department. | | **Created** | The date and time the department was created in the system. | ### Department Actions (More Options Menu) Click the **three-dot menu** (⋮) next to a department's entry to access management options: #### Edit Department 1. Click **Edit Department**. A pop-up window will appear. 2. Modify the department's name as required. 3. Click **Update Department** to save the change, or click **Cancel** to revert and exit. #### Delete Department 1. Click **Delete Department**. A confirmation pop-up will appear. 2. Click **Delete** to permanently remove the department from the system. 3. Click **Cancel** to abort the deletion and return to the list. > **Danger — Warning** > > Deleting a department is permanent and cannot be undone. Ensure no critical users or documents are associated with this department before proceeding. --- URL: https://knowledge.leegality.com/sign-station/user-management/role-management # Role Management Role management defines permission sets (Entitlements) that dictate the specific actions users can perform within SignStation. To access this section, 1. Navigate to the **Settings** menu 2. Select **User Management** 3. Go to the **Roles** tab. Roles allow you to create customized permission sets that can be assigned to users based on their responsibilities. ## Adding a New Role To define a new custom role: 1. Click the **+Add Role** button. A creation window will appear. 2. **Enter Role Name**: Provide a descriptive name for the role (e.g., Document Uploader, Admin, Certificate Manager). 3. **Configure Entitlements**: Entitlements define the specific permissions granted to the role. - Review the dropdown list of available entitlements (actions) - Check the box next to any entitlement you wish to assign to this role - To assign all permissions, click **Assign All** - To clear all current selections, click **Unassign All** 4. Click **Add Role** to save the new role and make it available for assignment to users. > **Tip** > > Design roles based on job functions to simplify user management. For example, create separate roles for administrators, document signers, and certificate managers. ## Managing Existing Roles The Roles table displays all configured roles in your system with the following information: | Column | Description | |--------|-------------| | **ID** | Unique identifier for the role | | **Role** | Name of the role | | **Created** | Date and time when the role was created | ### Edit Role To modify an existing role: 1. Click the **three-dot menu** (⋮) next to the role you want to edit 2. Select **Edit Role** from the menu. An "Edit Role" pop-up window will appear. 3. In the Edit Role window, you can: - **Change Role Name**: Modify the name of the role - **Update Entitlements**: Add or remove permissions by checking or unchecking entitlements 4. Click **Update Role** to save your modifications - Click **Cancel** to discard changes and exit > **Info** > > Changes to role entitlements will immediately affect all users assigned to that role. --- URL: https://knowledge.leegality.com/sign-station/certificate-management/adding-certificates # Adding a Digital Certificate You can easily upload and link new digital certificates to your departments through the Certificates tab. This process makes the certificate available for use when signing documents associated with the chosen department. 1. Navigate to the **Certificates** tab and click the **+Add Certificate** button. A new pop-up window will appear. 2. Select the relevant **Department** from the dropdown list. This selection determines which documents can be signed using this specific certificate. > **Important** > > The department selection is necessary as it controls certificate access and usage permissions. 3. In the provided column, enter the certificate **Passkey**. Passkey is the password set when PKCS12 certificate was created. It decrypts the private key in the certificate file. This credential is required to protect and securely utilize the certificate during the signing process. 4. Next, you need to upload your **PFX certificate file**. **Requirements:** - File type: Only PKCS12 format (.p12 or .pfx files) - Max file size: 5MB > **Caution** > > Be sure you are uploading the correct file type (.pfx). Ensure your file meets the size requirements before uploading. 5. Click **Add Certificate** to securely upload the file and link the new certificate to the department you selected. Once the certificate is successfully added: - The certificate will be linked to the selected department - Users in that department can use this certificate for signing documents - The certificate will appear in the certificate dropdown during the signing process. > **Info — NOTE** > > You cannot set or change the certificate expiry date. The expiry date is built into the PFX file itself and will be automatically read from the certificate you upload. --- URL: https://knowledge.leegality.com/sign-station/certificate-management/managing-certificate # Review and Manage Certificates The Certificate Manager provides a comprehensive view and control interface for all linked digital certificates. You can review certificate details, update credentials, and manage certificate lifecycle. ## Access and Interface 1. Access the certificate list by selecting **Review Certificate** from the Dashboard. The main view displays a list of certificates, showing the following critical data points: - **ID**: The unique certificate identifier - **Type**: The certificate standard or classification - **Department**: The assigned organizational unit - **Expiry**: Days remaining until the certificate expires - **Status**: Current operational state (e.g., Active, Expired, Disabled) ## Locating Certificates Users can quickly find specific certificates using the search and filtering capabilities: * **Search**: Use the search bar to find certificates based on their **ID**, **Type**, or **Certificate Name**. * **Filters** 1. **Show disabled only**: Toggles the view to display only certificates currently marked as disabled 2. **Expiring soon**: Filters the list to show only certificates nearing their expiration date 3. **Department Filter**: Allows users to narrow the list to certificates associated with a specific configured department ## Management Actions Click the **More Options menu** (⋮) associated with a certificate to access management actions: ### View Certificate Details Selecting **View** opens a window displaying static certificate details: - Certificate ID - Type - Certificate Name - Created At - Valid To (Expiration date) - Department > **Info — NOTE** > > User can assign one certificate to more than one department. ### Edit Certificate Selecting **Edit** allows credential or file updates: - **Certificate ID**: This value is displayed for reference and cannot be modified. - **Password/Passkey**: Enter the new password required for future certificate use. - **Upload New Certificate File (Optional)**: Upload a new PFX file to replace the existing certificate. > **Info — NOTE** > > If a new certificate file is not uploaded, the existing certificate remains active and is updated with the newly provided password. ### Delete Certificate Selecting **Delete** permanently removes the certificate from the system: 1. A confirmation prompt will appear 2. Select **Delete** to confirm the removal 3. Select **Cancel** to abort the operation and retain the certificate > **Warning** > > Deleting a certificate is permanent and cannot be undone. Ensure you no longer need the certificate before proceeding. --- URL: https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/uploading-documents # Uploading Documents The first step in the signing journey is to upload the document you want to sign. This guide walks you through the complete document signing workflow. ## Document Signing Workflow Signing a document in SignStation follows a simple 4-step process: ![Signing Workflow](\img\Gemini_Generated_Image_i5q0i3i5q0i3i5q0.png) ### Before You Begin Make sure you have: - Selected a **department** from the header dropdown - At least one **digital certificate** configured for your department - A **PDF document** ready to sign ## Step 1: Upload Your Document 1. Click **Sign new Document** button to open the Sign Document window. > **Info — NOTE** > > Make sure to select a department from the dropdown list in the header before starting the document signing process. 2. Click **Start Document Signing** to proceed. 3. Upload PDF Document - Select and upload your PDF document - Upon successful upload, you will be redirected to the **Configure and Sign** window ## Next Steps After uploading your document, proceed to [Sign the Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/sign-the-documents) to configure and apply your digital signature. --- URL: https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/sign-the-documents # Sign the Documents After uploading your document, you'll configure the signature coordinates and certificate details before applying your digital signature. ## Configure and Sign Window Once your document is uploaded, the Configure and Sign window displays: - **Left side**: Preview of the uploaded document - **Right side panel**: Configuration options ## Configuration Steps ### 1. Place Coordinates Choose your preferred coordinate method for signature placement: - **Default Coordinates**: Places the signature at a predefined location on each page. The signature is automatically positioned at the bottom-left corner of every page in the document. Use this option for quick signing when precise placement isn't required. - **Drop Coordinates**: Allows you to manually place signatures anywhere on the document. Choose specific pages and exact positions for each signature. Use this option when you need precise control over signature placement. **Steps for Drop Coordinates:** 1. Click the coordinate placement button. 2. Navigate to where you want the coordinate to appear on the document. 3. Click to place the coordinate. 4. Repeat this process for each signature placement you need. **Download Coordinates:** - Click **Download coordinates** to export them as a JSON file - This file can be used for API calls to sign similar documents repeatedly - Saves time when signing multiple documents with the same signature placement > **Info — NOTE** > > You can only download coordinates if you choose the **Drop Coordinates** option. ### 2. Certificate & Sign Section Configure the following fields: * **Certificate** (Mandatory): Select a certificate from the dropdown list. The number of available certificates for the selected department will be displayed. * **Display Signer Name** (Optional): Enter the name to be displayed on the signature. * **Signer's Reason** (Optional): Enter the reason for signing the document (e.g., "Agreement approval", "Authorization"). * **Location of Signer** (Optional): Enter the geographical location where the document is being signed. ### 3. Sign the Document Once all required fields are configured, click **Sign Document** to apply your digital signature. ## Next Steps After signing, proceed to [Download Signed Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/download-signed-documents) to retrieve your signed document and audit trail. --- URL: https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/download-signed-documents # Download Signed Documents After successfully signing your document, you can review the signed document, download it along with the audit trail, and choose your next action. ## Signed Document View Once the signing process is complete, the signed document is displayed on the screen. ### Document Preview The signed document is shown in the main viewing area where you can review the applied signatures. ### Document Information Panel The right side panel displays all relevant details about the signed document: - **Uploaded by**: User who uploaded the document - **Signer name**: Name of the person who signed - **Department**: Department associated with the signing - **Date and Time**: When the document was signed - **Location**: Location where the document was signed - **Number of signatures placed**: Count of signatures applied - **Certificate**: Certificate used for signing - **Reason**: Reason provided for signing ### Download Options **Download Signed Document:** Click **Download Document** to save the signed PDF document to your local system. **Download Audit Trail**: Click **Download Audit Trail** to download a comprehensive audit trail of the document signing process. This includes: - Timestamp of each action - User details - Certificate information - Signature placement details > **Info — NOTE** > > The Download Audit Trail feature will not work if audit trail generation is not enabled in System Settings. Please ensure that **Document Audit Trails** is turned on in [System Settings](docs\sign-station\system-settings.md) under the Data & Audit tab. ### Navigation Options At any stage of the document signing, you can click the following navigation options: - **Back**: Click **Back** to return to the previous step (Configure and Sign window). - **Sign Another**: Click **Sign Another** to go directly to the Upload Document page to sign another document. - **Back to Home**: Click **Back to Home** to return to the Dashboard. --- URL: https://knowledge.leegality.com/sign-station/signing-journey/reviewing-documents # Reviewing Documents The Documents module provides a centralized list of all documents managed by the user, offering search, filtering, and status tracking for all signing transactions. ## Document Actions and Filtering Access this section by selecting **Documents** from the sidebar. The top section allows users to locate and filter documents: - **Select date range**: Allows filtering the document list based on the date the documents were uploaded or signed. - **Search documents...**: Provides a search bar to quickly find documents by Document Name. - **Status Filter**: A dropdown menu that filters the list by the document's current status (e.g., All Statuses, Signed, Failed). - **Certificate Filter**: A dropdown menu that filters the list to show only documents signed with a specific digital certificate. ## Document List Table The main table displays the filtered results, showing key details for each document. | Column | Description | |--------|-------------| | **Document Name** | The name of the uploaded PDF file. | | **Uploaded By** | The user who initiated the document upload, along with the date and time of the upload. | | **Status** | The current status of the document signing workflow (e.g., Signed). The date of the last status change is often included here. | | **Certificate** | The digital certificate used to sign the document. | ### Document Actions Each document row includes a **three-dot menu** (⋮) for additional actions: - **Download**: Allows you to download the signed document. - **Audit trail**: Provides access to download the audit trail for the document. --- URL: https://knowledge.leegality.com/sign-station/api-credentials # API Credentials API Credentials are essential for integrating with SignStation's API services. Before calling any API, you need to have a secret key that authenticates your application and ensures secure communication between your system and SignStation. 1. Navigate to **Settings** from the sidebar. 2. Select **API Credentials**. This section allows you to view, create, and manage all your API authentication credentials. ## Viewing API Credentials The API Credentials page displays a table showing all the credentials you have created. The table includes the following information: | Column | Description | |--------|-------------| | **Credential Name** | The unique name you assigned to the credential. | | **Client ID** | The unique identifier used to authenticate API requests. | | **Client Secret** | The secret key associated with the credential (hidden for security reasons). | | **Created At** | The date and time when the credential was created. | | **Status** | Indicates whether the credential is active or inactive. | ## Create Credential To create a new API credential for your application: 1. Click the **+Create Credential** button at the top of the API Credentials page. A pop-up window will appear. 2. **Enter Credential Name**: Provide a meaningful name for your credential. - **Important**: The credential name must be 6-64 characters long. - Only use alphanumeric characters, underscores (_), and hyphens (-). - Do not use spaces or special characters. 3. Click **Create Credential** to generate the secret key. 4. **Save Your Client Secret**: Once created, the client secret key will be displayed **only once**. - **Critical**: Make sure to copy and store it securely for later use. - You will not be able to view this secret again after closing the window. 5. Click **I have saved the credentials securely** to close the window and complete the process. > **Info — NOTE** > > The client secret is shown only once during creation. If you lose it, you will need to delete the credential and create a new one. ## More Options Each credential in the table has a three-dot menu (⋮) that provides additional actions: ### Copy Client ID Click this option to quickly copy the Client ID associated with the credential to your clipboard. This is useful when configuring API integrations. ### Delete Credentials Click this option to permanently delete the corresponding credential. Use this when a credential is no longer needed or has been compromised. > **Warning** > > Deleting a credential cannot be undone. Any applications using this credential will immediately lose API access. --- URL: https://knowledge.leegality.com/sign-station/audit-logs # Audit Logs The Audit Logs page provides a centralized record of all system events and user actions within the SignStation application. To access the section, 1. Navigate to **Settings** page. 2. Select **Audit Logs** from the sidebar. ### 1. Filtering and Date Range - **Date Range**: Users can filter the displayed events by selecting a custom date range using the **Select date range** option. This allows for focused analysis of activity during specific periods. - **Total Results**: The total number of records matching the current filter (or the entire history, if no filter is applied) is displayed (e.g., "Total 125 results"). ### 2. Audit Log Table The log table captures the details of every system action. Each column is sortable: | Column | Description | |--------|-------------| | **Created** | The date and time the event was recorded. | | **Action** | The type of activity that occurred (e.g., DEPARTMENT_ADDED, USER_CREATED, DOCUMENT_SIGNED). | | **User** | The user account responsible for initiating the action. | | **Details** | A summary description of the event, including the entity affected (e.g., "Department Test added successfully"). | | **IP Address** | The IP address from which the action was initiated. | > **Info** > > All columns in the audit log table are sortable, allowing you to organize events by date, action type, user, or IP address. ### 3. Export Logs The **Export Logs** button (located in the top right of the log table) allows administrators to download the displayed log data. **How it works:** - Clicking this button initiates a download of the log entries that currently match the applied **Date Range** filter - Logs are typically exported as a standard file format (e.g., CSV or JSON) for external analysis or long-term archiving > **Tip** > > Export logs regularly for compliance requirements and to maintain historical records beyond the system's retention period. ### View Details Each log entry includes a **three-dot menu** (⋮). **Steps to view event details:** 1. Click the three-dot menu next to a log entry 2. For specific actions, select the **View Details** option 3. A supplementary window opens, providing granular information about the specific event (e.g., the exact payload or parameters used when a user was created) > **Info — NOTE** > > Not all log entries may have detailed information available. The View Details option appears only for actions that contain additional granular data. --- URL: https://knowledge.leegality.com/sign-station/notifications # Notification Settings The Notification Settings module configures the global email notification system, including the email service provider details, the specific events that trigger notifications, and reminders for certificate expiration. Access this section by selecting **Notifications** from the sidebar. The settings are organized into three tabs: **Email Configuration**, **Notification Rules**, and **Certificate Reminders**. The email address configured here will be displayed as the sender on all outgoing notifications. ## 1. Email Configuration (SMTP Configuration) This tab is used to configure the external SMTP server details required for SignStation to send emails. | Field | Description | |-------|-------------| | **SMTP Host** | The hostname or IP address of the SMTP server (e.g., smtp.gmail.com). | | **SMTP Port** | The port number used to connect to the SMTP server (e.g., 587). | | **SMTP Username** | The username credential for authenticating with the SMTP server. | | **SMTP Password** | The password credential for authenticating with the SMTP server. | | **From Email** | The email address displayed as the sender on all outgoing notifications. | | **From Name** | The name displayed as the sender on all outgoing notifications (e.g., "Himanshu Kumar"). | | **Reply To** | The email address that receives replies to system notifications. | ### Security and Activation - **Use TLS encryption**: Toggle this option to encrypt the communication channel between SignStation and the SMTP server. - **Enable email notifications**: Toggle this option on to globally activate all email notifications configured in the other tabs. ### Actions - **Test Email**: Click to send a test email to verify the SMTP settings are correct. - **Save Configuration**: Click to save the entered SMTP server details. > **Tip** > > Always use the Test Email function after configuring SMTP settings to ensure emails are being sent correctly before enabling notifications system-wide. ## 2. Notification Rules This tab controls which specific system events trigger an email notification. Each rule can be toggled on or off globally. > **Warning — Important Setup Requirement** > > Before signing documents, ensure you have completed the following steps: > 1. **Configure Email Settings**: First, set up your SMTP configuration in the Email Configuration tab > 2. **Enable Notification Rules**: Then, enable the appropriate notification rules in this tab > > For document signing notifications, make sure to enable the **Document Signed** notification rule (notification type: DOCUMENT_SIGNED). Without this configuration, documents will still be signed successfully, but no email notifications will be sent to users. Following are the notification rules you can configure: | Notification Rule | Description | |-------------------|-------------| | **User Created** | Toggles notifications when a new user account is successfully provisioned. | | **User Deleted** | Toggles notifications when a user account is removed from the system. | | **Document Signed** | Toggles notifications upon the successful completion of a document signing workflow. | | **License Expiry Reminders** | Toggles notifications related to upcoming license expiration dates. | | **License Expired** | Toggles notifications when a license has officially expired. | | **Certificate Expired** | Toggles notifications when a configured certificate has officially expired. | > **Info** > > Enable only the notifications that are relevant to your organization to avoid email overload for administrators and users. ## 3. Certificate Reminders This tab configures the timing and recipients for notifications regarding upcoming certificate expiration. ### Certificate Expiry Reminders This section defines the lead time for reminders: - **Reminder Days**: Enter the number of days before expiration that the reminder email should be sent (e.g., entering "30" sends a reminder 30 days before expiration). - Click **+ Add Reminder** to save the configured reminder period. ### Reminder Recipients This section defines who receives the expiration notifications: **Notify Roles:** - Select the system roles (e.g., Admin, Certificate Manager) whose members should receive the certificate expiration reminders. **Additional Email Recipients:** - Enter specific email addresses in the input field and click the **+** button to add individual recipients who are not defined by a role. **Action:** Click **Save Reminder Settings** to apply all configuration changes made on this tab. > **Caution — Important** > > Ensure certificate expiry reminders are set with sufficient lead time to allow for certificate renewal and avoid service disruption. --- URL: https://knowledge.leegality.com/sign-station/system-settings # System Settings The System Settings module allows administrators to configure policies governing user security, data retention, and audit trail generation for the SignStation application. To Access this section, 1. Navigate to the sidebar and select **System Settings**. 2. The settings are organized into two primary tabs: **Security** and **Data & Audit**. ## Security The Security tab controls authentication and user credential requirements. ### A. Password Policy This section defines the structural requirements for all user passwords within the system. 1. **Minimum Password Length:** - Enter the minimum number of characters required for a user's password - This value must be 6 or more (Cannot be less than 6) 2. Specify **Password Requirements:** Toggle these options to enforce complexity rules: - **Require numbers**: Enforces the inclusion of at least one numeral (0-9) - **Require special characters**: Enforces the inclusion of at least one special symbol (e.g., !, @, #) - **Require uppercase letters**: Enforces the inclusion of at least one uppercase letter (A-Z) 3. Click **Save Password Policy** to apply changes system-wide. > **Tip** > > Implement strong password policies to enhance account security. Consider requiring a combination of numbers, special characters, and uppercase letters. ## Data & Audit The Data & Audit tab configures policies related to data lifecycle management and mandatory logging. ### A. Data Retention Policies These policies define automatic cleanup rules for system data after a specified period. The retention period is set in days. #### Signed Documents & Audit Trails - Turn this option on to activate retention rules for completed signed documents and their associated audit trails. - **Retention Period (days)**: Enter the number of days the documents and trails must be kept before automatic deletion. > **Caution** > > Setting a retention period will automatically delete documents and audit trails after the specified number of days. Ensure this complies with your organization's legal and compliance requirements. #### System Audit Logs - Turn this option on to activate retention rules for the general System Audit Logs. - **Retention Period (days)**: Enter the number of days the system logs must be retained. ### B. Audit Trail Configuration This section governs the mandatory generation of audit data for core operations. **Document Audit Trails:** Toggle this option on to ensure that a comprehensive audit trail is automatically generated and attached to every document signing operation performed in SignStation. > **Info — NOTE** > > Enabling document audit trails ensures full traceability of all signing operations, which is essential for regulatory compliance and dispute resolution. Click **Save Data & Audit Settings** to apply all changes made within this tab. --- # Leegality SignStation API URL: https://knowledge.leegality.com/sign-station/api/leegality-signstation-api > Welcome to the Leegality Sign Service (SignStation) API documentation. SignStation is Leegality's on-premise digital signing platform. This API lets you integrate every part of it — from signing documents with your own PKCS12 certificates to managing users, roles, audit logs, and notifications — directly into your applications and back-office systems. Welcome to the Leegality Sign Service (SignStation) API documentation. SignStation is Leegality's on-premise digital signing platform. This API lets you integrate every part of it — from signing documents with your own PKCS12 certificates to managing users, roles, audit logs, and notifications — directly into your applications and back-office systems. ## What can you do with this API? - **Sign documents** — Apply legally valid digital signatures, retrieve signed copies, and download audit trails for compliance. - **Manage certificates** — Upload, assign, and track expiry of PKCS12 (`.pfx` / `.p12`) certificates used for signing. - **Control access** — Create users and departments, define roles with granular entitlements (RBAC), and enforce password policies. - **Authenticate** — Use JWT Bearer tokens via user login, or OAuth2 client credentials for machine-to-machine integrations. - **Configure notifications** — Set up email rules for events such as certificate expiry, document completion, and more. - **Audit & comply** — Search detailed audit logs of every system action; configure retention and audit trail generation. - **Manage your license** — Install license files, view current status, and track usage statistics. ## Base URL SignStation is deployed on your own infrastructure, so the base URL is unique to your organisation. The reference instance used throughout this documentation is: `https://sign-station.theleegality.com` Replace it with your own SignStation host when making API calls. If you are unsure of your base URL, contact your SignStation administrator. ## Getting started 1. **Generate a token** — Call `/api/v1/auth/login` with your username and password to receive a JWT Bearer token. For machine-to-machine flows, use `/api/v1/auth/token` with OAuth2 client credentials. 2. **Authorise your requests** — Click **Authorize** on this page (or include the header `Authorization: Bearer ` in your client) to try out endpoints directly from the documentation. 3. **Explore by feature** — Each section in the left sidebar maps to one functional area of SignStation (Documents, Certificates, Users, Roles, and so on). Every endpoint includes request and response examples. For the dashboard equivalent of these flows, see [Logging In](https://knowledge.leegality.com/sign-station/getting-started/logging-in) and [API Credentials](https://knowledge.leegality.com/sign-station/api-credentials). ## Need help? Reach out to [support@leegality.com](mailto:support@leegality.com) for any questions about your integration or deployment. JWT Bearer token authentication. Use the login endpoint (/api/v1/auth/login) to get a token, then click 'Authorize' and enter: Bearer <your-jwt-token>
Security Scheme Type: http
HTTP Authorization Scheme: bearer
Bearer format: JWT
--- # AuditLog Controller URL: https://knowledge.leegality.com/sign-station/api/audit-log-controller.tag > AuditLog Controller The Audit Log API provides endpoints for searching and retrieving audit log entries within the SignStation platform. Audit logs capture a detailed record of system activities, user actions, and significant events for security, compliance, and troubleshooting purposes. All audit log operations are scoped to the authenticated user's organization. Use this API to search audit logs based on various criteria such as date range, user, action type, and more. For the dashboard view and filters, see [Audit Logs](https://knowledge.leegality.com/sign-station/audit-logs). ```mdx-code-block ``` --- # Auth Controller URL: https://knowledge.leegality.com/sign-station/api/auth-controller.tag > Auth Controller The Authentication API provides endpoints for user authentication, token generation, and user session management within the Sign Station platform. This API handles both user login (username/password) and OAuth2 client authentication flows. The `/auth/login` and `/auth/token` endpoints do not require authentication (they generate tokens). The `/auth/me` endpoint requires a valid JWT Bearer token obtained from login or token endpoint. **Token Generation:** Use `/auth/login` for user tokens or `/auth/token` for OAuth2 client tokens. For dashboard sign-in, see [Logging In](https://knowledge.leegality.com/sign-station/getting-started/logging-in); to generate OAuth2 client credentials from the dashboard, see [API Credentials](https://knowledge.leegality.com/sign-station/api-credentials). ```mdx-code-block ``` --- # Certificate Management URL: https://knowledge.leegality.com/sign-station/api/certificate-management.tag > Certificate Management The Certificate Management API allows you to upload, store, and assign the PKCS12-formatted certificates ($.pfx$ or $.p12$) required for legally valid digital signatures. These cryptographic credentials act as a digital seal, ensuring document integrity and proving the identity of the signer to comply with global standards like ISO or eIDAS. By using these endpoints to track expiry and manage department-level assignments, you ensure that your platform maintains the necessary credentials to perform secure, non-repudiable signing operations. See also [Adding a Digital Certificate](https://knowledge.leegality.com/sign-station/certificate-management/adding-certificates) and [Managing Certificates](https://knowledge.leegality.com/sign-station/certificate-management/managing-certificate) for the dashboard workflow. ```mdx-code-block ``` --- # Certificate Notification Configuration Controller URL: https://knowledge.leegality.com/sign-station/api/certificate-notification-configuration-controller.tag > Certificate Notification Configuration Controller The Certificate Notification Configuration API provides endpoints for managing certificate expiry notification settings within the Sign Station platform. This configuration allows organizations to define how and when notifications are sent regarding upcoming certificate expirations, ensuring timely renewals and minimizing disruptions to document signing processes. See also [Notifications](https://knowledge.leegality.com/sign-station/notifications) and [Managing Certificates](https://knowledge.leegality.com/sign-station/certificate-management/managing-certificate). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/change-password # PUT /api/v1/users/change-password — Change user password Changes the password for the currently authenticated user. The new password must comply with the organization's password policy. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/users/change-password ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/change-password` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/change-password` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `currentPassword` | string | Yes | The current password of the user | `TestPassword@123` | | `newPassword` | string | Yes | The new password to set for the user | `NewPassword@123` | | `confirmPassword` | string | Yes | Confirmation of the new password | `NewPassword@123` | ### Sample Request ```json { "currentPassword": "TestPassword@123", "newPassword": "NewPassword@123", "confirmPassword": "NewPassword@123" } ``` --- ## Responses ### 200 — Password changed successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | object | No | Additional data related to the response, if any. | — | ### 400 — Invalid request data or passwords don't match | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailChangePassword400VO** below. | — | #### ErrorDetailChangePassword400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `New password and confirm password do not match` | | `path` | string | No | API path that generated the error | `/api/v1/users/change-password` | ### 401 — Current password is incorrect | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailChangePassword401VO** below. | — | #### ErrorDetailChangePassword401VO Password change request | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Authentication failed. Invalid username or password.` | | `path` | string | No | API path that generated the error | `/api/v1/users/change-password` | | `code` | string | No | Specific error code | `LE_ERR_SS_301` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": {} } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-1 # POST /api/v1/certificates — Create new certificate Creates new certificate for the current user's organization. Certificate file should be uploaded as multipart/form-data. Supported format: .p12/.pfx (PKCS12) only (max size: 5MB) **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/certificates ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates` --- ## Request Body **Content-Type:** `application/json` Certificate data including name, passkey, type, expiry, departmentId, enabled flag, and certificate file | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `passkey` | string | No | Passkey for the certificate file | `mySecretPasskey` | | `certificateFile` | string | No | Certificate file to be uploaded | `TestCertificate.leegality.com` | | `departmentId` | string | No | Associated department ID | — | | `enabled` | boolean | No | Indicates whether the certificate is enabled or disabled | — | ### Sample Request ```json { "passkey": "mySecretPasskey", "certificateFile": "TestCertificate.leegality.com", "departmentId": "string", "enabled": false } ``` --- ## Responses ### 201 — Certificate created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | CertificateVO | No | See **CertificateVO** below. | — | #### CertificateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 400 — Invalid request data or unsupported file format | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailVO** below. | — | #### ErrorDetailVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate with id 46d4e120-ed03-47cc-98c6-529bff3bbaba doe` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/46d4e120-ed03-47cc-98c6-529bff3bbaba` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Certificate already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateCertificate409VO** below. | — | #### ErrorDetailCreateCertificate409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate with alias 'MyCertificate' already exists for or` | | `path` | string | No | API path that generated the error | `/api/v1/certificates` | | `code` | string | No | Specific error code | `LE_ERR_SS_1101` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "data": { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-config-1 # POST /api/v1/certificate-notification-config — Create new certificate notification configuration Creates new certificate notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/certificate-notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificate-notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificate-notification-config` --- ## Request Body **Content-Type:** `application/json` Certificate notification configuration data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `reminderDays` | array\ | No | Days before expiry to send reminders | `2` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anagha.babu@leegality.com` | | `notifyRoleIds` | array\ | No | Role IDs to be notified | `17d7949d-6fa9-4077-a76e-da349efe421b` | | `enabled` | boolean | No | Indicates whether the certificate notification is enabled | `true` | ### Sample Request ```json { "reminderDays": [ 2 ], "additionalEmailRecipients": [ "anagha.babu@leegality.com" ], "notifyRoleIds": [ "17d7949d-6fa9-4077-a76e-da349efe421b" ], "enabled": true } ``` --- ## Responses ### 201 — Certificate notification configuration created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `Your changes have been successfully saved.` | | `data` | CertificateNotificationConfigVO | No | See **CertificateNotificationConfigVO** below. | — | #### CertificateNotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate notification configuration unique identifier | `6d8ff341-fe21-431e-9453-bb94959474b6` | | `reminderDays` | array\ | No | Days before expiry to send reminders | `2` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anagha.babu@leegality.com` | | `enabled` | boolean | No | Indicates whether the certificate notification is enabled | `true` | | `createdAt` | string | No | The date and time when the certificate notification configuration was created | `2025-12-29T12:00:29.726603` | | `notifyRoles` | array\ | No | See **NotificationRoleVO** below. | — | ##### NotificationRoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `17d7949d-6fa9-4077-a76e-da349efe421b` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Test Role 12344` | | `createdAt` | string | No | The date and time when the role was created | `2025-11-13T14:05:34` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateCertificateNotificationConfig400VO** below. | — | #### ErrorDetailCreateCertificateNotificationConfig400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [additionalEmailRecipients], Invalid` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Role does not exist | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateCertificateNotificationConfig404VO** below. | — | #### ErrorDetailCreateCertificateNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Role does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 409 — Configuration already exists for organization | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateCertificateNotificationConfig409VO** below. | — | #### ErrorDetailCreateCertificateNotificationConfig409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate notification configuration already exists for or` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_1202` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "code": "LE_SS_001", "message": "Your changes have been successfully saved.", "data": { "id": "6d8ff341-fe21-431e-9453-bb94959474b6", "reminderDays": [ 2 ], "additionalEmailRecipients": [ "anagha.babu@leegality.com" ], "enabled": true, "createdAt": "2025-12-29T12:00:29.726603", "notifyRoles": [ { "id": "17d7949d-6fa9-4077-a76e-da349efe421b", "name": "Test Role 12344", "createdAt": "2025-11-13T14:05:34" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-config # POST /api/v1/notification-config — Create new notification configuration Creates new notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-config` --- ## Request Body **Content-Type:** `application/json` Notification configuration data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `emailServerHost` | string | Yes | Email server host address | `smtp.example.com` | | `emailServerPort` | string | No | Email server port | `587` | | `username` | string | No | Username for email server authentication | `anagha.babu@leegality.com` | | `password` | string | No | Password for email server authentication | `NewPassword@123` | | `fromEmail` | string | No | Email address used in the 'From' field of outgoing emails | `testuser@leegality.com` | | `fromName` | string | No | Name used in the 'From' field of outgoing emails | `Leegality Test User` | | `replyTo` | string | No | Email address used in the 'Reply-To' field of outgoing emails | `testuser@leegality.com` | | `tlsEnabled` | boolean | No | Indicates whether TLS is enabled for email communication | `true` | | `enabled` | boolean | No | Indicates whether the notification configuration is enabled | — | ### Sample Request ```json { "emailServerHost": "smtp.example.com", "emailServerPort": "587", "username": "anagha.babu@leegality.com", "password": "NewPassword@123", "fromEmail": "testuser@leegality.com", "fromName": "Leegality Test User", "replyTo": "testuser@leegality.com", "tlsEnabled": true, "enabled": false } ``` --- ## Responses ### 201 — Notification configuration created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SCS_SS_200` | | `message` | string | No | Response message providing additional information | `Notification configuration created successfully` | | `data` | NotificationConfigVO | No | See **NotificationConfigVO** below. | — | #### NotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification configuration unique identifier | `5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2` | | `emailServerHost` | string | No | Email server host address | `smtp.gmail.com` | | `emailServerPort` | string | No | Email server port | `587` | | `username` | string | No | Username for email server authentication | `himanshu.kumar@leegality.com` | | `password` | string | No | Password for email server authentication | `NewPassword@123` | | `fromEmail` | string | No | Email address used in the 'From' field of outgoing emails | `himanshu.kumar@leegality.com` | | `fromName` | string | No | Name used in the 'From' field of outgoing emails | `Himanshu Kumar` | | `replyTo` | string | No | Email address used in the 'Reply-To' field of outgoing emails | `himanshu.kumar@leegality.com` | | `tlsEnabled` | boolean | No | Indicates whether TLS is enabled for email communication | `true` | | `createdAt` | string | No | The date and time when the notification configuration was created | `2025-10-10T15:42:45` | | `enabled` | boolean | No | Indicates whether the notification configuration is enabled | `false` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateNotificationConfig400VO** below. | — | #### ErrorDetailCreateNotificationConfig400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [fromEmail], From email must be a va` | | `path` | string | No | API path that generated the error | `/api/v1/notification-config` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Configuration already exists for organization | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateNotificationConfig409VO** below. | — | #### ErrorDetailCreateNotificationConfig409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Notification configuration for organization 'TestOrganizatio` | | `path` | string | No | API path that generated the error | `/api/v1/notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "code": "LE_SCS_SS_200", "message": "Notification configuration created successfully", "data": { "id": "5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2", "emailServerHost": "smtp.gmail.com", "emailServerPort": "587", "username": "himanshu.kumar@leegality.com", "password": "NewPassword@123", "fromEmail": "himanshu.kumar@leegality.com", "fromName": "Himanshu Kumar", "replyTo": "himanshu.kumar@leegality.com", "tlsEnabled": true, "createdAt": "2025-10-10T15:42:45", "enabled": false } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-notification-rule # POST /api/v1/notification-rules — Create new notification rule Creates new notification rule for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/notification-rules ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-rules` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-rules` --- ## Request Body **Content-Type:** `application/json` Notification rule data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `ruleType` | string | Yes | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anaghaputhur2018@gmail.com` | | `userIds` | array\ | No | User IDs to be notified | `0e663652-1198-4777-8139-3efeda8e1d77` | | `enabled` | boolean | No | Indicates whether the notification rule is enabled | `true` | ### Sample Request ```json { "ruleType": "USER_CREATED", "additionalEmailRecipients": [ "anaghaputhur2018@gmail.com" ], "userIds": [ "0e663652-1198-4777-8139-3efeda8e1d77" ], "enabled": true } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | NotificationRuleVO | No | See **NotificationRuleVO** below. | — | #### NotificationRuleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification rule unique identifier | `a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f` | | `ruleType` | string | No | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anaghaputhur2018@gmail.com` | | `notifyUsers` | array\ | No | See **NotificationRuleUserVO** below. | — | | `enabled` | boolean | No | Indicates whether the notification rule is enabled | `true` | | `createdAt` | string | No | The date and time when the notification rule was created | `2025-10-10T15:47:41` | ##### NotificationRuleUserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `f6b0449d-b866-4647-b5c5-9ce765eb1184` | | `name` | string | No | Full name of the user | `Anagha Babu` | | `email` | string | No | Email address of the user | `anagha.babu@leegality.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `false` | ### 400 — Bad Request | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailNotificationRule400VO** below. | — | #### ErrorDetailNotificationRule400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request payload.` | | `path` | string | No | API path that generated the error | `/api/v1/notification-rules` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Conflict | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailNotificationRule409VO** below. | — | #### ErrorDetailNotificationRule409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `USER_CREATED rule type already exists.` | | `path` | string | No | API path that generated the error | `/api/v1/notification-rules` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": { "id": "a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f", "ruleType": "USER_CREATED", "additionalEmailRecipients": [ "anaghaputhur2018@gmail.com" ], "notifyUsers": [ { "id": "f6b0449d-b866-4647-b5c5-9ce765eb1184", "name": "Anagha Babu", "email": "anagha.babu@leegality.com", "active": true, "enabled": false } ], "enabled": true, "createdAt": "2025-10-10T15:47:41" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-o-auth-2-client # POST /api/v1/oauth2-clients — Create new OAuth2 client Creates new OAuth2 client for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/oauth2-clients ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/oauth2-clients` - Sandbox: `https://sandbox.leegality.com/api/api/v1/oauth2-clients` --- ## Request Body **Content-Type:** `application/json` OAuth2 client data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `clientId` | string | Yes | OAuth2 client identifier | `HS1cVm1fLDctBGvAyiu76MIr9PfIqSAl0t2dKHkwWknost8nFh6J5HOiM3SD` | ### Sample Request ```json { "clientId": "HS1cVm1fLDctBGvAyiu76MIr9PfIqSAl0t2dKHkwWknost8nFh6J5HOiM3SDM" } ``` --- ## Responses ### 201 — OAuth2 client created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `Your changes have been successfully saved.` | | `data` | OAuth2ClientVO | No | See **OAuth2ClientVO** below. | — | #### OAuth2ClientVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | OAuth2 client unique identifier | `8c18cc0b-6251-490e-82ac-dfde6f4735c1` | | `clientId` | string | No | OAuth2 client identifier | `HS1cVm1fLDctBGvAyiu76MIr9PfIqSAl0t2dKHkwWknost8nFh6J5HOiM3SD` | | `clientSecret` | string | No | OAuth2 client secret | `SR2KJGnlodwZWBUNBubPRNYSqCW_TUTD4A8Vhf1t2aM` | | `state` | string | No | OAuth2 client state Allowed: `ACTIVE`, `SUSPENDED`. | `ACTIVE` | | `createdAt` | string | No | The date and time when the OAuth2 client was created | `2025-12-29T15:43:17.528673` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailOAuth2Client400VO** below. | — | #### ErrorDetailOAuth2Client400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [clientId], Client ID must be 6-64 c` | | `path` | string | No | API path that generated the error | `/api/v1/oauth2-clients` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — OAuth2 client already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailOAuth2Client409VO** below. | — | #### ErrorDetailOAuth2Client409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `OAuth2 client with ID 'QTw1RK-0lKoycG82K1S_V7O8Fs0YPQIoGJD7'` | | `path` | string | No | API path that generated the error | `/api/v1/oauth2-clients` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "code": "LE_SS_001", "message": "Your changes have been successfully saved.", "data": { "id": "8c18cc0b-6251-490e-82ac-dfde6f4735c1", "clientId": "HS1cVm1fLDctBGvAyiu76MIr9PfIqSAl0t2dKHkwWknost8nFh6J5HOiM3SDM", "clientSecret": "SR2KJGnlodwZWBUNBubPRNYSqCW_TUTD4A8Vhf1t2aM", "state": "ACTIVE", "createdAt": "2025-12-29T15:43:17.528673" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-password-policy # POST /api/v1/password-policy — Create new password policy This API creates a new password policy for the current user's organization. Each organization can have only one password policy and it is created during the initial setup. Subsequent updates should use the update endpoint. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/password-policy ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/password-policy` - Sandbox: `https://sandbox.leegality.com/api/api/v1/password-policy` --- ## Request Body **Content-Type:** `application/json` Password policy data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `minimumPasswordLength` | integer | Yes | Minimum length required for passwords | `8` | | `numbersRequired` | boolean | Yes | Indicates if numbers are required in passwords | `true` | | `specialCharactersRequired` | boolean | Yes | Indicates if special characters are required in passwords | `true` | | `uppercaseRequired` | boolean | Yes | Indicates if uppercase letters are required in passwords | `true` | ### Sample Request ```json { "minimumPasswordLength": 8, "numbersRequired": true, "specialCharactersRequired": true, "uppercaseRequired": true } ``` --- ## Responses ### 201 — Password policy created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_001` | | `message` | string | No | Response message providing additional information | `Password policy created successfully` | | `data` | PasswordPolicyVO | No | See **PasswordPolicyVO** below. | — | #### PasswordPolicyVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Password policy unique identifier | `9ef35b27-86c8-4450-8807-317c37a61aae` | | `minimumPasswordLength` | integer | No | Minimum length required for passwords | `6` | | `numbersRequired` | boolean | No | Indicates if numbers are required in passwords | `false` | | `specialCharactersRequired` | boolean | No | Indicates if special characters are required in passwords | `false` | | `uppercaseRequired` | boolean | No | Indicates if uppercase letters are required in passwords | `true` | | `createdAt` | string | No | The date and time when the password policy was created | `2025-10-10T15:58:34` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailPasswordPolicy400VO** below. | — | #### ErrorDetailPasswordPolicy400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [minimumPasswordLength], Minimum pas` | | `path` | string | No | API path that generated the error | `/api/v1/password-policy` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Password policy already exists for organization | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailPasswordPolicy409VO** below. | — | #### ErrorDetailPasswordPolicy409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Password policy for organization 'TestOrganization' already ` | | `path` | string | No | API path that generated the error | `/api/v1/password-policy` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "code": "LE_SS_001", "message": "Password policy created successfully", "data": { "id": "9ef35b27-86c8-4450-8807-317c37a61aae", "minimumPasswordLength": 6, "numbersRequired": false, "specialCharactersRequired": false, "uppercaseRequired": true, "createdAt": "2025-10-10T15:58:34" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-role # POST /api/v1/roles — Create new role Creates new role for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/roles ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/roles` - Sandbox: `https://sandbox.leegality.com/api/api/v1/roles` --- ## Request Body **Content-Type:** `application/json` Role data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Role name. E.g., "Admin", "User" etc. | — | | `entitlementIds` | array\ | No | Entitlement IDs to assign to the role | — | ### Sample Request ```json { "name": "string", "entitlementIds": [ "string" ] } ``` --- ## Responses ### 200 — Role created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | RoleVO | No | See **RoleVO** below. | — | #### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ##### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateRole400VO** below. | — | #### ErrorDetailCreateRole400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [name], Role name is required` | | `path` | string | No | API path that generated the error | `/api/v1/roles` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Role already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateRole409VO** below. | — | #### ErrorDetailCreateRole409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Role with name 'TestRole' already exist.` | | `path` | string | No | API path that generated the error | `/api/v1/roles` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-settings # POST /api/v1/settings — Create new settings Creates new settings for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/settings ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/settings` - Sandbox: `https://sandbox.leegality.com/api/api/v1/settings` --- ## Request Body **Content-Type:** `application/json` Settings data to update | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentRetentionEnabled` | boolean | No | Indicates if document retention is enabled | `true` | | `documentRetentionPeriod` | integer | No | Document retention period in days | `100` | | `auditLogsRetentionEnabled` | boolean | No | Indicates if audit logs retention is enabled | `true` | | `auditLogsRetentionPeriod` | integer | No | Audit logs retention period in days | `100` | | `auditTrailGenerationEnabled` | boolean | No | Indicates if audit trail generation is enabled | `true` | ### Sample Request ```json { "documentRetentionEnabled": true, "documentRetentionPeriod": 100, "auditLogsRetentionEnabled": true, "auditLogsRetentionPeriod": 100, "auditTrailGenerationEnabled": true } ``` --- ## Responses ### 201 — Settings created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_004` | | `message` | string | No | Response message providing additional information | `Settings updated successfully.` | | `data` | SettingsVO | No | See **SettingsVO** below. | — | #### SettingsVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Settings ID. This is configured during the settings creation. | `ed99d2dd-f44e-4278-a3e2-13a1ed2be13c` | | `documentRetentionEnabled` | boolean | No | Indicates if document retention is enabled | `true` | | `documentRetentionPeriod` | integer | No | Document retention period in days | `30` | | `auditLogsRetentionEnabled` | boolean | No | Indicates if audit logs retention is enabled | `true` | | `auditLogsRetentionPeriod` | integer | No | Audit logs retention period in days | `90` | | `auditTrailGenerationEnabled` | boolean | No | Indicates if audit trail generation is enabled | `true` | | `createdAt` | string | No | The date and time when the settings were created | `2025-12-08T15:28:26` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailSettings401VO** below. | — | #### ErrorDetailSettings401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/settings` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Settings already exist for organization | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailSettings409VO** below. | — | #### ErrorDetailSettings409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Settings for organization 'TestOrganization' already exist.` | | `path` | string | No | API path that generated the error | `/api/v1/settings` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (201) ```json { "code": "LE_SS_004", "message": "Settings updated successfully.", "data": { "id": "ed99d2dd-f44e-4278-a3e2-13a1ed2be13c", "documentRetentionEnabled": true, "documentRetentionPeriod": 30, "auditLogsRetentionEnabled": true, "auditLogsRetentionPeriod": 90, "auditTrailGenerationEnabled": true, "createdAt": "2025-12-08T15:28:26" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create-user # POST /api/v1/users — Create new user Creates a new user for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/users ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users` --- ## Request Body **Content-Type:** `application/json` Updated user data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Full name of the user | — | | `email` | string | Yes | Email address of the user | — | | `password` | string | No | Password for the user account | — | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | — | | `departmentIds` | array\ | No | List of department IDs the user belongs to | — | | `roleIds` | array\ | Yes | List of role IDs assigned to the user | — | ### Sample Request ```json { "name": "string", "email": "string", "password": "string", "active": false, "departmentIds": [ "string" ], "roleIds": [ "string" ] } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `User retrieved successfully.` | | `data` | UserVO | No | See **UserVO** below. | — | #### UserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Full name of the user | `John Doe` | | `email` | string | No | Email address of the user | `user@example.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `true` | | `createdAt` | string | No | The date and time when the user was created | `2025-12-15T10:20:30Z` | | `departments` | array\ | No | See **DepartmentVO** below. | — | | `roles` | array\ | No | See **RoleVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateUser400VO** below. | — | #### ErrorDetailCreateUser400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [email], Email is required` | | `path` | string | No | API path that generated the error | `/api/v1/users` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — User with the given email already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailCreateUser409VO** below. | — | #### ErrorDetailCreateUser409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `User with email 'anagha.babu@leegality.com' already exist.` | | `path` | string | No | API path that generated the error | `/api/v1/users` | | `code` | string | No | Specific error code | `LE_ERR_SS_010` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "User retrieved successfully.", "data": { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "John Doe", "email": "user@example.com", "active": true, "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/create # POST /api/v1/departments — Create new department This API creates a new department for the current user's organization. Note that department creation is subject to license limits. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/departments ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/departments` - Sandbox: `https://sandbox.leegality.com/api/api/v1/departments` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | The department name (e.g., "Human Resources"). Must be between 2 and 255 characters. | — | | `enabled` | boolean | No | Shows the status of the department. For an active department, the value is set to true; for an inactive department, it is set to false. | — | ### Sample Request ```json { "name": "string", "enabled": false } ``` --- ## Responses ### 200 — Department created successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | — | | `message` | string | No | Response message | — | | `data` | DepartmentVO | No | See **DepartmentVO** below. | — | #### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | — | | `message` | string | No | Response message | — | | `data` | DepartmentVO | No | See **DepartmentVO** below. | — | #### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 409 — Department already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | — | | `message` | string | No | Response message | — | | `data` | DepartmentVO | No | See **DepartmentVO** below. | — | #### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/delete-1 # DELETE /api/v1/certificates/{id} — Delete certificate Deletes a certificate by its ID for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/api/v1/certificates/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Certificate ID | — | --- ## Responses ### 200 — Certificate deleted successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | object | No | Additional data related to the response, if any. | — | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Certificate not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailVO** below. | — | #### ErrorDetailVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate with id 46d4e120-ed03-47cc-98c6-529bff3bbaba doe` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/46d4e120-ed03-47cc-98c6-529bff3bbaba` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": {} } ``` --- URL: https://knowledge.leegality.com/sign-station/api/delete-config # DELETE /api/v1/certificate-notification-config — Delete certificate notification configuration for current organization Deletes certificate notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/api/v1/certificate-notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificate-notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificate-notification-config` --- ## Responses ### 200 — Certificate notification configuration deleted successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | object | No | Additional data related to the response, if any. | — | ### 401 — Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401VO** below. | — | #### ErrorDetail401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Configuration not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailDeleteCertificateNotificationConfig404VO** below. | — | #### ErrorDetailDeleteCertificateNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Configuration not found.` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_1201` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": {} } ``` --- URL: https://knowledge.leegality.com/sign-station/api/delete-o-auth-2-client # DELETE /api/v1/oauth2-clients/{id} — Delete OAuth2 client Deletes OAuth2 client by ID for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/api/v1/oauth2-clients/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/oauth2-clients/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/oauth2-clients/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | OAuth2 client ID to be deleted. | — | --- ## Responses ### 200 — OAuth2 client deleted successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_004` | | `message` | string | No | Response message | `OAuth2 client updated successfully.` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — OAuth2 client not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailOAuth2Client404VO** below. | — | #### ErrorDetailOAuth2Client404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `OAuth2 Client with id a3a0e830-66b6-4845-bf1a-91e0966fb97a d` | | `path` | string | No | API path that generated the error | `/api/v1/oauth2-clients/a3a0e830-66b6-4845-bf1a-91e0966fb97a/` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_004", "message": "OAuth2 client updated successfully." } ``` --- URL: https://knowledge.leegality.com/sign-station/api/delete-user # DELETE /api/v1/users/{id} — Delete user Soft deletes a user by ID (sets enabled=false). Prevents deletion of the last admin user. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/api/v1/users/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | ID of the user to be deleted. | — | --- ## Responses ### 200 — User disabled successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | object | No | Additional data related to the response, if any. | — | ### 400 — Cannot delete the last admin user | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailDeleteUser400VO** below. | — | #### ErrorDetailDeleteUser400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Cannot delete the last admin user. The system must have at l` | | `path` | string | No | API path that generated the error | `/api/v1/users/{id}` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — User not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailDeleteUser404VO** below. | — | #### ErrorDetailDeleteUser404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `f6b0449d-b866-4647-b5c5-9ce765eb1182 does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/users/f6b0449d-b866-4647-b5c5-9ce765eb1182` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": {} } ``` --- URL: https://knowledge.leegality.com/sign-station/api/delete # DELETE /api/v1/departments/{id} — Delete department This API deletes a department by its ID for the current user's organization. Note that deleting a department actually disables it. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` DELETE https://app1.leegality.com/api/api/v1/departments/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/departments/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/departments/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | The unique ID of the department to be deleted. | — | --- ## Responses ### 200 — Department disabled successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | object | No | Additional data related to the response, if any. | — | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Department not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailDeleteDepartment404VO** below. | — | #### ErrorDetailDeleteDepartment404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Department does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/departments/acd77746-6eb2-4ad3-9356-e9f12f7ef501` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": {} } ``` --- # Department Controller URL: https://knowledge.leegality.com/sign-station/api/department-controller.tag > Department Controller The Department Management API provides endpoints for managing departments within an organization. Departments are used to organize users, certificates, and documents within the SignStation platform. All department operations are scoped to the authenticated user's organization. Use this API to create, retrieve, update and delete departments as needed. For the dashboard workflow, see [Department Management](https://knowledge.leegality.com/sign-station/user-management/department-management). ```mdx-code-block ``` --- # Documents URL: https://knowledge.leegality.com/sign-station/api/documents.tag > Documents The Document Management API provides endpoints for digitally signing documents, retrieving document information, downloading signed documents and audit trails, searching documents, and viewing document signing statistics. All document operations are organization-scoped and require proper authentication and authorization. For the dashboard signing journey, see [Uploading Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/uploading-documents), [Signing Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/sign-the-documents), [Reviewing Documents](https://knowledge.leegality.com/sign-station/signing-journey/reviewing-documents), and [Downloading Signed Documents](https://knowledge.leegality.com/sign-station/signing-journey/signing-a-document/download-signed-documents). ```mdx-code-block ``` --- # Entitlement Controller URL: https://knowledge.leegality.com/sign-station/api/entitlement-controller.tag > Entitlement Controller The Entitlement API provides read-only access to the system's permission definitions. Entitlements represent individual permissions or capabilities within the SignStation platform (e.g., `readDocument`, `writeUser`, `signDocument`). This API allows administrators and developers to discover available permissions when configuring Role-Based Access Control (RBAC) systems. Each entitlement corresponds to a specific action or resource access right. Entitlements are system-defined and cannot be created or modified via API; they are managed by system administrators. To see how entitlements are grouped into assignable roles, see [Role Management](https://knowledge.leegality.com/sign-station/user-management/role-management). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/find-by-id-1 # GET /api/v1/certificates/{id} — Get certificate by ID The API retrieves a certificate by its ID for the current user's organization. It fetches the complete certificate information including name, type, expiry date, creation date, and department assignment. Note that the API does NOT return the actual certificate file or passkey (security reasons). **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/certificates/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | ID of the certificate to be retrieved. | — | --- ## Responses ### 200 — Certificate retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 400 — Invalid UUID provided | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificate400VO** below. | — | #### ErrorDetailGetCertificate400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid UUID provided.` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/invalid-id-123` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificate401VO** below. | — | #### ErrorDetailGetCertificate401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/{id}` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 403 — Forbidden - Access denied | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_403` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificate403VO** below. | — | #### ErrorDetailGetCertificate403VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Access denied for the requested operation.` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/{id}` | | `code` | string | No | Specific error code | `LE_ERR_SS_007` | ### 404 — Certificate not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailVO** below. | — | #### ErrorDetailVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate with id 46d4e120-ed03-47cc-98c6-529bff3bbaba doe` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/46d4e120-ed03-47cc-98c6-529bff3bbaba` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } ``` --- URL: https://knowledge.leegality.com/sign-station/api/find-by-id # GET /api/v1/departments/{id} — Get department by ID This API retrieves a department by its ID for the current user's organization. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/departments/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/departments/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/departments/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Provide the Department ID here. You can obtain this ID from the Search Departments API. | — | --- ## Responses ### 200 — Department retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | — | | `message` | string | No | Response message | — | | `data` | DepartmentVO | No | See **DepartmentVO** below. | — | #### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Department not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailFindDepartmentById404VO** below. | — | #### ErrorDetailFindDepartmentById404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Department does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/departments/5a626ba7-51ef-4042-92d8-7eec79640bc5` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/generate-token # POST /api/v1/auth/token — OAuth2 Client Token Authenticates an OAuth2 client using client ID and client secret credentials. This API is designed for machine-to-machine (M2M) communication and programmatic API access. Returns a JWT access token associated with the user linked to the OAuth2 client. The token contains the user's permissions and can be used to make API calls on behalf of that user. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/auth/token ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/auth/token` - Sandbox: `https://sandbox.leegality.com/api/api/v1/auth/token` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `clientId` | string | Yes | The client ID issued to the client during the registration process. | `TestAPISecretKey` | | `clientSecret` | string | Yes | The client secret issued to the client during the registration process. | `7wHdO0PBqujt63lrlDwf-kbfrI3sKhjHf5-psnNj8-c` | ### Sample Request ```json { "clientId": "TestAPISecretKey", "clientSecret": "7wHdO0PBqujt63lrlDwf-kbfrI3sKhjHf5-psnNj8-c" } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure of the token request. | `LE_SS_301` | | `message` | string | No | A message providing additional information about the token request. | `Authentication successful.` | | `data` | TokenVO | No | See **TokenVO** below. | — | #### TokenVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `accessToken` | string | No | JWT token to use in Authorization header as 'Bearer ' | `eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiw` | | `tokenType` | string | No | Type of the token, typically "Bearer" for JWT tokens. | `Bearer` | | `expiresIn` | integer | No | Expiration time of the token in seconds. | `3600` | ### 400 — Invalid request - Client ID or Client Secret is blank | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailToken400VO** below. | — | #### ErrorDetailToken400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [clientSecret], Client secret cannot` | | `path` | string | No | API path that generated the error | `/api/v1/auth/token` | ### 404 — OAuth2 Client not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailToken404VO** below. | — | #### ErrorDetailToken404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `OAuth2 Client with client ID admin@leegality.com does not ex` | | `path` | string | No | API path that generated the error | `/api/v1/auth/token` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_301", "message": "Authentication successful.", "data": { "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiwiaWF0IjoxNzY1NTI0NzA1LCJleHAiOjE3NjU1MjgzMDV9.v0dYZq57hlao2eHQY9l4bUxW6JnL3EUIpm21clU45F4", "tokenType": "Bearer", "expiresIn": 3600 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-audit-trail-document-s-3-presigned-url # GET /api/v1/documents/{id}/audit-trail-download-url — Get audit trail S3 presigned URL Get S3 presigned URL for downloading the audit trail PDF **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/documents/{id}/audit-trail-download-url ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/{id}/audit-trail-download-url` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/{id}/audit-trail-download-url` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Document ID | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | string | No | Response data as a string | — | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Document not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetAuditTrailDownloadUrl404VO** below. | — | #### ErrorDetailGetAuditTrailDownloadUrl404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Document does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/documents/39aca76b-e720-4da8-8a08-234c19fe013C/audit` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": "string" } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-config-1 # GET /api/v1/certificate-notification-config — Get certificate notification configuration for current organization Retrieves certificate notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/certificate-notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificate-notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificate-notification-config` --- ## Responses ### 200 — Certificate notification configuration retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `Your changes have been successfully saved.` | | `data` | CertificateNotificationConfigVO | No | See **CertificateNotificationConfigVO** below. | — | #### CertificateNotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate notification configuration unique identifier | `6d8ff341-fe21-431e-9453-bb94959474b6` | | `reminderDays` | array\ | No | Days before expiry to send reminders | `2` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anagha.babu@leegality.com` | | `enabled` | boolean | No | Indicates whether the certificate notification is enabled | `true` | | `createdAt` | string | No | The date and time when the certificate notification configuration was created | `2025-12-29T12:00:29.726603` | | `notifyRoles` | array\ | No | See **NotificationRoleVO** below. | — | ##### NotificationRoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `17d7949d-6fa9-4077-a76e-da349efe421b` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Test Role 12344` | | `createdAt` | string | No | The date and time when the role was created | `2025-11-13T14:05:34` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Configuration not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificateNotificationConfig404VO** below. | — | #### ErrorDetailGetCertificateNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Configuration not found.` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_203` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "Your changes have been successfully saved.", "data": { "id": "6d8ff341-fe21-431e-9453-bb94959474b6", "reminderDays": [ 2 ], "additionalEmailRecipients": [ "anagha.babu@leegality.com" ], "enabled": true, "createdAt": "2025-12-29T12:00:29.726603", "notifyRoles": [ { "id": "17d7949d-6fa9-4077-a76e-da349efe421b", "name": "Test Role 12344", "createdAt": "2025-11-13T14:05:34" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-config # GET /api/v1/notification-config — Get notification configuration for current organization Retrieves notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-config` --- ## Responses ### 200 — Notification configuration retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SCS_SS_200` | | `message` | string | No | Response message providing additional information | `Notification configuration retrieved successfully` | | `data` | NotificationConfigVO | No | See **NotificationConfigVO** below. | — | #### NotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification configuration unique identifier | `5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2` | | `emailServerHost` | string | No | Email server host address | `smtp.gmail.com` | | `emailServerPort` | string | No | Email server port | `587` | | `username` | string | No | Username for email server authentication | `himanshu.kumar@leegality.com` | | `password` | string | No | Password for email server authentication | `NewPassword@123` | | `fromEmail` | string | No | Email address used in the 'From' field of outgoing emails | `himanshu.kumar@leegality.com` | | `fromName` | string | No | Name used in the 'From' field of outgoing emails | `Himanshu Kumar` | | `replyTo` | string | No | Email address used in the 'Reply-To' field of outgoing emails | `himanshu.kumar@leegality.com` | | `tlsEnabled` | boolean | No | Indicates whether TLS is enabled for email communication | `true` | | `createdAt` | string | No | The date and time when the notification configuration was created | `2025-10-10T15:42:45` | | `enabled` | boolean | No | Indicates whether the notification configuration is enabled | `false` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Configuration not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetNotificationConfig404VO** below. | — | #### ErrorDetailGetNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Configuration not found.` | | `path` | string | No | API path that generated the error | `/api/v1/notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_1301` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SCS_SS_200", "message": "Notification configuration retrieved successfully", "data": { "id": "5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2", "emailServerHost": "smtp.gmail.com", "emailServerPort": "587", "username": "himanshu.kumar@leegality.com", "password": "NewPassword@123", "fromEmail": "himanshu.kumar@leegality.com", "fromName": "Himanshu Kumar", "replyTo": "himanshu.kumar@leegality.com", "tlsEnabled": true, "createdAt": "2025-10-10T15:42:45", "enabled": false } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-current-user # GET /api/v1/auth/me — Get Current User The API retrieves complete profile information for the currently authenticated user based on the JWT token in the Authorization header. Returns user details, organization, roles, permissions (authorities), and accessible departments. This endpoint is useful for validating tokens, refreshing user session data, and displaying user profile information in UI. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/auth/me ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/auth/me` - Sandbox: `https://sandbox.leegality.com/api/api/v1/auth/me` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure of the login request. | `LE_SS_301` | | `message` | string | No | A message providing additional information about the login request. | `Authentication successful.` | | `data` | LoginUserVO | No | See **LoginUserVO** below. | — | #### LoginUserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `username` | string | No | The username of the logged-in user. | `admin@leegality.com` | | `name` | string | No | The full name of the logged-in user. | `TestUser123` | | `organization` | OrganizationVO | No | See **OrganizationVO** below. | — | | `accessToken` | string | No | JWT token to use in Authorization header as `Bearer | `eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiw` | | `tokenType` | string | No | Type of the token, typically "Bearer" for JWT tokens. | `Bearer` | | `expiresIn` | integer | No | Expiration time of the token in seconds. | `3600` | | `authorities` | array\ | No | List of permissions/entitlements assigned through user's roles. | `writeCertificate,readNotificationRule,updateOAuth2Client,sea` | | `roles` | array\ | No | See **RoleVO** below. | — | | `departments` | array\ | No | See **DepartmentVO** below. | — | ##### OrganizationVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Organization unique identifier. | — | | `name` | string | No | Organization name. | `TestOrganization` | | `createdAt` | string | No | The date and time when the organization was created. | — | | `updatedAt` | string | No | The date and time when the organization was last updated. | — | | `enabled` | boolean | No | Indicates whether the organization is active or inactive. | — | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_301", "message": "Authentication successful.", "data": { "username": "admin@leegality.com", "name": "TestUser123", "organization": { "id": "string", "name": "TestOrganization", "createdAt": "string", "updatedAt": "string", "enabled": false }, "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiwiaWF0IjoxNzY1NTI0NzA1LCJleHAiOjE3NjU1MjgzMDV9.v0dYZq57hlao2eHQY9l4bUxW6JnL3EUIpm21clU45F4", "tokenType": "Bearer", "expiresIn": 3600, "authorities": [ "writeCertificate", "readNotificationRule", "updateOAuth2Client", "searchDocument", "readEntitlement", "writeCertificateNotificationConfig", "deletePasswordPolicy", "writeDepartment", "deleteSettings", "readUser", "writeRoleEntitlement", "readDocument", "admin_deleteUser", "writeNotificationConfig", "readLicense", "writeSettings", "writeOrganization", "writeRole", "writeEmail", "deleteCertificateNotificationConfig", "deleteCertificate", "readSettings", "readOAuth2Client", "deleteRoleEntitlement", "readOrganization", "readCertificateNotificationConfig", "readRole", "readRoleEntitlement", "writeUser", "readPasswordPolicy", "readCertificate", "installLicense", "deleteNotificationConfig", "deleteRole", "readDepartment", "readAuditLog", "writeNotificationRule", "readNotificationConfig", "writePasswordPolicy", "admin_writeUser", "deleteDepartment", "deleteOAuth2Client", "signDocument", "writeOAuth2Client" ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ], "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-document-summary # GET /api/v1/documents/summary — Get document signing statistics Retrieve document signing statistics for different time periods. Optionally filter by department ID. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/documents/summary?departmentId={departmentId} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/summary` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/summary` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `departmentId` | query | No | string | Department ID to filter documents by department | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | DocumentSummaryDTO | No | Document signing statistics summary See **DocumentSummaryDTO** below. | — | #### DocumentSummaryDTO Document signing statistics summary | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `summary` | array\ | No | List of document signing statistics for different time periods See **SummaryDTO** below. | — | ##### SummaryDTO List of document signing statistics for different time periods | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `count` | integer | No | Number of documents signed in the specified time period | — | | `days` | integer | No | Time period in days for the document signing statistics | — | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "summary": [ { "count": 0, "days": 0 } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-document # GET /api/v1/documents/{id} — Get document by ID Retrieve document details by its unique identifier **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/documents/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Document ID | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_301` | | `message` | string | No | Response message providing additional information | `Document signed successfully.` | | `data` | DocumentVO | No | See **DocumentVO** below. | — | #### DocumentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Document unique identifier | `5f8d0c2e-3a4b-4c6e-9f8e-2d3c4b5a6e7f` | | `name` | string | No | Name of the document | `TestDocument.pdf` | | `uploadedBy` | string | No | User ID of the person who uploaded the document | — | | `uploadedByName` | string | No | Name of the person who uploaded the document | `Test Signer` | | `department` | DepartmentVO | No | See **DepartmentVO** below. | — | | `status` | string | No | Current status of the document Allowed: `SUBMITTED`, `SIGNED`, `FAILED`. | — | | `signedAt` | string | No | The date and time when the document was signed | — | | `location` | string | No | Location where the document was signed | `Bangalore, India` | | `signerName` | string | No | Name of the signer | `Test Signer` | | `reason` | string | No | Reason for signing the document | `Testing signing via API` | | `createdAt` | string | No | The date and time when the document was created | — | | `enabled` | boolean | No | Indicates whether the document is enabled or disabled | — | | `certificate` | CertificateVO | No | See **CertificateVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### CertificateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Document not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetDocument404VO** below. | — | #### ErrorDetailGetDocument404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Document does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/documents/440d57e9-bfd6-407d-a282-cef01219a5a3` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_301", "message": "Document signed successfully.", "data": { "id": "5f8d0c2e-3a4b-4c6e-9f8e-2d3c4b5a6e7f", "name": "TestDocument.pdf", "uploadedBy": "string", "uploadedByName": "Test Signer", "department": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 }, "status": "SUBMITTED", "signedAt": "string", "location": "Bangalore, India", "signerName": "Test Signer", "reason": "Testing signing via API", "createdAt": "string", "enabled": false, "certificate": { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-entitlements # GET /api/v1/entitlements — Get entitlements for current organization Retrieves all entitlements for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/entitlements ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/entitlements` - Sandbox: `https://sandbox.leegality.com/api/api/v1/entitlements` --- ## Responses ### 200 — Entitlements retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **EntitlementVO** below. | — | #### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-expiring-soon # GET /api/v1/certificates/expiring-soon — Get certificates expiring soon Retrieves certificates that are expiring within the specified number of days for the current user's organization. Certificates are sorted by expiry date in ascending order (earliest expiring first). Only enabled certificates with expiry dates are included. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/certificates/expiring-soon?days={days}&departmentId={departmentId} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/expiring-soon` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/expiring-soon` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `days` | query | No | integer | Number of days to check for expiring certificates (defaults to 30 days) | — | | `departmentId` | query | No | string | | — | --- ## Responses ### 200 — Expiring certificates retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateVO** below. | — | #### CertificateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 400 — Invalid request parameters provided | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificatesExpiringSoon400VO** below. | — | #### ErrorDetailGetCertificatesExpiringSoon400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request parameters provided.` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/expiring-soon` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificatesExpiringSoon401VO** below. | — | #### ErrorDetailGetCertificatesExpiringSoon401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/expiring-soon` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-license-usage-stats # GET /api/v1/licenses/{licenseId}/usage-statistics — Get license usage statistics Get current usage statistics for all resources in the active license. Given a license ID, this API returns the current usage counts for various resources such as users, departments, certificates, and documents signed under that license. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/licenses/{licenseId}/usage-statistics ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/licenses/{licenseId}/usage-statistics` - Sandbox: `https://sandbox.leegality.com/api/api/v1/licenses/{licenseId}/usage-statistics` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `licenseId` | path | Yes | string | License ID for license lookup | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure of the license usage stats request. | `LE_SS_200` | | `message` | string | No | A message providing additional information about the license usage stats request. | `License usage statistics retrieved successfully.` | | `data` | LicenseUsageStatsVO | No | See **LicenseUsageStatsVO** below. | — | #### LicenseUsageStatsVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `users` | ResourceUsageUsersVO | No | See **ResourceUsageUsersVO** below. | — | | `departments` | ResourceUsageDepartmentsVO | No | See **ResourceUsageDepartmentsVO** below. | — | | `signatures` | ResourceUsageSignaturesVO | No | See **ResourceUsageSignaturesVO** below. | — | | `certificates` | ResourceCertificatesUsageVO | No | See **ResourceCertificatesUsageVO** below. | — | ##### ResourceUsageUsersVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `current` | integer | No | Current number of active users | `233` | | `limit` | integer | No | Maximum number of users allowed by license | `1000` | ##### ResourceUsageDepartmentsVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `current` | integer | No | Current number of departments using this license | `23` | | `limit` | integer | No | Maximum number of departments allowed | `1000` | ##### ResourceUsageSignaturesVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `current` | integer | No | Current number of signatures used under this license. | `23` | | `limit` | integer | No | Maximum number of signatures allowed | `1000` | ##### ResourceCertificatesUsageVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `current` | integer | No | Current number of certificates | `23` | | `limit` | integer | No | Maximum number of certificates allowed | `1000` | ### 400 — License validation failed | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailLicenseUsageStats400VO** below. | — | #### ErrorDetailLicenseUsageStats400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `License validation failed for the request.` | | `path` | string | No | API path that generated the error | `/api/v1/licenses/bd82845c-897b-4022-b5f7-679905c1979b/usage-` | | `code` | string | No | Specific error code | `LE_ERR_SS_008` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailLicenseUsageStats401VO** below. | — | #### ErrorDetailLicenseUsageStats401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/licenses/123456765RESAXCVBN54323456/usage-statistics` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 403 — Forbidden - Access denied | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_403` | | `errors` | array\ | No | List of error details See **ErrorDetailLicenseUsageStats403VO** below. | — | #### ErrorDetailLicenseUsageStats403VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Access denied for the requested operation.` | | `path` | string | No | API path that generated the error | `/api/v1/licenses/{licenseId}/usage-statistics` | | `code` | string | No | Specific error code | `LE_ERR_SS_007` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_200", "message": "License usage statistics retrieved successfully.", "data": { "users": { "current": 233, "limit": 1000 }, "departments": { "current": 23, "limit": 1000 }, "signatures": { "current": 23, "limit": 1000 }, "certificates": { "current": 23, "limit": 1000 } } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-notification-rule-types # GET /api/v1/notification-rules/types — Get all notification rule types Retrieves all available notification rule types **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/notification-rules/types ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-rules/types` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-rules/types` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_002` | | `message` | string | No | Response message providing additional information | `Requested record has been deleted.` | | `data` | array\ | No | See **NotificationRuleTypeVO** below. | `[object Object],[object Object],[object Object],[object Obje` | #### NotificationRuleTypeVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `type` | string | No | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `label` | string | No | Human-readable label for the notification rule type | `User Created` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_002", "message": "Requested record has been deleted.", "data": [ { "type": "USER_CREATED", "label": "User Created" }, { "type": "USER_DELETED", "label": "User Deleted" }, { "type": "DOCUMENT_SIGNED", "label": "Document Signed" }, { "type": "LICENSE_EXPIRY_REMINDER", "label": "License Expiry Reminders" }, { "type": "LICENSE_EXPIRED", "label": "License Expired" }, { "type": "CERTIFICATE_EXPIRED", "label": "Certificate Expired" } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-notification-rules # GET /api/v1/notification-rules — Get notification rules for current organization Retrieves all notification rules for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/notification-rules ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-rules` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-rules` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | array\ | No | See **NotificationRuleVO** below. | — | #### NotificationRuleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification rule unique identifier | `a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f` | | `ruleType` | string | No | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anaghaputhur2018@gmail.com` | | `notifyUsers` | array\ | No | See **NotificationRuleUserVO** below. | — | | `enabled` | boolean | No | Indicates whether the notification rule is enabled | `true` | | `createdAt` | string | No | The date and time when the notification rule was created | `2025-10-10T15:47:41` | ##### NotificationRuleUserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `f6b0449d-b866-4647-b5c5-9ce765eb1184` | | `name` | string | No | Full name of the user | `Anagha Babu` | | `email` | string | No | Email address of the user | `anagha.babu@leegality.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `false` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": [ { "id": "a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f", "ruleType": "USER_CREATED", "additionalEmailRecipients": [ "anaghaputhur2018@gmail.com" ], "notifyUsers": [ { "id": "f6b0449d-b866-4647-b5c5-9ce765eb1184", "name": "Anagha Babu", "email": "anagha.babu@leegality.com", "active": true, "enabled": false } ], "enabled": true, "createdAt": "2025-10-10T15:47:41" } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-o-auth-2-clients # GET /api/v1/oauth2-clients — Get OAuth2 clients for current organization Retrieves all OAuth2 clients for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/oauth2-clients ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/oauth2-clients` - Sandbox: `https://sandbox.leegality.com/api/api/v1/oauth2-clients` --- ## Responses ### 200 — OAuth2 clients retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **OAuth2ClientVO** below. | `[object Object],[object Object],[object Object]` | #### OAuth2ClientVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | OAuth2 client unique identifier | `8c18cc0b-6251-490e-82ac-dfde6f4735c1` | | `clientId` | string | No | OAuth2 client identifier | `HS1cVm1fLDctBGvAyiu76MIr9PfIqSAl0t2dKHkwWknost8nFh6J5HOiM3SD` | | `clientSecret` | string | No | OAuth2 client secret | `SR2KJGnlodwZWBUNBubPRNYSqCW_TUTD4A8Vhf1t2aM` | | `state` | string | No | OAuth2 client state Allowed: `ACTIVE`, `SUSPENDED`. | `ACTIVE` | | `createdAt` | string | No | The date and time when the OAuth2 client was created | `2025-12-29T15:43:17.528673` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "a3a0e830-66b6-4845-bf1a-91e0966fb97b", "clientId": "FinanceTest", "state": "ACTIVE", "createdAt": "2025-12-22T16:26:03" }, { "id": "e5abdc39-25be-4dc4-abf7-3f500fb3769d", "clientId": "MockDemoForWebsite", "state": "ACTIVE", "createdAt": "2025-12-11T11:02:34" }, { "id": "fb3533ef-f802-411d-a94c-84148daf1fde", "clientId": "TestingProdCredentials", "state": "ACTIVE", "createdAt": "2025-12-09T11:28:46" } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-password-policy # GET /api/v1/password-policy — Get password policy for current organization Retrieves password policy for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/password-policy ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/password-policy` - Sandbox: `https://sandbox.leegality.com/api/api/v1/password-policy` --- ## Responses ### 200 — Password policy retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | PasswordPolicyVO | No | See **PasswordPolicyVO** below. | — | #### PasswordPolicyVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Password policy unique identifier | `9ef35b27-86c8-4450-8807-317c37a61aae` | | `minimumPasswordLength` | integer | No | Minimum length required for passwords | `6` | | `numbersRequired` | boolean | No | Indicates if numbers are required in passwords | `false` | | `specialCharactersRequired` | boolean | No | Indicates if special characters are required in passwords | `false` | | `uppercaseRequired` | boolean | No | Indicates if uppercase letters are required in passwords | `true` | | `createdAt` | string | No | The date and time when the password policy was created | `2025-10-10T15:58:34` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Password policy not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetPasswordPolicy404VO** below. | — | #### ErrorDetailGetPasswordPolicy404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Password policy not found.` | | `path` | string | No | API path that generated the error | `/api/v1/password-policy` | | `code` | string | No | Specific error code | `LE_ERR_SS_203` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": { "id": "9ef35b27-86c8-4450-8807-317c37a61aae", "minimumPasswordLength": 6, "numbersRequired": false, "specialCharactersRequired": false, "uppercaseRequired": true, "createdAt": "2025-10-10T15:58:34" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-role-by-id # GET /api/v1/roles/{id} — Get role by ID Retrieves role by ID with entitlements for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/roles/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/roles/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/roles/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Role ID to retrieve information for. | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | RoleVO | No | See **RoleVO** below. | — | #### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ##### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-roles # GET /api/v1/roles — Get roles for current organization Retrieves all roles for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/roles ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/roles` - Sandbox: `https://sandbox.leegality.com/api/api/v1/roles` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **RoleVO** below. | — | #### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ##### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailGetRoles401VO** below. | — | #### ErrorDetailGetRoles401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/roles` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ] } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-settings # GET /api/v1/settings — Get settings for current organization Retrieves settings for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/settings ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/settings` - Sandbox: `https://sandbox.leegality.com/api/api/v1/settings` --- ## Responses ### 200 — Settings retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | SettingsVO | No | See **SettingsVO** below. | — | #### SettingsVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Settings ID. This is configured during the settings creation. | `ed99d2dd-f44e-4278-a3e2-13a1ed2be13c` | | `documentRetentionEnabled` | boolean | No | Indicates if document retention is enabled | `true` | | `documentRetentionPeriod` | integer | No | Document retention period in days | `30` | | `auditLogsRetentionEnabled` | boolean | No | Indicates if audit logs retention is enabled | `true` | | `auditLogsRetentionPeriod` | integer | No | Audit logs retention period in days | `90` | | `auditTrailGenerationEnabled` | boolean | No | Indicates if audit trail generation is enabled | `true` | | `createdAt` | string | No | The date and time when the settings were created | `2025-12-08T15:28:26` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Settings not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetSettings404VO** below. | — | #### ErrorDetailGetSettings404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Settings not found for organization 57270dc1-681d-4cd9-9268-` | | `path` | string | No | API path that generated the error | `/api/v1/settings` | | `code` | string | No | Specific error code | `LE_ERR_SS_203` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": { "id": "ed99d2dd-f44e-4278-a3e2-13a1ed2be13c", "documentRetentionEnabled": true, "documentRetentionPeriod": 30, "auditLogsRetentionEnabled": true, "auditLogsRetentionPeriod": 90, "auditTrailGenerationEnabled": true, "createdAt": "2025-12-08T15:28:26" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-signed-document-s-3-presigned-url # GET /api/v1/documents/{id}/document-download-url — Get signed document S3 presigned URL Get S3 presigned URL for downloading the signed document PDF **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/documents/{id}/document-download-url ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/{id}/document-download-url` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/{id}/document-download-url` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Document ID to retrieve download URL for. | — | --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | string | No | Response data as a string | — | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Document not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetDocumentDownloadUrl404VO** below. | — | #### ErrorDetailGetDocumentDownloadUrl404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Document does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/documents/39aca76b-e720-4da8-8a08-234c19fe013c/docum` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": "string" } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-summary # GET /api/v1/certificates/summary — Get certificate summary Retrieves certificate summary statistics for the current user's organization including total certificates, active certificates (not expired and enabled), and certificates expiring within the specified number of days (defaults to 30 days) **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/certificates/summary?days={days}&departmentId={departmentId} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/summary` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/summary` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `days` | query | No | integer | Number of days to check for expiring certificates (defaults to 30 days) | — | | `departmentId` | query | No | string | | — | --- ## Responses ### 200 — Certificate summary retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | CertificateSummaryVO | No | See **CertificateSummaryVO** below. | — | #### CertificateSummaryVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `totalCertificates` | integer | No | Total number of certificates in the system | — | | `totalActiveCertificates` | integer | No | Total number of active (enabled) certificates | — | | `totalExpiringSoonCertificates` | integer | No | Total number of certificates that are expiring soon | — | ### 400 — Invalid UUID provided | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificateSummary400VO** below. | — | #### ErrorDetailGetCertificateSummary400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid UUID provided.` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/summary` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailGetCertificateSummary401VO** below. | — | #### ErrorDetailGetCertificateSummary401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/summary` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "totalCertificates": 0, "totalActiveCertificates": 0, "totalExpiringSoonCertificates": 0 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/get-user-by-id # GET /api/v1/users/{id} — Get user by ID Retrieves a specific user by ID **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` GET https://app1.leegality.com/api/api/v1/users/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | ID of the user to retrieve | — | --- ## Responses ### 200 — User retrieved successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `User retrieved successfully.` | | `data` | UserVO | No | See **UserVO** below. | — | #### UserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Full name of the user | `John Doe` | | `email` | string | No | Email address of the user | `user@example.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `true` | | `createdAt` | string | No | The date and time when the user was created | `2025-12-15T10:20:30Z` | | `departments` | array\ | No | See **DepartmentVO** below. | — | | `roles` | array\ | No | See **RoleVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — User not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailGetUserById404VO** below. | — | #### ErrorDetailGetUserById404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `f6b0449d-b866-4647-b5c5-9ce765eb1183 does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/users/f6b0449d-b866-4647-b5c5-9ce765eb1183` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "User retrieved successfully.", "data": { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "John Doe", "email": "user@example.com", "active": true, "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/install-license # POST /api/v1/licenses — Upload and install a license Use this API to Upload a license file and install it into the SignStation system. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/licenses ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/licenses` - Sandbox: `https://sandbox.leegality.com/api/api/v1/licenses` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `file` | string | Yes | License upload data with file. The license file must contain JWT (JSON Web Token) formatted data. You can use any file extension you prefer including .jwt, .lic, or .txt. | `TestLicense.lic` | ### Sample Request ```json { "file": "TestLicense.lic" } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure of the license upload. | — | | `message` | string | No | A message providing additional information about the license upload. | — | | `data` | LicenseVO | No | See **LicenseVO** below. | — | #### LicenseVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `licenseId` | string | No | Unique identifier for the license. | — | | `customerId` | string | No | Unique identifier for the customer associated with the license. | — | | `expiry` | string | No | Expiration date of the license in ISO 8601 format. | — | | `status` | string | No | Current status of the license (e.g., ACTIVE, EXPIRED). | — | | `licenseType` | string | No | Type of the license (e.g., ACTIVE, TRIAL) | — | | `createdAt` | string | No | The date and time when the license was created. | — | | `updatedAt` | string | No | The date and time when the license was last updated. | — | | `enabled` | boolean | No | Indicates whether the license is currently enabled or disabled. | — | ### 400 — License validation failed | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailLicense400VO** below. | — | #### ErrorDetailLicense400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `License validation failed for the request.` | | `path` | string | No | API path that generated the error | `/api/v1/licenses` | | `code` | string | No | Specific error code | `LE_ERR_SS_008` | ### 401 — Authentication failed | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailLicense401VO** below. | — | #### ErrorDetailLicense401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Authentication failed. Please check your credentials.` | | `path` | string | No | API path that generated the error | `/api/v1/licenses` | | `code` | string | No | Specific error code | `LE_ERR_SS_301` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "licenseId": "string", "customerId": "string", "expiry": "2024-01-01", "status": "string", "licenseType": "string", "createdAt": "string", "updatedAt": "string", "enabled": false } } ``` --- # License Management URL: https://knowledge.leegality.com/sign-station/api/license-management.tag > License Management The License Management API allows administrators to install license files, view current status, and track usage statistics through a set of dedicated endpoints. To activate your system, you must upload a license file containing a cryptographically signed JSON Web Token (JWT). While the file must contain this specific string, you can use any file extension you prefer—such as .lic, .txt, or .jwt—as the system reads the internal data rather than the filename. For the dashboard walkthrough, see [Create a New License](https://knowledge.leegality.com/sign-station/license-manager/create-license) and [Viewing & Managing License Status](https://knowledge.leegality.com/sign-station/license-manager/viewing-managing-license-status). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/login # POST /api/v1/auth/login — User Login This API Authenticates a user using username (email) and password credentials. Upon successful authentication, returns a JWT access token along with complete user profile including roles, permissions (authorities), departments, and organization information. The token must be included in subsequent API requests as a Bearer token in the Authorization header. No additional permissions are required to access this endpoint. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/auth/login ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/auth/login` - Sandbox: `https://sandbox.leegality.com/api/api/v1/auth/login` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `username` | string | Yes | The username of the user trying to log in. | `admin@leegality.com` | | `password` | string | Yes | The password of the user trying to log in. | `Strong@Passw0rd` | ### Sample Request ```json { "username": "admin@leegality.com", "password": "Strong@Passw0rd" } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure of the login request. | `LE_SS_301` | | `message` | string | No | A message providing additional information about the login request. | `Authentication successful.` | | `data` | LoginUserVO | No | See **LoginUserVO** below. | — | #### LoginUserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `username` | string | No | The username of the logged-in user. | `admin@leegality.com` | | `name` | string | No | The full name of the logged-in user. | `TestUser123` | | `organization` | OrganizationVO | No | See **OrganizationVO** below. | — | | `accessToken` | string | No | JWT token to use in Authorization header as `Bearer | `eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiw` | | `tokenType` | string | No | Type of the token, typically "Bearer" for JWT tokens. | `Bearer` | | `expiresIn` | integer | No | Expiration time of the token in seconds. | `3600` | | `authorities` | array\ | No | List of permissions/entitlements assigned through user's roles. | `writeCertificate,readNotificationRule,updateOAuth2Client,sea` | | `roles` | array\ | No | See **RoleVO** below. | — | | `departments` | array\ | No | See **DepartmentVO** below. | — | ##### OrganizationVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Organization unique identifier. | — | | `name` | string | No | Organization name. | `TestOrganization` | | `createdAt` | string | No | The date and time when the organization was created. | — | | `updatedAt` | string | No | The date and time when the organization was last updated. | — | | `enabled` | boolean | No | Indicates whether the organization is active or inactive. | — | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 401 — Authentication failed - Invalid username or password | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailLogin401VO** below. | — | #### ErrorDetailLogin401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Authentication failed. Invalid username or password.` | | `path` | string | No | API path that generated the error | `/api/v1/auth/login` | | `code` | string | No | Specific error code | `LE_ERR_SS_301` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_301", "message": "Authentication successful.", "data": { "username": "admin@leegality.com", "name": "TestUser123", "organization": { "id": "string", "name": "TestOrganization", "createdAt": "string", "updatedAt": "string", "enabled": false }, "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBsZWVnYWxpdHkuY29tIiwiaWF0IjoxNzY1NTI0NzA1LCJleHAiOjE3NjU1MjgzMDV9.v0dYZq57hlao2eHQY9l4bUxW6JnL3EUIpm21clU45F4", "tokenType": "Bearer", "expiresIn": 3600, "authorities": [ "writeCertificate", "readNotificationRule", "updateOAuth2Client", "searchDocument", "readEntitlement", "writeCertificateNotificationConfig", "deletePasswordPolicy", "writeDepartment", "deleteSettings", "readUser", "writeRoleEntitlement", "readDocument", "admin_deleteUser", "writeNotificationConfig", "readLicense", "writeSettings", "writeOrganization", "writeRole", "writeEmail", "deleteCertificateNotificationConfig", "deleteCertificate", "readSettings", "readOAuth2Client", "deleteRoleEntitlement", "readOrganization", "readCertificateNotificationConfig", "readRole", "readRoleEntitlement", "writeUser", "readPasswordPolicy", "readCertificate", "installLicense", "deleteNotificationConfig", "deleteRole", "readDepartment", "readAuditLog", "writeNotificationRule", "readNotificationConfig", "writePasswordPolicy", "admin_writeUser", "deleteDepartment", "deleteOAuth2Client", "signDocument", "writeOAuth2Client" ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ], "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ] } } ``` --- # Notification Config Controller URL: https://knowledge.leegality.com/sign-station/api/notification-config-controller.tag > Notification Config Controller The Notification Configuration API provides endpoints for managing notification settings within the Sign Station platform. This configuration allows organizations to define global notification preferences, such as email server settings, default sender information, and other notification-related parameters. For the dashboard workflow, see [Notifications](https://knowledge.leegality.com/sign-station/notifications). ```mdx-code-block ``` --- # Notification Rule Controller URL: https://knowledge.leegality.com/sign-station/api/notification-rule-controller.tag > Notification Rule Controller The Notification Rules API provides endpoints to configure and manage notification rules for various system events within the Sign Station platform. These rules determine which events trigger email notifications, who receives them, and whether the notifications are enabled for your organization. For the dashboard workflow, see [Notifications](https://knowledge.leegality.com/sign-station/notifications). ```mdx-code-block ``` --- # OAuth2 Client Controller URL: https://knowledge.leegality.com/sign-station/api/o-auth-2-client-controller.tag > OAuth2 Client Controller The OAuth2 Client Management API provides endpoints for managing OAuth2 clients within the SignStation platform. OAuth2 clients are applications or services that can authenticate and interact with the SignStation API on behalf of users or organizations. This API allows administrators to create, retrieve, update, and delete OAuth2 clients, as well as manage their credentials and permissions. To create and manage client credentials from the dashboard, see [API Credentials](https://knowledge.leegality.com/sign-station/api-credentials). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/partial-update # PATCH /api/v1/users/me — Update current user Updates the authenticated user **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PATCH https://app1.leegality.com/api/api/v1/users/me ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/me` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/me` --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | No | Full name of the user | — | ### Sample Request ```json { "name": "string" } ``` --- ## Responses ### 200 — User updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `User retrieved successfully.` | | `data` | UserVO | No | See **UserVO** below. | — | #### UserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Full name of the user | `John Doe` | | `email` | string | No | Email address of the user | `user@example.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `true` | | `createdAt` | string | No | The date and time when the user was created | `2025-12-15T10:20:30Z` | | `departments` | array\ | No | See **DepartmentVO** below. | — | | `roles` | array\ | No | See **RoleVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailPartialUpdate400VO** below. | — | #### ErrorDetailPartialUpdate400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [name], Name must be between 2 and 1` | | `path` | string | No | API path that generated the error | `/api/v1/users/me` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "User retrieved successfully.", "data": { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "John Doe", "email": "user@example.com", "active": true, "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ] } } ``` --- # Password Policy Controller URL: https://knowledge.leegality.com/sign-station/api/password-policy-controller.tag > Password Policy Controller The Password Policy API enables organizations to configure and enforce password strength requirements for their users. Administrators can define rules such as minimum password length, requirements for numbers, special characters, and uppercase letters. Each organization has one password policy that applies to all users within that organization. The API provides endpoints to create, retrieve, and update password policy configurations. Password policies are automatically enforced during user creation and password change operations. For the dashboard configuration, see [System Settings](https://knowledge.leegality.com/sign-station/system-settings). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/reset-password # PUT /api/v1/users/{id}/reset-password — Reset password for user Resets the password for the specified user. The password must comply with the organization's password policy. Returns the reset password. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/users/{id}/reset-password ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/{id}/reset-password` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/{id}/reset-password` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | ID of the user whose password is to be reset | — | --- ## Request Body **Content-Type:** `application/json` Password data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `password` | string | Yes | The new password to set for the user | — | ### Sample Request ```json { "password": "string" } ``` --- ## Responses ### 200 — Password reset successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_702` | | `message` | string | No | Response message | `Password changed successfully.` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailResetPassword400VO** below. | — | #### ErrorDetailResetPassword400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [password], Password cannot be blank` | | `path` | string | No | API path that generated the error | `/api/v1/users/f6b0449d-b866-4647-b5c5-9ce765eb1184/reset-pas` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 403 — Access denied | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_403` | | `errors` | array\ | No | List of error details See **ErrorDetailResetPassword403VO** below. | — | #### ErrorDetailResetPassword403VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Access denied for the requested operation.` | | `path` | string | No | API path that generated the error | `/api/v1/users/{id}/reset-password` | | `code` | string | No | Specific error code | `LE_ERR_SS_007` | ### 404 — User not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailResetPassword404VO** below. | — | #### ErrorDetailResetPassword404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `f6b0449d-b866-4647-b5c5-9ce765eb1183 does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/users/f6b0449d-b866-4647-b5c5-9ce765eb1183` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_702", "message": "Password changed successfully." } ``` --- # Role Controller URL: https://knowledge.leegality.com/sign-station/api/role-controller.tag > Role Controller The Role Management API enables administrators to create, manage, and configure user roles within the SignStation platform. Roles serve as containers for entitlements (permissions) and can be assigned to users to grant specific access rights across the system. This API supports Role-Based Access Control (RBAC) implementation, allowing organizations to define granular permission structures. For the dashboard walkthrough, see [Role Management](https://knowledge.leegality.com/sign-station/user-management/role-management). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-audit-logs # POST /api/v1/audit-logs/search — Search audit logs Search audit logs for the current user's organization using advanced search criteria **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/audit-logs/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/audit-logs/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/audit-logs/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — Audit logs found successfully Search response for audit logs with pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **AuditLogSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### AuditLogSearchItemVO Audit log item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Audit log unique identifier | `00fdf214-83fe-4070-ba93-32c03c6dfd24` | | `details` | string | No | Detailed description of the audit log event | `Department Testing Department added successfully by TestUser` | | `action` | string | No | Type of action performed | `DEPARTMENT_ADDED` | | `userId` | string | No | User ID who performed the action | `e6823fbf-7af8-4e73-8bdb-429a11671871` | | `username` | string | No | Username of the user who performed the action | `TestUser123` | | `sourceIp` | string | No | Source IP address from where the action was performed | `10.10.4.227` | | `userAgent` | string | No | User agent string of the client | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/` | | `logTime` | string | No | Time when the log was created | `2025-12-09T11:26:19` | | `enabled` | boolean | No | Whether the audit log is enabled | `true` | | `createdAt` | string | No | Audit log creation date and time | `2025-12-09T11:26:19` | | `updatedAt` | string | No | Audit log last update date and time | `2025-12-09T11:26:19` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchAuditLogs400VO** below. | — | #### ErrorDetailSearchAuditLogs400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [filters], must not be null` | | `path` | string | No | API path that generated the error | `/api/v1/audit-logs/search` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "00fdf214-83fe-4070-ba93-32c03c6dfd24", "details": "Department Testing Department added successfully by TestUser123.", "action": "DEPARTMENT_ADDED", "userId": "e6823fbf-7af8-4e73-8bdb-429a11671871", "username": "TestUser123", "sourceIp": "10.10.4.227", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", "logTime": "2025-12-09T11:26:19", "enabled": true, "createdAt": "2025-12-09T11:26:19", "updatedAt": "2025-12-09T11:26:19" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-certificates # POST /api/v1/certificates/search — Search certificates Search certificates for the current user's organization using advanced search criteria **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/certificates/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — Certificates found successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchCertificates400VO** below. | — | #### ErrorDetailSearchCertificates400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [filter.filters], [field, filters]` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/search` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchCertificates401VO** below. | — | #### ErrorDetailSearchCertificates401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/search` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "*.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "2026-09-12T12:53:04", "createdAt": "2025-10-14T20:38:06", "departmentId": "a2906183-8b02-4aa3-9d27-e5ba3efef203", "departmentName": "HR" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-departments # POST /api/v1/departments/search — Search departments Search departments for the current user's organization using the API. Advanced search criteria can be specified in the request body. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/departments/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/departments/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/departments/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — Departments found successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "*.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "2026-09-12T12:53:04", "createdAt": "2025-10-14T20:38:06", "departmentId": "a2906183-8b02-4aa3-9d27-e5ba3efef203", "departmentName": "HR" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-documents # POST /api/v1/documents/search — Search documents Search documents for the current user's organization using advanced search criteria **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/documents/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — Documents found successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error ### Sample Response (200) ```json { "data": [ { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "*.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "2026-09-12T12:53:04", "createdAt": "2025-10-14T20:38:06", "departmentId": "a2906183-8b02-4aa3-9d27-e5ba3efef203", "departmentName": "HR" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-licenses # POST /api/v1/licenses/search — Search licenses Search licenses for the current user's organization using advanced search criteria **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/licenses/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/licenses/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/licenses/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchLicenses400VO** below. | — | #### ErrorDetailSearchLicenses400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [filter.filters], [field, filters]` | | `path` | string | No | API path that generated the error | `/api/v1/licenses/search` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchLicenses401VO** below. | — | #### ErrorDetailSearchLicenses401VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/licenses/search` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "*.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "2026-09-12T12:53:04", "createdAt": "2025-10-14T20:38:06", "departmentId": "a2906183-8b02-4aa3-9d27-e5ba3efef203", "departmentName": "HR" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/search-users # POST /api/v1/users/search — Search users Search users for the current user's organization using advanced search criteria **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/users/search ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/search` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/search` --- ## Request Body **Content-Type:** `application/json` Search criteria including filters, sorting, and pagination | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `filter` | Filter Request Schema | No | Filter Request Schema represents the group of parameters which filters the records. See **Filter Request Schema** below. | — | | `sort` | array\ | No | Sort Request Schema list represents the group of parameters which sorts the records. See **Sort Request Schema** below. | — | | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | #### Filter Request Schema Filter Request Schema represents the group of parameters which filters the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | No | Field represents the field on which operator would be applied. | `Audit Trail (2).pdf` | | `operator` | string | Yes | Operator represents the condition which would be applied for searching. Allowed: `EQ`, `NEQ`, `IN`, `NOT_IN`, `IS_NULL`, `NOT_NULL`, `AND`, `OR`, `GT`, `LT`, `GTE`, `LTE`, `BETWEEN`, `LIKE`. | — | | `value` | array\ | No | Value represents the value of the field which would be searched within the records. | — | | `filters` | array\ | No | List of filters represents filters to be applied if the operator used is AND or OR | — | #### Sort Request Schema Sort Request Schema list represents the group of parameters which sorts the records. | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `field` | string | Yes | Field represents the field on which sorting would be applied. | `createdAt` | | `direction` | string | No | Direction represents the order in which sorting would be applied. Allowed: `ASC`, `DESC`. | — | ### Sample Request ```json { "filter": { "field": "Audit Trail (2).pdf", "operator": "EQ", "value": [ {} ], "filters": [ "value" ] }, "sort": [ { "field": "createdAt", "direction": "ASC" } ], "limit": 10, "page": 0 } ``` --- ## Responses ### 200 — Users found successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `data` | array\ | No | See **CertificateSearchItemVO** below. | — | | `pagination` | Pagination Response Schema | No | See **Pagination Response Schema** below. | — | #### CertificateSearchItemVO Certificate item in search results | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Certificate name | `*.leegality.com` | | `certificateType` | string | No | Type of certificate | `PKCS12_PFX` | | `expiry` | string | No | Certificate expiry date and time | `2026-09-12T12:53:04` | | `createdAt` | string | No | Certificate creation date and time | `2025-10-14T20:38:06` | | `departmentId` | string | No | Department unique identifier | `a2906183-8b02-4aa3-9d27-e5ba3efef203` | | `departmentName` | string | No | Department name | `HR` | #### Pagination Response Schema | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `limit` | integer | No | Limit represents the maximum number of records to be displayed per page. | `10` | | `page` | integer | No | Page represents the current page index to display records starting from 0. | `0` | | `total` | integer | No | Total represents the total number of records fetched. | `50` | ### 400 — Invalid search criteria | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailSearchUsers400VO** below. | — | #### ErrorDetailSearchUsers400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [filter.filters], [field, filters]` | | `path` | string | No | API path that generated the error | `/api/v1/users/search` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "data": [ { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "*.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "2026-09-12T12:53:04", "createdAt": "2025-10-14T20:38:06", "departmentId": "a2906183-8b02-4aa3-9d27-e5ba3efef203", "departmentName": "HR" } ], "pagination": { "limit": 10, "page": 0, "total": 50 } } ``` --- # Settings Controller URL: https://knowledge.leegality.com/sign-station/api/settings-controller.tag > Settings Controller The Settings Management API provides endpoints for managing organization-level settings in the SignStation platform. Settings control various aspects of the system including document retention, audit log retention, and audit trail generation. Each organization has one settings configuration. Use this API to create, retrieve, update, and manage settings for the authenticated user's organization. For the dashboard equivalent, see [System Settings](https://knowledge.leegality.com/sign-station/system-settings). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/sign-station/api/sign # POST /api/v1/documents/sign — Sign a new document Sign a new document with metadata including name, department, and file **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` POST https://app1.leegality.com/api/api/v1/documents/sign ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/documents/sign` - Sandbox: `https://sandbox.leegality.com/api/api/v1/documents/sign` --- ## Request Body **Content-Type:** `application/json` Document sign data with file upload | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Name of the document to be signed | `TestDocument.pdf` | | `file` | string | Yes | Document file to be signed | `null` | | `departmentId` | string | Yes | Department ID for the document | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `certificateId` | string | Yes | Certificate ID to be used for signing the document | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `signatureCoordinates` | array\ | No | See **SignatureCoordinateDTO** below. | — | | `signerName` | string | No | Name of the signer to be displayed on the document | `Test Signer` | | `location` | string | No | Location to be displayed on the document | `Bangalore, India` | | `reason` | string | No | Reason for signing to be displayed on the document | `Testing signing via API` | #### SignatureCoordinateDTO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `xcoordinate` | number | Yes | X coordinate for the signature placement on the page | `10` | | `ycoordinate` | number | Yes | Y coordinate for the signature placement on the page | `20` | | `pageNumber` | integer | Yes | Page number where the signature should be placed | `1` | | `width` | number | No | Width of the signature image | `200` | | `height` | number | No | Height of the signature image | `100` | ### Sample Request ```json { "name": "TestDocument.pdf", "file": null, "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "certificateId": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "signatureCoordinates": [ { "xcoordinate": 10, "ycoordinate": 20, "pageNumber": 1, "width": 200, "height": 100 } ], "signerName": "Test Signer", "location": "Bangalore, India", "reason": "Testing signing via API" } ``` --- ## Responses ### 200 — OK | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_301` | | `message` | string | No | Response message providing additional information | `Document signed successfully.` | | `data` | DocumentVO | No | See **DocumentVO** below. | — | #### DocumentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Document unique identifier | `5f8d0c2e-3a4b-4c6e-9f8e-2d3c4b5a6e7f` | | `name` | string | No | Name of the document | `TestDocument.pdf` | | `uploadedBy` | string | No | User ID of the person who uploaded the document | — | | `uploadedByName` | string | No | Name of the person who uploaded the document | `Test Signer` | | `department` | DepartmentVO | No | See **DepartmentVO** below. | — | | `status` | string | No | Current status of the document Allowed: `SUBMITTED`, `SIGNED`, `FAILED`. | — | | `signedAt` | string | No | The date and time when the document was signed | — | | `location` | string | No | Location where the document was signed | `Bangalore, India` | | `signerName` | string | No | Name of the signer | `Test Signer` | | `reason` | string | No | Reason for signing the document | `Testing signing via API` | | `createdAt` | string | No | The date and time when the document was created | — | | `enabled` | boolean | No | Indicates whether the document is enabled or disabled | — | | `certificate` | CertificateVO | No | See **CertificateVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### CertificateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_301", "message": "Document signed successfully.", "data": { "id": "5f8d0c2e-3a4b-4c6e-9f8e-2d3c4b5a6e7f", "name": "TestDocument.pdf", "uploadedBy": "string", "uploadedByName": "Test Signer", "department": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 }, "status": "SUBMITTED", "signedAt": "string", "location": "Bangalore, India", "signerName": "Test Signer", "reason": "Testing signing via API", "createdAt": "string", "enabled": false, "certificate": { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/toggle-o-auth-2-client-state # PATCH /api/v1/oauth2-clients/{id}/toggle-state — Toggle OAuth2 client state Toggles OAuth2 client state between ACTIVE and SUSPENDED for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PATCH https://app1.leegality.com/api/api/v1/oauth2-clients/{id}/toggle-state ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/oauth2-clients/{id}/toggle-state` - Sandbox: `https://sandbox.leegality.com/api/api/v1/oauth2-clients/{id}/toggle-state` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | OAuth2 client ID of which you want to toggle the state. | — | --- ## Responses ### 200 — OAuth2 client state toggled successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_004` | | `message` | string | No | Response message | `OAuth2 client updated successfully.` | | `data` | OAuth2ClientToggleStateVO | No | See **OAuth2ClientToggleStateVO** below. | — | #### OAuth2ClientToggleStateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | OAuth2 client unique identifier | `a3a0e830-66b6-4845-bf1a-91e0966fb97b` | | `clientId` | string | No | OAuth2 client identifier | `FinanceTest` | | `state` | string | No | OAuth2 client state Allowed: `ACTIVE`, `SUSPENDED`. | `SUSPENDED` | | `createdAt` | string | No | The date and time when the OAuth2 client was created | `2025-12-22T16:26:03` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — OAuth2 client not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailOAuth2Client404VO** below. | — | #### ErrorDetailOAuth2Client404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `OAuth2 Client with id a3a0e830-66b6-4845-bf1a-91e0966fb97a d` | | `path` | string | No | API path that generated the error | `/api/v1/oauth2-clients/a3a0e830-66b6-4845-bf1a-91e0966fb97a/` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_004", "message": "OAuth2 client updated successfully.", "data": { "id": "a3a0e830-66b6-4845-bf1a-91e0966fb97b", "clientId": "FinanceTest", "state": "SUSPENDED", "createdAt": "2025-12-22T16:26:03" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-1 # PUT /api/v1/certificates/{id} — Update certificate Updates an existing certificate for the current user's organization. Certificate file upload is optional - if not provided, the existing certificate file will be retained. Supported format: .p12/.pfx (PKCS12) only (max size: 5MB) **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/certificates/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificates/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificates/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Certificate ID | — | --- ## Request Body **Content-Type:** `application/json` Certificate data including name, passkey, type, expiry, departmentId, enabled flag, and certificate file | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `passkey` | string | No | Passkey for the certificate file | `mySecretPasskey` | | `certificateFile` | string | No | Certificate file to be uploaded | `TestCertificate.leegality.com` | | `departmentId` | string | No | Associated department ID | — | | `enabled` | boolean | No | Indicates whether the certificate is enabled or disabled | — | ### Sample Request ```json { "passkey": "mySecretPasskey", "certificateFile": "TestCertificate.leegality.com", "departmentId": "string", "enabled": false } ``` --- ## Responses ### 200 — Certificate updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `null` | | `message` | string | No | Response message | `null` | | `data` | CertificateVO | No | See **CertificateVO** below. | — | #### CertificateVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate unique identifier | `46d4e120-ed03-47cc-98c6-529bff3bbabc` | | `name` | string | No | Certificate name | `TestCertificate.leegality.com` | | `certificateType` | string | No | Type of the certificate Allowed: `PKCS12_PFX`, `PKCS12_HSM`, `PKCS11`. | — | | `expiry` | string | No | Certificate expiry date | — | | `createdAt` | string | No | The date and time when the certificate was created | — | | `departmentId` | string | No | Associated department ID | `18b45e41-5d8b-4417-bb83-1d769187aef9` | | `departmentName` | string | No | Associated department name | `HR` | ### 400 — Invalid request data or unsupported file format | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetail400VO** below. | — | #### ErrorDetail400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request parameter: days must be a positive integer.` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Certificate not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailVO** below. | — | #### ErrorDetailVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Certificate with id 46d4e120-ed03-47cc-98c6-529bff3bbaba doe` | | `path` | string | No | API path that generated the error | `/api/v1/certificates/46d4e120-ed03-47cc-98c6-529bff3bbaba` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": null, "message": null, "data": { "id": "46d4e120-ed03-47cc-98c6-529bff3bbabc", "name": "TestCertificate.leegality.com", "certificateType": "PKCS12_PFX", "expiry": "string", "createdAt": "string", "departmentId": "18b45e41-5d8b-4417-bb83-1d769187aef9", "departmentName": "HR" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-config-1 # PUT /api/v1/certificate-notification-config — Update certificate notification configuration Updates certificate notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/certificate-notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/certificate-notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/certificate-notification-config` --- ## Request Body **Content-Type:** `application/json` Certificate notification configuration data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `reminderDays` | array\ | No | Days before expiry to send reminders | `2` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anagha.babu@leegality.com` | | `notifyRoleIds` | array\ | No | Role IDs to be notified | `17d7949d-6fa9-4077-a76e-da349efe421b` | | `enabled` | boolean | No | Indicates whether the certificate notification is enabled | `true` | ### Sample Request ```json { "reminderDays": [ 2 ], "additionalEmailRecipients": [ "anagha.babu@leegality.com" ], "notifyRoleIds": [ "17d7949d-6fa9-4077-a76e-da349efe421b" ], "enabled": true } ``` --- ## Responses ### 200 — Certificate notification configuration updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `Your changes have been successfully saved.` | | `data` | CertificateNotificationConfigVO | No | See **CertificateNotificationConfigVO** below. | — | #### CertificateNotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Certificate notification configuration unique identifier | `6d8ff341-fe21-431e-9453-bb94959474b6` | | `reminderDays` | array\ | No | Days before expiry to send reminders | `2` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anagha.babu@leegality.com` | | `enabled` | boolean | No | Indicates whether the certificate notification is enabled | `true` | | `createdAt` | string | No | The date and time when the certificate notification configuration was created | `2025-12-29T12:00:29.726603` | | `notifyRoles` | array\ | No | See **NotificationRoleVO** below. | — | ##### NotificationRoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `17d7949d-6fa9-4077-a76e-da349efe421b` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Test Role 12344` | | `createdAt` | string | No | The date and time when the role was created | `2025-11-13T14:05:34` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateCertificateNotificationConfig400VO** below. | — | #### ErrorDetailUpdateCertificateNotificationConfig400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [additionalEmailRecipients], Invalid` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Role not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateCertificateNotificationConfig404VO** below. | — | #### ErrorDetailUpdateCertificateNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Role does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/certificate-notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "Your changes have been successfully saved.", "data": { "id": "6d8ff341-fe21-431e-9453-bb94959474b6", "reminderDays": [ 2 ], "additionalEmailRecipients": [ "anagha.babu@leegality.com" ], "enabled": true, "createdAt": "2025-12-29T12:00:29.726603", "notifyRoles": [ { "id": "17d7949d-6fa9-4077-a76e-da349efe421b", "name": "Test Role 12344", "createdAt": "2025-11-13T14:05:34" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-config # PUT /api/v1/notification-config — Update notification configuration Updates notification configuration for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/notification-config ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-config` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-config` --- ## Request Body **Content-Type:** `application/json` Notification configuration data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `emailServerHost` | string | Yes | Email server host address | `smtp.example.com` | | `emailServerPort` | string | No | Email server port | `587` | | `username` | string | No | Username for email server authentication | `anagha.babu@leegality.com` | | `password` | string | No | Password for email server authentication | `NewPassword@123` | | `fromEmail` | string | No | Email address used in the 'From' field of outgoing emails | `testuser@leegality.com` | | `fromName` | string | No | Name used in the 'From' field of outgoing emails | `Leegality Test User` | | `replyTo` | string | No | Email address used in the 'Reply-To' field of outgoing emails | `testuser@leegality.com` | | `tlsEnabled` | boolean | No | Indicates whether TLS is enabled for email communication | `true` | | `enabled` | boolean | No | Indicates whether the notification configuration is enabled | — | ### Sample Request ```json { "emailServerHost": "smtp.example.com", "emailServerPort": "587", "username": "anagha.babu@leegality.com", "password": "NewPassword@123", "fromEmail": "testuser@leegality.com", "fromName": "Leegality Test User", "replyTo": "testuser@leegality.com", "tlsEnabled": true, "enabled": false } ``` --- ## Responses ### 200 — Notification configuration updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SCS_SS_200` | | `message` | string | No | Response message providing additional information | `Notification configuration updated successfully` | | `data` | NotificationConfigVO | No | See **NotificationConfigVO** below. | — | #### NotificationConfigVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification configuration unique identifier | `5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2` | | `emailServerHost` | string | No | Email server host address | `smtp.gmail.com` | | `emailServerPort` | string | No | Email server port | `587` | | `username` | string | No | Username for email server authentication | `himanshu.kumar@leegality.com` | | `password` | string | No | Password for email server authentication | `NewPassword@123` | | `fromEmail` | string | No | Email address used in the 'From' field of outgoing emails | `himanshu.kumar@leegality.com` | | `fromName` | string | No | Name used in the 'From' field of outgoing emails | `Himanshu Kumar` | | `replyTo` | string | No | Email address used in the 'Reply-To' field of outgoing emails | `himanshu.kumar@leegality.com` | | `tlsEnabled` | boolean | No | Indicates whether TLS is enabled for email communication | `true` | | `createdAt` | string | No | The date and time when the notification configuration was created | `2025-10-10T15:42:45` | | `enabled` | boolean | No | Indicates whether the notification configuration is enabled | `false` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateNotificationConfig400VO** below. | — | #### ErrorDetailUpdateNotificationConfig400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [replyTo], Reply to must be a valid ` | | `path` | string | No | API path that generated the error | `/api/v1/notification-config` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Configuration not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateNotificationConfig404VO** below. | — | #### ErrorDetailUpdateNotificationConfig404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Configuration not found.` | | `path` | string | No | API path that generated the error | `/api/v1/notification-config` | | `code` | string | No | Specific error code | `LE_ERR_SS_1301` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SCS_SS_200", "message": "Notification configuration updated successfully", "data": { "id": "5e191ba4-3fe5-4dd4-ba7c-f2e9632c08c2", "emailServerHost": "smtp.gmail.com", "emailServerPort": "587", "username": "himanshu.kumar@leegality.com", "password": "NewPassword@123", "fromEmail": "himanshu.kumar@leegality.com", "fromName": "Himanshu Kumar", "replyTo": "himanshu.kumar@leegality.com", "tlsEnabled": true, "createdAt": "2025-10-10T15:42:45", "enabled": false } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-notification-rule # PUT /api/v1/notification-rules/{id} — Update notification rule Updates notification rule by ID for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/notification-rules/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/notification-rules/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/notification-rules/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Notification rule ID to be updated. | — | --- ## Request Body **Content-Type:** `application/json` Notification rule data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `ruleType` | string | Yes | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anaghaputhur2018@gmail.com` | | `userIds` | array\ | No | User IDs to be notified | `0e663652-1198-4777-8139-3efeda8e1d77` | | `enabled` | boolean | No | Indicates whether the notification rule is enabled | `true` | ### Sample Request ```json { "ruleType": "USER_CREATED", "additionalEmailRecipients": [ "anaghaputhur2018@gmail.com" ], "userIds": [ "0e663652-1198-4777-8139-3efeda8e1d77" ], "enabled": true } ``` --- ## Responses ### 200 — Notification rule updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_004` | | `message` | string | No | Response message providing additional information | `Notification rule updated successfully.` | | `data` | NotificationRuleVO | No | See **NotificationRuleVO** below. | — | #### NotificationRuleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Notification rule unique identifier | `a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f` | | `ruleType` | string | No | Type of notification rule Allowed: `USER_CREATED`, `USER_DELETED`, `DOCUMENT_SIGNED`, `LICENSE_EXPIRY_REMINDER`, `LICENSE_EXPIRED`, `CERTIFICATE_EXPIRED`. | `USER_CREATED` | | `additionalEmailRecipients` | array\ | No | Additional email recipients for notifications | `anaghaputhur2018@gmail.com` | | `notifyUsers` | array\ | No | See **NotificationRuleUserVO** below. | — | | `enabled` | boolean | No | Indicates whether the notification rule is enabled | `true` | | `createdAt` | string | No | The date and time when the notification rule was created | `2025-10-10T15:47:41` | ##### NotificationRuleUserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `f6b0449d-b866-4647-b5c5-9ce765eb1184` | | `name` | string | No | Full name of the user | `Anagha Babu` | | `email` | string | No | Email address of the user | `anagha.babu@leegality.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `false` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailNotificationRuleUpdate400VO** below. | — | #### ErrorDetailNotificationRuleUpdate400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request payload.` | | `path` | string | No | API path that generated the error | `/api/v1/notification-rules/a2787f6c-e00c-4bd9-ad34-ed88b8fcf` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_004", "message": "Notification rule updated successfully.", "data": { "id": "a2787f6c-e00c-4bd9-ad34-ed88b8fcf54f", "ruleType": "USER_CREATED", "additionalEmailRecipients": [ "anaghaputhur2018@gmail.com" ], "notifyUsers": [ { "id": "f6b0449d-b866-4647-b5c5-9ce765eb1184", "name": "Anagha Babu", "email": "anagha.babu@leegality.com", "active": true, "enabled": false } ], "enabled": true, "createdAt": "2025-10-10T15:47:41" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-password-policy # PUT /api/v1/password-policy — Update password policy Updates password policy for the current user's organization. You can update the policy as many times as needed. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/password-policy ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/password-policy` - Sandbox: `https://sandbox.leegality.com/api/api/v1/password-policy` --- ## Request Body **Content-Type:** `application/json` Password policy data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `minimumPasswordLength` | integer | Yes | Minimum length required for passwords | `8` | | `numbersRequired` | boolean | Yes | Indicates if numbers are required in passwords | `true` | | `specialCharactersRequired` | boolean | Yes | Indicates if special characters are required in passwords | `true` | | `uppercaseRequired` | boolean | Yes | Indicates if uppercase letters are required in passwords | `true` | ### Sample Request ```json { "minimumPasswordLength": 8, "numbersRequired": true, "specialCharactersRequired": true, "uppercaseRequired": true } ``` --- ## Responses ### 200 — Password policy updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SCS_SS_200` | | `message` | string | No | Response message providing additional information | `Password policy updated successfully` | | `data` | PasswordPolicyVO | No | See **PasswordPolicyVO** below. | — | #### PasswordPolicyVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Password policy unique identifier | `9ef35b27-86c8-4450-8807-317c37a61aae` | | `minimumPasswordLength` | integer | No | Minimum length required for passwords | `6` | | `numbersRequired` | boolean | No | Indicates if numbers are required in passwords | `false` | | `specialCharactersRequired` | boolean | No | Indicates if special characters are required in passwords | `false` | | `uppercaseRequired` | boolean | No | Indicates if uppercase letters are required in passwords | `true` | | `createdAt` | string | No | The date and time when the password policy was created | `2025-10-10T15:58:34` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailPasswordPolicyUpdate400VO** below. | — | #### ErrorDetailPasswordPolicyUpdate400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request payload.` | | `path` | string | No | API path that generated the error | `/api/v1/password-policy` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SCS_SS_200", "message": "Password policy updated successfully", "data": { "id": "9ef35b27-86c8-4450-8807-317c37a61aae", "minimumPasswordLength": 6, "numbersRequired": false, "specialCharactersRequired": false, "uppercaseRequired": true, "createdAt": "2025-10-10T15:58:34" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-role # PUT /api/v1/roles/{id} — Update role Updates role by ID for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/roles/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/roles/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/roles/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Role ID to be updated | — | --- ## Request Body **Content-Type:** `application/json` Role data to create | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Role name. E.g., "Admin", "User" etc. | — | | `entitlementIds` | array\ | No | Entitlement IDs to assign to the role | — | ### Sample Request ```json { "name": "string", "entitlementIds": [ "string" ] } ``` --- ## Responses ### 200 — Role updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | — | | `message` | string | No | Response message providing additional information | — | | `data` | RoleVO | No | See **RoleVO** below. | — | #### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ##### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 400 — Invalid request payload | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateRole400VO** below. | — | #### ErrorDetailUpdateRole400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request payload.` | | `path` | string | No | API path that generated the error | `/api/v1/roles/51f93ec7-c06a-4fe1-a8b1-eaf7a1c0fb5e` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Role or Entitlement not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateRole404VO** below. | — | #### ErrorDetailUpdateRole404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Entitlement with id null does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/roles/51f93ec7-c06a-4fe1-a8b1-eaf7a1c0fb5e` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-settings # PUT /api/v1/settings — Update settings Updates settings for the current user's organization **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/settings ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/settings` - Sandbox: `https://sandbox.leegality.com/api/api/v1/settings` --- ## Request Body **Content-Type:** `application/json` Settings data to update | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `documentRetentionEnabled` | boolean | No | Indicates if document retention is enabled | `true` | | `documentRetentionPeriod` | integer | No | Document retention period in days | `100` | | `auditLogsRetentionEnabled` | boolean | No | Indicates if audit logs retention is enabled | `true` | | `auditLogsRetentionPeriod` | integer | No | Audit logs retention period in days | `100` | | `auditTrailGenerationEnabled` | boolean | No | Indicates if audit trail generation is enabled | `true` | ### Sample Request ```json { "documentRetentionEnabled": true, "documentRetentionPeriod": 100, "auditLogsRetentionEnabled": true, "auditLogsRetentionPeriod": 100, "auditTrailGenerationEnabled": true } ``` --- ## Responses ### 200 — Settings updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response code indicating success or failure | `LE_SS_004` | | `message` | string | No | Response message providing additional information | `Settings updated successfully.` | | `data` | SettingsVO | No | See **SettingsVO** below. | — | #### SettingsVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Settings ID. This is configured during the settings creation. | `ed99d2dd-f44e-4278-a3e2-13a1ed2be13c` | | `documentRetentionEnabled` | boolean | No | Indicates if document retention is enabled | `true` | | `documentRetentionPeriod` | integer | No | Document retention period in days | `30` | | `auditLogsRetentionEnabled` | boolean | No | Indicates if audit logs retention is enabled | `true` | | `auditLogsRetentionPeriod` | integer | No | Audit logs retention period in days | `90` | | `auditTrailGenerationEnabled` | boolean | No | Indicates if audit trail generation is enabled | `true` | | `createdAt` | string | No | The date and time when the settings were created | `2025-12-08T15:28:26` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailSettings400VO** below. | — | #### ErrorDetailSettings400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid request payload.` | | `path` | string | No | API path that generated the error | `/api/v1/settings` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Settings not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateSettings404VO** below. | — | #### ErrorDetailUpdateSettings404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Settings not found for organization 57270dc1-681d-4cd9-9268-` | | `path` | string | No | API path that generated the error | `/api/v1/settings` | | `code` | string | No | Specific error code | `LE_ERR_SS_203` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_004", "message": "Settings updated successfully.", "data": { "id": "ed99d2dd-f44e-4278-a3e2-13a1ed2be13c", "documentRetentionEnabled": true, "documentRetentionPeriod": 30, "auditLogsRetentionEnabled": true, "auditLogsRetentionPeriod": 90, "auditTrailGenerationEnabled": true, "createdAt": "2025-12-08T15:28:26" } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update-user # PATCH /api/v1/users/{id} — Update user Updates an existing user by ID. Prevents removing admin role from the last admin user. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PATCH https://app1.leegality.com/api/api/v1/users/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/users/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/users/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | ID of the user to be updated. | — | --- ## Request Body **Content-Type:** `application/json` Updated user data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | Full name of the user | — | | `email` | string | Yes | Email address of the user | — | | `password` | string | No | Password for the user account | — | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | — | | `departmentIds` | array\ | No | List of department IDs the user belongs to | — | | `roleIds` | array\ | Yes | List of role IDs assigned to the user | — | ### Sample Request ```json { "name": "string", "email": "string", "password": "string", "active": false, "departmentIds": [ "string" ], "roleIds": [ "string" ] } ``` --- ## Responses ### 200 — User updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | `LE_SS_001` | | `message` | string | No | Response message | `User retrieved successfully.` | | `data` | UserVO | No | See **UserVO** below. | — | #### UserVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | User unique identifier | `37d14717-5c1a-44fe-9b8f-6d5184b09f06` | | `name` | string | No | Full name of the user | `John Doe` | | `email` | string | No | Email address of the user | `user@example.com` | | `active` | boolean | No | Indicates whether the user is active (enabled) or inactive (disabled) | `true` | | `enabled` | boolean | No | Indicates whether the user is enabled or disabled | `true` | | `createdAt` | string | No | The date and time when the user was created | `2025-12-15T10:20:30Z` | | `departments` | array\ | No | See **DepartmentVO** below. | — | | `roles` | array\ | No | See **RoleVO** below. | — | ##### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ##### RoleVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Role ID. This is configured during the role creation. | `b0af5f43-7f34-4ea4-867a-10115642f354` | | `name` | string | No | Role name. E.g., "Admin", "User" etc. | `Admin` | | `createdAt` | string | No | The date and time when the role was created | `2025-12-15T10:20:30Z` | | `entitlements` | array\ | No | See **EntitlementVO** below. | — | ###### EntitlementVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Entitlement ID. This is configured in the system and cannot be changed. | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | Entitlement name. E.g., "DOCUMENT_SIGN","USER_MANAGEMENT" | `DOCUMENT_SIGN` | ### 400 — Invalid request data or attempting to remove admin role from the last admin user | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateUser400VO** below. | — | #### ErrorDetailUpdateUser400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [email], Email must be valid` | | `path` | string | No | API path that generated the error | `/api/v1/users/{id}` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — User not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateUser404VO** below. | — | #### ErrorDetailUpdateUser404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Role does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/users/f6b0449d-b866-4647-b5c5-9ce765eb1184` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 409 — Email already exists | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_409` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateUser409VO** below. | — | #### ErrorDetailUpdateUser409VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `User with email 'existing@example.com' already exists.` | | `path` | string | No | API path that generated the error | `/api/v1/users/{id}` | | `code` | string | No | Specific error code | `LE_ERR_SS_701` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "LE_SS_001", "message": "User retrieved successfully.", "data": { "id": "37d14717-5c1a-44fe-9b8f-6d5184b09f06", "name": "John Doe", "email": "user@example.com", "active": true, "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "departments": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } ], "roles": [ { "id": "b0af5f43-7f34-4ea4-867a-10115642f354", "name": "Admin", "createdAt": "2025-12-15T10:20:30Z", "entitlements": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "DOCUMENT_SIGN" } ] } ] } } ``` --- URL: https://knowledge.leegality.com/sign-station/api/update # PUT /api/v1/departments/{id} — Update department Updates an existing department for the current user's organization. The request body requires all department properties, even if only updating one. **Authentication:** `X-Auth-Token` header required on every request. ## Request URL ``` PUT https://app1.leegality.com/api/api/v1/departments/{id} ``` **Environments:** - Production: `https://app1.leegality.com/api/api/v1/departments/{id}` - Sandbox: `https://sandbox.leegality.com/api/api/v1/departments/{id}` --- ## Parameters | Name | In | Required | Type | Description | Example | |------|----|----------|------|-------------|---------| | `id` | path | Yes | string | Department ID to be updated | — | --- ## Request Body **Content-Type:** `application/json` | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `name` | string | Yes | The updated department name (e.g., "Human Resources"). Must be between 2 and 255 characters. | — | | `enabled` | boolean | No | Shows the updated status of the department. For an active department, the value is set to true; for an inactive department, it is set to false. | — | ### Sample Request ```json { "name": "string", "enabled": false } ``` --- ## Responses ### 200 — Department updated successfully | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Response status code | — | | `message` | string | No | Response message | — | | `data` | DepartmentVO | No | See **DepartmentVO** below. | — | #### DepartmentVO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `id` | string | No | Department unique identifier | `3fa85f64-5717-4562-b3fc-2c963f66afa6` | | `name` | string | No | The department's name (e.g., "Human Resources"). | `Human Resources` | | `enabled` | boolean | No | Indicates whether the department is active or inactive. | `true` | | `createdAt` | string | No | The date and time when the department was created. | `2025-12-15T10:20:30Z` | | `totalUsers` | integer | No | Total number of users in the department. | `25` | ### 400 — Invalid request data | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_400` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateDepartment400VO** below. | — | #### ErrorDetailUpdateDepartment400VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid value for field [name], Department name must be betw` | | `path` | string | No | API path that generated the error | `/api/v1/departments/{id}` | | `code` | string | No | Specific error code | `null` | ### 401 — Unauthorized - Invalid or expired token | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_401` | | `errors` | array\ | No | List of error details See **ErrorDetail401Unauthorized** below. | — | #### ErrorDetail401Unauthorized | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Invalid or expired token` | | `path` | string | No | API path that generated the error | `/api/v1/*` | | `code` | string | No | Specific error code | `LE_ERR_SS_303` | ### 404 — Department not found | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_404` | | `errors` | array\ | No | List of error details See **ErrorDetailUpdateDepartment404VO** below. | — | #### ErrorDetailUpdateDepartment404VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Department does not exist.` | | `path` | string | No | API path that generated the error | `/api/v1/departments/acd77746-6eb2-4ad3-9356-e9f12f7ef502` | | `code` | string | No | Specific error code | `LE_ERR_SS_001` | ### 500 — Internal server error | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `code` | string | No | Top-level error code | `LE_ERR_SS_500` | | `errors` | array\ | No | List of error details See **ErrorDetailToken500VO** below. | — | #### ErrorDetailToken500VO | Field | Type | Required | Description | Example | |-------|------|----------|-------------|---------| | `message` | string | No | Detailed error message | `Internal Server Error` | | `path` | string | No | API path that generated the error | `null` | | `code` | string | No | Specific error code | `null` | ### Sample Response (200) ```json { "code": "string", "message": "string", "data": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Human Resources", "enabled": true, "createdAt": "2025-12-15T10:20:30Z", "totalUsers": 25 } } ``` --- # User Management URL: https://knowledge.leegality.com/sign-station/api/user-management.tag > User Management The User Management API provides endpoints for managing users within an organization. Users are individuals who can log in to the SignStation platform and perform various actions based on their assigned roles and permissions. All user operations are scoped to the authenticated user's organization. Use this API to create, retrieve, update, and delete users as needed. For the dashboard workflow, see [User Management](https://knowledge.leegality.com/sign-station/user-management). ```mdx-code-block ``` --- URL: https://knowledge.leegality.com/ai-readable # A Guide for LLMs and AI This knowledge base is built on a JavaScript framework — fetching a page URL returns an empty HTML shell, not readable content. To make it fully accessible to AI tools and crawlers, every page is also published as a plain `.txt` file containing clean markdown. Base URL: `https://knowledge.leegality.com` ### Available Resources | Resource | Full URL | Notes | |----------|----------|-------| | **Page index** | [`https://knowledge.leegality.com/llms.txt`](https://knowledge.leegality.com/llms.txt) | Index of all pages. Each line: `[Title](url.txt): description`. Start here. | | **Full content** | [`https://knowledge.leegality.com/llms-full.txt`](https://knowledge.leegality.com/llms-full.txt) | All pages concatenated. Fetch once to load the entire knowledge base into context. | | **Per-page content** | `https://knowledge.leegality.com/.txt` | Append `.txt` to any page URL. Example: [`/document-execution/api/create-an-e-signing-request.txt`](https://knowledge.leegality.com/document-execution/api/create-an-e-signing-request.txt) | | **OpenAPI spec** | [`https://knowledge.leegality.com/openapi.json`](https://knowledge.leegality.com/openapi.json) | OpenAPI 3.0 spec for the full REST API. | --- ### How AI should read this knowledge base 1. Fetch `https://knowledge.leegality.com/llms.txt` — this gives you a structured index of every page with titles, `.txt` links, and descriptions. 2. From the index, fetch individual `.txt` URLs for the pages you need. Each `.txt` file is the full page content as plain markdown, served as `text/plain`. 3. For API integration, fetch `https://knowledge.leegality.com/openapi.json` for the complete OpenAPI 3.0 spec. 4. To load everything at once, fetch `https://knowledge.leegality.com/llms-full.txt` instead of steps 1–2. > **Why `.txt` and not `.md`?** Both exist, but `.md` files are served as binary downloads (`application/octet-stream`) — browsers and AI tools can't read them inline. `.txt` files are served as `text/plain` and are readable directly. --- ### How to use it **With Claude, ChatGPT, or any LLM:** Paste a `.txt` URL directly into your conversation. Example: ``` https://knowledge.leegality.com/document-execution/api/create-an-e-signing-request.txt ``` **With Cursor:** Use `@Docs` → add `https://knowledge.leegality.com/llms.txt`. Cursor will index all pages and make them available as context. **With any HTTP client:** ```bash # Get the full knowledge base in one request curl https://knowledge.leegality.com/llms-full.txt # Get a specific page curl https://knowledge.leegality.com/document-execution/getting-started/create-an-account.txt ``` --- ### On every page Each doc page has a **Copy page** button in the top-right corner. It copies that page's markdown directly to your clipboard — ready to paste into any AI tool. The dropdown also has **View markdown** (opens the `.txt` in browser) and **Download markdown** (saves the `.md` file locally). --- URL: https://knowledge.leegality.com # Introduction to Document Execution

Everything your business needs to digitize document execution process, all under one roof.

## Explore Leegality [Getting Started Start using Leegality for eSigning](https://knowledge.leegality.com/category/getting-started) [Templates Create reusable Templates for frequent document journeys](https://knowledge.leegality.com/document-execution/template) [Stamps Affix digital stamps to documents](https://knowledge.leegality.com/document-execution/stamps) [Account Configure account level setting](https://knowledge.leegality.com/category/settings) [Manage Documents Efficiently manage documents you have sent and received](https://knowledge.leegality.com/document-execution/manage-documents/overview) [Workflows Create Workflows to automate the sending journey process](https://knowledge.leegality.com/document-execution/workflows/overview) --- URL: https://knowledge.leegality.com/document-execution/customisation/custom-sender-email # Custom Sender Email By default, invitee emails come from a generic Leegality address such as **`noreply@leegality.com`**. With **Custom Sender Email**, you can replace this with a branded address — either a custom prefix on the Leegality domain or your own domain entirely — so your organisation appears as the sender. The display name shown in recipients' inboxes is your **brand name**. > **Info — Available on request** > > Custom Sender Email is configured by Leegality support. See [How to enable](#how-to-enable) below. ## Types of Custom Sender Email #### Custom prefix on @leegality.com Replace the default `noreply` prefix with one of your own while keeping the Leegality domain. For example, **`noreply@leegality.com`** can be changed to **`xyzcompany@leegality.com`**. Any prefix can be used. #### Your own domain Send emails from your own domain instead of **`@leegality.com`**. This allows organisations to maintain trust by sending emails from their verified email domains. For example, **`loans@xyzbank.com`**. This option requires some DNS configuration on your end. ## How to enable Email [support@leegality.com](mailto:support@leegality.com) with the following details: - Email address to be configured, for example **`loans@xyzbank.com`** - Org ID where the domain should be configured - Environment (Production and/or UAT) ## See also - [Custom Subdomain](https://knowledge.leegality.com/document-execution/customisation/custom-subdomain) - [Branding](https://knowledge.leegality.com/document-execution/settings/Department/branding) --- URL: https://knowledge.leegality.com/document-execution/customisation/custom-subdomain # Custom Subdomain By default, users access the Leegality Document Execution dashboard at **`dashboard.leegality.com`**. With **Custom Subdomain**, you can replace this with a branded subdomain such as **`xyzbank.leegality.com`**, where `xyzbank` is the subdomain you want to use — giving your end users a consistent, branded login experience. > **Info — Available on request — Production only** > > Custom Subdomain is configured by Leegality support and is available only for production accounts. ## How to enable Email [support@leegality.com](mailto:support@leegality.com) with the following details: - Subdomain to be configured, for example **`xyzbank.leegality.com`** - Org ID where the subdomain should be configured ## See also - [Custom Sender Email](https://knowledge.leegality.com/document-execution/customisation/custom-sender-email) - [Branding](https://knowledge.leegality.com/document-execution/settings/Department/branding) --- URL: https://knowledge.leegality.com/document-execution/esign-type/aadhaar/signature-certificate-verifier # Signature Certificate Verifier The Signature Certificate Verifier feature allows the sender (Leegality Customer) to configure certain details of the intended signer and compares the details filled in by the sender and the details received in the Digital Signature Certificate after signing. - In case, the details provided by the sender match the details received in the certificate - the signature is successful. - In case, the details provided by the sender do not match the details received in the certificate - Leegality rejects the signature. A Digital Signature Certificate has the below-mentioned details which get verified if the verifier is turned on while sending the document. - Verify invitee name - Enable smart name verification - Invitee pin code - Invitee year of birth - Invitee last 4 Aadhaar digits - Invitee state - State - Invitee gender > **Info — Note** > > Leegality’s action towards a verification failure by default is to reject the signature although, you can choose to accept a signature even after a verification failure ## Set up Certificate Verifier in the new document flow 1. Once on the Invite page after creating the document. 2. Select the signature type Aadhar/DSC/Cloud DSC/Nesl Esign and click on the "gear" icon 3. Enter the values for the verification parameter which needs to be verified from the signer’s certificate while signing the document. > **Info — Note** > > None of the parameters are mandatory for the certificate verifier to work i.e. you can configure any number of parameters out of the available options for verification During the signing of the document, if the certificate details do not match with the Digital signature certificate, the signer will get the below error message. > **Info — Note** > > - If the signing of the document is failed due to the verification details not matching the Digital signature certificate, the Esigns credit will be debited from the account. > - If the stamps are affixed, it will be moved to reserve and will be consumed if the signer has signed the documents, else will be credited back to the account. ## Set up Certificate Verifier in the Workflow 1. While creating the workflow, select the type of sign as Aadhaar/ DSC Token/ Cloud DSC/ Nesl Sign and click on the "gear" icon 2. In the resulting side menu, enable “Verify details with Certificate Details” Enable the verification parameter(s) that need to be verified - These parameters will be configurable while running the workflow You can also mark parameters as mandatory - These parameters will have to be mandatorily configured while running the workflow. > **Info — Note** > > These parameters will have to be mandatorily configured in Esign setting. ## Running the workflow with Verification parameters enabled Once the workflow is configured with the required verification parameters enabled. 1. Run the required workflow and upload the document that has to be signed. 2. Enter the invitee(s) email address and Name then click on the "gear" icon for the signature type selected while configuring the workflow. Once the invitee details are filled, enter the values of verification parameters for each invitee that will be matched with their Digital signature Certificate used while signing. If the signature has failed due to the verification parameter does not match with the Digital signature certificate, the details can be viewed in “Failed” under “My Desk” ## Troubleshooting Certificate Mismatch When the signer's Aadhaar certificate does not match the details configured by the sender, Leegality rejects the signature. This is most often caused by a name mismatch (e.g., initials vs. full name, nickname vs. legal name) or an incorrect year of birth, PIN code, or last 4 Aadhaar digits. To resolve, ask the signer for their Aadhaar-registered details exactly as they appear on the card. You can also edit the invitee details on the document details page to match, and re-send the invitation. > **Tip** > > Enable **smart name verification** to allow minor name variations (e.g., expanded initials) without triggering a mismatch. --- # _delete-on-complete URL: https://knowledge.leegality.com/document-execution/leegality-features/document-level/_delete-on-complete --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications # Invitee Notifications Leegality sends notifications to invitees at key stages of the document signing journey via [Email](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/email-notifications), [SMS](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/sms-notifications), and [WhatsApp](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/notifications/whatspp-notifications) — based on what is configured for each invitee. ## Optional Notifications These notifications are sent only if the respective channel (Email, SMS, or WhatsApp) is enabled for the invitee: - Sign or review invitation notification - Expiry notification - Re-activation notification - Deletion notifications - Reminder notifications before expiry - Sign or review completion notification ### Reminder Notifications Reminder notifications are sent automatically **3, 2, and 1 day(s) before** the document signing link expires. They are delivered via whichever channels (Email, SMS, WhatsApp) are enabled for the invitee. ## Mandatory Notifications These notifications are always sent to invitees, regardless of whether Email or SMS notifications are enabled or disabled in the invitee-level settings: - **Document completion notification** — Sent to all invitees after everyone has signed the document. Includes the completed document and audit trail PDF. - **eSign confirmation** — Sent immediately after an invitee signs the document, confirming their eSignature. - **OTP for signature** — Delivered during signing via Virtual Sign or Aadhaar eSign, for identity verification before applying the signature. - **Security verification OTP** — Sent when the signer undergoes 1-Factor or 2-Factor Authentication as part of the signing process. --- URL: https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/security/send-raw-document-link # Send document download link with all OTP email and messages Enabling this security feature, a link to the raw pdf document will be sent in all the OTP verification email’s/messages. --- URL: https://knowledge.leegality.com/document-execution/manage-documents/document-details/_reactivate-document # Re-activate Expired Documents A sender needs to re-activate a document when one or more invitees fail to sign the document before it expires. Once a document has expired, the unsigned invitees cannot access and complete the signing process unless the sender re-activates the document. By re-activating the document, the sender extends the deadline, allowing invitees another opportunity to sign it. ## When Does a Document Expire? A document expires when the set time limit for its invitees to sign has passed. Once expired, the document becomes inaccessible for signing, and invitees are unable to view or interact with it. Expiry timelines can vary based on the sender's configuration, such as 45 minutes, end of day, or up to a specified number of days (e.g., 1–365 days). After this time, the document is considered expired until re-activated by the sender. Learn more about [**default document expiry configuration**](https://knowledge.leegality.com/settings/account-level/document-setting/Invitation-expiry-for-sent-documents-account-defaults). ### Exception cases | Scenario | Condition | Outcome | Location | | :---- | :---- | :---- | :---- | | **Scenario 1: Partial Signing** | The first invitee signs, but the second fails to sign within the set time frame. | Document/invitation expires but does not appear in the Expired folder. It shows in the *Waiting for Others* and *Failed* sections. | *Waiting for Others* and *Failed* sections. | | **Scenario 2: Rejection by Invitee** | The first invitee rejects signing, preventing activation for subsequent signers. | Document expires after the set time limit but appears in the *Waiting for Others* and *Failed* sections, not the Expired folder. | *Waiting for Others* and *Failed* sections. | > **Warning** > > **Expired Document:** Unsigned invitees will receive an error message when trying to access expired documents. > **Tip** > > Monitor the Expiring Soon section for documents set to expire in the next 5 days or less. Note that documents with a 45-minute expiry do not appear here. ## How to Access Expired Documents Expired documents are found in the **Expired** section and include those that expired: - 45 minutes after being sent - at the end of the day (EOD) after being sent - 1-365 days after being sent > **Info — Note** > > Documents in the expired folder for 30 days will be automatically deleted. ## Reactivate an Expired Document Re-activating a document allows you to extend the expiration time and re-enable signing for the invitees. The steps for reactivation are: 1. Go to the **Documents** section in the top navigation bar. 2. Select **Expired** from the left-side panel. 3. Find the expired document you want to reactivate (use the filter or search options if necessary). 4. Open the document details and click on the **Re-Activate** button. 5. In the **Extend Document Expiry** modal, choose how long you want to extend the document’s expiration: * Extend by 45 minutes * Extend until 11:59 PM today * Extend by 1-365 days 6. Click **Confirm**. Once reactivated, the invitee will receive a re-invitation to eSign the document. --- URL: https://knowledge.leegality.com/document-execution/nesl/Overview # NeSL Integration via Leegality Leegality is an official **TSP (Technology Service Provider)** partner of **NeSL (National E-Governance Services Ltd.)**, enabling clients to use NeSL’s eSign and DDE (Digital Document Execution) services **without directly integrating with NeSL**. This overview explains the benefits of onboarding NeSL through Leegality, how Leegality handles NeSL configuration, and how to get started. ## What Is NeSL? **NeSL** is India’s first **Information Utility (IU)** under the **Insolvency and Bankruptcy Code, 2016 (IBC)**. It serves two key roles: * **NeSL as an IU**: Maintains verified records of debt transactions, which can be used as legal evidence during insolvency resolution proceedings. * **NeSL as a DDE Platform**: Allows digital execution of loan and debt documents. Note: Even when DDE is used, **IU submission is still required** (though fees may be waived for some cases). ## Why Use NeSL via Leegality? #### **Single API Integration** Leegality consolidates **all 6 NeSL APIs** (e.g., return API, transaction status API) into **one API**. This means clients only need to integrate once—with Leegality—and can go live in as little as **2 days**. #### **No-Code Flow Available** No developer integration needed: Use the **Dashboard + Excel upload** route to kickstart NeSL DDE immediately. #### **Nationwide Stamp Coverage** With NeSL integration and Leegality’s **BharatStamp**, your documents can be executed with e-stamp paper across **all Indian states**, even where NeSL stamping is not directly supported. #### **Enhanced Security & Flexibility** Get more than just NeSL eSign. Leegality lets you layer advanced features like: * Face capture * GPS location capture * Reviewers * Multiple eSign types #### **Unified Dashboard** Perform any of the NeSL flow from a single dashboard. * Lending (individual or non-individual) * Non-lending * eBG (electronic Bank Guarantee) --- URL: https://knowledge.leegality.com/document-execution/nesl/details-page # NeSL Document - Details Page The **Details Page** in Leegality provides essential tools to track and manage a document after it has been sent. When a document includes **NeSL invitees**, certain details and actions behave differently to comply with NeSL's strict signing flow. This guide covers the **information displayed** on the Details Page for NeSL documents, followed by the **actions** that are allowed, restricted, or modified. ## Document Overview The top section of the Details Page shows high-level information about the document: * **Document ID:** Unique identifier for the document * **NeSL Transaction ID:** The transaction ID assigned by NeSL * **Status:** Overall document status — e.g., Under Progress, Completed ## Invitee Details Below the document overview, all invitees are listed with individual cards. Each invitee card displays: * **Name** of the invitee * **Contact** — Email and/or phone number * **NeSL Tag** — Indicates that the invitee has a NeSL eSign type Clicking the **Details** button on an invitee card reveals additional information: | Field | Description | | --- | --- | | **Invitation Date** | Date the signing invitation was sent | | **Sign Date** | Date the invitee completed signing | | **Status** | Current status of the invitee's invitation | | **Signed Using** | The eSign method used — e.g., NeSL eSign | | **Sign Subtype** | The authentication subtype — OTP, Biometric, Face, eToken, or Iris | > **Info — Note** > > **Sign Subtype:** NeSL shares this information only for clients explicitly enabled by them — it is not available for all transactions. The subtype will be shown only when available in NeSL's Transaction Data API. ## Invitee-Specific Actions * **Resend Leegality Invitation:** Clicking **Resend Notification** re-sends **only the Leegality invitation** to the invitee. * **View Reference Attachments:** Check any **reference attachments** uploaded by the sender at the time of document setup. * **View Notification Logs:** A detailed record of all notifications sent to invitees. ## Document-Wide Actions * **Copy Document URL:** Copies the document’s URL for easy sharing or quick access. * **Delete Document:** Deleting a document in Leegality **does not cancel** the NeSL signing invitation. However: * If an invitee attempts to sign using the **Leegality link**, they will be **blocked**. * Invitees with an active Leegality invitation will receive a **revocation notification**. * **View NeSL Form:** Use this option to **review the NeSL form details** submitted during document creation. Helpful when validating signer information or troubleshooting errors. ## Retry to Resolve NeSL Errors If the document encounters a NeSL-related error, a **Retry** option will appear. Clicking **Retry** attempts to **resubmit the failed request** to NeSL. > **Warning — 50-call combined limit per document** > > The **Refresh** and **Retry** actions on the Details Page and the `refreshNeslDocument=true` parameter on the **[Check Document Details API](https://knowledge.leegality.com/document-execution/api/check-document-details)** share a combined limit of **50 calls per document**. > > Once the limit is reached on a document, further Refresh/Retry attempts (dashboard) and `refreshNeslDocument=true` calls (API) on that document will be blocked. ### Supported Error Codes * ER404 * ER403 * ER500 * ER414 * ER502 * ER503 * ER504 * ER500API * ER00P9 * ER00FI ## Blocked Actions for NeSL Documents ### Manual Activation of Invitations You cannot manually activate invitations until all NeSL invitees have signed. This ensures that no other eSigns are completed before NeSL eSigns, which is a strict requirement from NeSL. Once **all NeSL invitees have signed** , you can manually activate **remaining non-NeSL invitations**. ### Marking Document as Complete You **cannot mark a document as complete** while any signing invitation is still pending for a NeSL invitee. ### Editing Certain Fields For documents involving NeSL signers, some fields become non-editable after sending. | Field | Editable | | --------------------------- | -------- | | Name | ✅ Yes | | Notification Settings | ✅ Yes | | Custom Message | ✅ Yes | | Reference Attachment | ✅ Yes | | Email Address and Phone No. | ❌ No | | eSign Type | ❌ No | | NeSL Form Details | ❌ No | --- URL: https://knowledge.leegality.com/document-execution/nesl/enable-nesl-esign # Enable NeSL eSign in Leegality To use NeSL eSign and eStamping features via Leegality, clients must first share their NeSL configuration details via secure email. Once Leegality sets up the profile, clients can enable NeSL eSign and begin using it. ## Step 1: Share NeSL Configuration Details Before enabling NeSL eSign, your organization must share specific credentials and configuration parameters with Leegality. These are required to initiate secure API communication with NeSL on your behalf. > **Tip — Important** > > Details are collected from clients via a **secure email**. Once received, Leegality will configure your **NeSL Profile**. ### NeSL Profile in Leegality The **NeSL Profile** tab displays all configured credentials. These fields are **read-only** and set up by Leegality after receiving the necessary details via a secure channel. To access NeSL Profile: 1. Click on the **Setting ⚙️** icon on the top right corner. 2. Go to **Department > NeSL eSign Config**. Click **Details** next to the relevant profile on the right to view the configured information. | Field | Description | | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Service Name** | Specifies the NeSL service type – *Lending*, *Non-Lending*, or *eBG* | | **Path ID (Encryption Key ID)** | Generated by Leegality. Used in `certificate.properties` to enable NeSL signing via the Leegality utility ([link](https://gitlab.leegality.com/leegality-public/docsigner)) | | **NeSL API Key** | API key issued by NeSL | | **Client ID** | NeSL-issued Client ID | | **Username** | NeSL portal username | | **Password** | NeSL portal password | | **NeSL Expiry Timeline** | Default document expiry timeline configured in your NeSL account | | **Additional Encryption Key ID** | Required for sending notification payloads (especially for eBG flows) | > **Info** > > Please inform Leegality of any changes to these credentials in advance to avoid errors or disruptions. ## Step 2: Enable NeSL eSign in Your Account Once your NeSL profile has been successfully configured by Leegality, follow the steps below to enable or disable NeSL eSign in your account. 1. Click the **Settings ⚙️** icon in the top-right corner of the Leegality dashboard. 2. Navigate to **Department > eSignature**. 3. Locate **NeSL eSign** in the list of available eSign types and toggle it ON. Click the adjacent **Gear ⚙️** icon to configure **certificate verification** settings, if required. --- URL: https://knowledge.leegality.com/document-execution/nesl/error-troubleshooting # NeSL Error Troubleshooting | Error Code | Description | Context | Recommended Action | | :---- | :---- | :---- | :---- | | **ER00P9** | We encountered a temporary issue while processing your request. This may be due to NeSL server downtime. | Temporary outage at NeSL’s end. | **Sender**: Use the **Retry** button on the Details Page after a few minutes. | | **ER00CP** | Your session expired—likely due to extended idle time or a network issue. | Session timeout on the signer’s side. | **Signer**: Reopen the signing link received via email, SMS, or WhatsApp to restart the process. | | **ER00CP** (Response URL rejected) | NeSL rejected the response/callback URL configured for the eSign flow. | The response URL on the Leegality side has not been whitelisted on NeSL's environment, or the URL registered with NeSL does not match the URL being passed at runtime. | **Sender**: Contact Leegality Support (support@leegality.com) to align the response URL with NeSL. | | **ER00P19** | The certificate configuration appears to be incorrect. | The certificate details stored in Leegality are not mapped correctly with NeSL. | **Sender**: Contact Leegality Support (support@leegality.com) to verify your certificate setup. Support will escalate to NeSL if required. | | **ER00J18** | Invalid PAN format. Ensure it matches the legal constitution (**e.g.**, 'P' for individuals). | PAN/legal constitution mismatch. | **Sender**: Validate PAN and legal constitution of the signer. Re-initiate the signing with corrected details. | | **ER00J101** | Incorrect eSign coordinates detected on the document. | The document is not A4-sized, or the sign coordinates are incorrectly configured. | **Sender**: Re-initiate the document with A4 page size and valid coordinates for all NeSL signers. | | **ER00J104** | Incorrect Article Code selected for the transaction. | The Article Code in the request is wrong, or the Article Code list has not been updated (added/removed) for the state. | **Sender**: Verify and select the correct Article Code, then re-initiate the transaction. If the correct Article Code is already selected, contact Leegality Support (support@leegality.com) to check whether the Article Code list needs to be updated. | | **ER00J229** | Article Sub Code is mandatory or invalid for the request. | The Article Code or Article Sub Code being passed in the request is either invalid or not applicable for the given state. | **Sender**: Refer to the NeSL communique for the valid Digital Article Code and Article Sub Code applicable for the state, and pass the correct values in the request JSON before retrying. | | **ER00E9** | Issue during eStamping. This is likely temporary. | Problem at the state eStamping portal (e.g., SHCIL). | **Sender**: Resubmit the transaction with a new txnID — most ER00E9 failures clear on a single retry. If the retry also fails, capture both txnIDs and the full NeSL response, and escalate to Leegality Support (support@leegality.com) with both txnIDs. | | **ER00E15** | NeSL eStamping was only partially completed for the transaction. | The stamping flow did not finish end-to-end on NeSL's side, leaving the stamp in an incomplete state. | **Sender**: Click the **Refresh Document** button on the document Details Page in the Leegality dashboard. If the issue persists after refreshing, contact Leegality Support (support@leegality.com). | | **ER00E01** | eSign process failed due to a temporary issue with UIDAI. | UIDAI servers are intermittently unresponsive. | **Signer**: Retry after a few minutes. | | **ER00B01** | Insufficient stamp balance in your NeSL wallet. | The state-specific NeSL wallet lacks sufficient balance. | **Sender**: Contact NeSL to check and top up the relevant state account. | | **ER00ST** | Your session expired—likely due to inactivity or a network issue. | Session timeout while on NeSL Signing Pages. | **Signer**: Use the signing link to initiate the signing process. | | **ER00MS** | Session Already Exist. An active NeSL eSign session already exists for this transaction. | The signer has an open session that has not been properly closed, or a retry is attempted before the previous session times out. | Wait for 180 seconds (3 minutes) before trying again, and then log in / retry. If the issue persists, contact Leegality Support (support@leegality.com) with the NeSL Reference ID. Support will escalate to NeSL to clear the stale session. Once cleared, the signer can re-initiate the eSign process. | | **ER00E13** | Maharashtra eStamping is not enabled for your organization. | Your organization isn’t onboarded for Maharashtra eStamping. | **Sender**: Complete onboarding using [this guide](https://nesl.co.in/wp-content/uploads/2023/09/Communique-92-Ease-of-onboarding-documentation-for-Maharashtra-paperless-10D-e-stamp-certificate.pdf). | | **ER500API** | Temporary system issue prevented request completion. | NeSL failed to respond to an API call. | **Sender**: Use the **Retry** button on the Details Page. **Signer:** Retry after some time. | | **ER502** | System issue encountered. Please retry. | NeSL’s systems are temporarily unavailable. | **Sender**: Use **Retry** on the Details Page. **Signer:** Retry after a few minutes. | | **ER00E04** | It appears the Aadhaar card used for signing doesn't have a linked mobile number or email ID. | Aadhaar is not linked with mobile number or email. | **Signer**: Retry using the correct Aadhaar number. | | **ER00J137 / ER00J176** | Duplicate loan number detected. | A previously used loan number is being reused. | **Sender**: Use a unique loan number to re-initiate the transaction. | | **ER00S8** | Duplicate transaction details. | Caused by refreshing the document multiple times. | **Sender**: Use the **Refresh Document** button only once. | | **ER00J1** | Invalid JSON structure. | Payload mismatch; often occurs in sandbox. | **Sender**: - Create a new transaction. - In case of recurrence, contact your tech team to extract payload and escalate to NeSL. - Include complete context: date, time, environment, sender name, transaction ID. | | **Internal server error** | Error on signing link click. | Occurs when F2F Signing is enabled. | **Sender**: Disable the **“Enable Leegality signing link for first invitee”** option under: _*Accounts > Department > eSignature > NeSL > Settings*._ | | **Internal Server Error** | General error during refresh or document creation. | Server/network issue at NeSL. | **Sender**: Retry the action (refresh or create). If the issue persists, escalate to NeSL. | | **ERR\_EMPTY\_RESPONSE** | Signer sees an unresponsive page when clicking the signing link. | NeSL sent a broken eSign URL with a `null` value. | **Sender**: Raise the issue with NeSL, referencing the `Get_Esign_Link` API’s invalid response. | | **ER00P1** - Response URL is Missing **ER00P2** - ClientID is Missing **ER00P3** - Authorization is Missing **ER00P4** - API key is Missing **ER00P5** -MetaData is Missing **ER00P7** - ResponseURL should not be null **ER00P8** - ClientID should not be null **ER00P9** - API-key and client should be valid **ER00P10** - MetaData should not be null **ER00P11** - API-Key should be Valid **ER00P12** - Authorization should not be null **ER00P13** - Invalid ClientID **ER00P14** - Unable to write JSON **ER00P15** - Invalid MetaData **ER00P17** or **ER00P16** - Invalid Authorization | Multiple API configuration errors (e.g., missing keys, metadata, etc.). | Either incorrect API setup or NeSL is experiencing issues. | **New Sender**: Verify API setup in Admin Panel. **Existing Sender:** Raise a ticket with NeSL confirming correct setup. | | **Max limit reached for Submitter Txn ID \+ Loan No.** | Limit exceeded (50) for Refresh API calls. | Too many refresh attempts for the same combination. | **Sender**: 1. Request limit increase from NeSL. 2. Instruct signers not to refresh excessively. 3. Retry once the cap is lifted. | | **Error 1: Successfully updated document** | Temporary issue that resolves automatically. | Minor, transient issue at NeSL’s end. | **Signer**: Retry after some time. | --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/_leegality-certificate-verification # NeSL - Leegality Certificate Verification ## Verification Parameters * Name * Gender * Year of birth * Pincode * State * Last 4 digits of the Aadhaar ## Acceptance Condition * **Accept but respond with result:** The signing journey will be continued but the verification results will be shown in the response. * **Accept but pause the signing journey:** The signing journey will pause for non-NeSL invitees that are next in the signing order. The document will not be activated, and they will not receive the eSign invitation. ## Verification Type Smart Name Verification * AI-based name matching * Text-based name matching **Match Threshold:** Minimum match percentage in order to proceed. Acceptance Condition * Accept but respond with the result * Reject if fails --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/ebg-event-reviewer # NeSL eBG Event Reviewers The **eBG Event Reviewer feature** allows users to: - **Assign Reviewers:** Designate specific users to review and accept/reject the event request. - **View Event Details:** Access detailed information about the event request raised via the NeSL IU portal - **Approve or Reject Requests:** Take action on the requests directly within the Leegality platform. This integration ensures that banks can process eBG events efficiently without document uploading, even for actions like cancellations. ### Who is a Reviewer? A Reviewer is a designated user responsible for evaluating and making decisions (either accept or reject) on event requests related to Electronic Bank Guarantees (eBGs). These events may include actions such as amendments, invocations, cancellations, or closures. ## How to add an eBG Event Reviewer 1. Click on the **Settings ⚙️** icon in the top right corner. 2. Go to **Department > NeSL eSign Config**. 3. Select the **eBG Event Reviewers** tab. 4. Select the event type from the left. 5. Click on the **+ Add** button. 6. Enter the reviewer’s name and email address. 7. Click on the **✓** icon. ## How to accept or reject eBG event request On the **Dashboard**, click the **eBG notifications** option in the left panel 1. Click on the **Three Dots** and select **Review Request**. 2. Here, you can view: * Request Details * Supporting Document * Participants * eBG Details 3. After reviewing, you can either **Accept** or **Reject** the request. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-aadhaar-validation # NeSL Aadhaar Validation NeSL Aadhaar validation enables the sender to verify a NeSL invitee's details before they eSign a document. The details provided by the sender in the NeSL form (or Excel) during the sending process are cross-checked against the invitee's information at NeSL. To get this feature enabled, please reach out to us at support@leegality.com. To check if NeSL Validation is enabled for your account, 1. Click on the settings icon in the right corner. 2. From left, select **Department > NeSL Config**. 3. Click **Details** of the appropriate **NeSL Profile**. The **NeSL Aadhaar Validation** will be enabled. > This information is for reference only and cannot be edited from the dashboard. > **Warning — These checks cannot be bypassed** > > If NeSL enables this functionality for an organisation and a specific registration type (Lending, Non-Lending, or eBG), validation checks become mandatory for all documents and invitees under that registration type. ## Sending Journey If NeSL validation is enabled, the following invitee details are verified: * **Name:** Must have at least a 75% match. * **Year of birth:** Requires an exact match. * **Gender:** Requires an exact match. > **Warning — Mandatory Fields** > > The sender must fill out all Name, Year of Birth, and Gender in the NeSL form during the sending journey. When NeSL Aadhaar validation is active, the NeSL Aadhaar validation is performed first, followed by Leegality Aadhaar verification (if enabled). ## NeSL Aadhaar Validation Results in Signing Journey ### ✅ Validation Successful * If the invitee's details match, NeSL validation will succeed, and the signing journey will continue smoothly. * If Leegality Aadhaar verification is enabled, it will take place after NeSL validation, allowing the signing journey to proceed as usual. ### ❌ Validation Fail * If the invitee's details do not match and NeSL validation fails, the invitee’s signature will not be applied to the document, and the signing URL will expire for only the invitee with failed validation. * The signing journey will continue for any other NeSL invitees (if present), as NeSL does not allow the signing journey to be paused mid-process. * Once all NeSL invitees are signed, the signing journey will pause for non-NeSL invitees that are next in the signing order. The document will not be activated, and they will not receive the eSign invitation. In case of NeSL validation failure, the sender needs to send the document again with the correct NeSL invitee details. ## NeSL Validation with Leegality Aadhaar validation | NeSL Aadhaar Validation | Leegality Validation | Leegality Validation’s acceptance condition (*In case of failure, allow the NeSL invitee to sign, but:*) | Can Invitee Sign? | Does Invitation Expires? | Signing Journey — Pause or Continue | | :---- | :---- | :---- | :---- | :---- | :---- | | Pass | Pass | Respond with result Or Pause Signing Journey | Yes | No | Continue | | Pass | Fail | Respond with result | Yes | No | Continue | | Pass | Fail | Pause Signing Journey | Yes | No | Pause | | Fail | Will not be checked | Respond with result Or Pause Signing Journey | No | Yes | The journey will **Continue for NeSL signers only**. If there are non-NeSL signers in the signing order then the journey will be paused for them. | --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-form # NeSL Form When sending a document for NeSL eSign, you are also required to upload key data to the NeSL Information Utility (IU). This includes details related to the document details, invitee and party details, stamp duty, and any security or collateral involved. ## Methods to Fill the NeSL Form 1. **Dashboard Form:** A guided, section-wise form opens directly within the Leegality interface. Each section is listed on the left panel, with corresponding fields on the right. 2. **Excel Upload:** Download Leegality’s preformatted Excel template, fill in the required data, and upload the completed sheet. > **Warning — Note** > > Based on the selected Registration Type, some fields in the form will be mandatory while others remain optional. ## NeSL Form Field Reference Table The table below provides a comprehensive list of all fields used in the NeSL Form across different registration types. For each field, you’ll find: - **Field Name:** The label used in the form - **Description:** What the field captures - **Validation Rules:** Any input restrictions or logic applied - **Mandatory/Optional:** Whether the field is required or not based on context --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-invitation-expiry # NeSL Invitation Expiry The expiry duration for NeSL eSign invitations is fixed. By default, this duration is fixed to 240 hours (10 days). Regardless of any expiry settings configured under the **Signing Journey Options**, NeSL invitations will always adhere to the fixed expiry timeline defined at the NeSL level. > **Warning — Fixed Expiry Timeline** > > The NeSL eSign invitation will always expire after 10 days (240 hours). If a client needs a different expiry duration for NeSL eSign invitations, they must raise a request directly with NeSL. For non-NeSL invitees in the document, the expiry duration of the signing link will follow the configuration set under **Signing Journey Options > Expiry of signing link**. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-multi-stamping # NeSL Multi Stamping The **Multi Stamping** feature in NeSL DDE allows you to affix **multiple e-stamp papers** to a **single composite document** during the digital signing process. This functionality is primarily used when a single document covers **multiple distinct transactions or aspects**, each of which attracts stamp duty under a **different article code** of the state's stamp act. ## Sending Journey: Configure NeSL Stamping Follow these steps to enable and set up multiple NeSL stamp papers: 1. Click **Signing Journey Options** at the bottom left of the document creation screen. 2. Configure the Number of Stamp Papers. * The **Number of Stamp Papers** toggle is enabled by default. * Enter the number of stamp papers you want to affix. 3. Click **Save**, then **Next** to continue. ### Fill Stamp & Invitee Details You will be prompted to fill in the NeSL stamp and invitee details: - Either **upload an Excel template** with the required data - Or **fill in the details directly** via the dashboard Depending on the number of stamp papers configured under **Signing journey options \> Number of Stamp Papers**, the equivalent number of stamp details have to be filled. For example, Stamp 1 Details, Stamp 2 Details, and so on. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-parties # NeSL Parties **NeSL Parties** refer to additional individuals or entities, **apart from the NeSL signers**, who are involved in the agreement and whose details must be submitted to NeSL. > **Info — Note** > > NeSL parties **may or may not be signer** in the agreement. ## How to Add NeSL Party 1. In the Invite Page, click **Signing Journey Options**. 2. Enable **Number of NeSL Parties** toggle. 3. Enter the number of parties whose details you need to send to NeSL. 4. Click **Save**. 5. Fill in the **Party Details** in the [**NeSL Form**](https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-form) along with other documents and stamp details. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-features/stamp-duty-calculator # Stamp Duty Calculator The Stamp Duty Calculator allows users to fetch stamp duty amounts directly through NeSL within the dashboard. This simplifies the process by automatically calculating stamp duty based on the state, article code, and consideration amount reducing manual efforts. ## Available for eGRAS states Supported only for eGRAS states only (Not applicable for SHCIL states) - Maharashtra (MH) - Madhya Pradesh (MP) - Kerala (KL) - West Bengal (WB) - Karnataka (KA) - Telangana (TS) - Bihar (BH) > **Warning — Not for fixed stamp duty** > > For article codes with fixed stamp duty: > - NeSL APIs will not return a value > - Users must manually enter the stamp duty. Refer to the [**NeSL Article Codes**](https://www.nesl.co.in/states-union-territories-for-digital-e-stamping/) for details ## How to Use NeSL Stamp Duty Calculator In the NeSL form, 1. Fill the required **document details**. 2. In the Stamp Details section; 1. Select appropriate **Article Code** 2. Enter the **Consideration Price** 3. Click on the **Calculator** icon next to Stamp duty amount field. Stamp duty will be auto-filled based on the NeSL response. You can edit the value if needed. All required fields must be filled in order to calculate the stamp duty amount. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-sending-journey # NeSL Sending Journey This article explains how to send documents for NeSL eSign across different use cases supported in Leegality: - **NeSL Hybrid Flow** - **NeSL Only Stamping** - **NeSL eBG (Electronic Bank Guarantee)** ## Step 1: Prepare your document The process of preparing the document is exactly the same as the Non-NeSL sending journey. Below are the key steps involved in document preparation. 1. Click **+ Create** and select **New Document Journey**. 2. Choose either: - Upload PDF(s). > **Tip — Document Requirements** > > - **Format:** Only standard A4-sized PDFs are supported. > - **Digital Signatures Removed:** Any digital signature on the uploaded document will be cleared once NeSL stamp is applied. - Select a prebuilt [**template**](https://knowledge.leegality.com/document-execution/template). > **Note:** The **Allow first invitee to fill** option can only be used if a reviewer is the first invitee. 3. Click **Next**. > **Info** > > For full details, refer to the [**complete document preparation process**](https://knowledge.leegality.com/document-execution/getting-started/sending-journey#step-1-prepare-your-document). ## Step 2: Add Invitees Click **Add Invitee** and enter their **name**, **email**, and/or **phone number**. - From the **Signature Type** dropdown, choose **NeSL eSign** if the invitee is a NeSL signer. - Repeat for all NeSL signers. > **Warning — Mandatory Fixed Signing Order** > > Enable **Request invitees to sign in fixed order** on the invite page. > **Info** > > #### Supported Invitee Options for NeSL Signers > - Email, SMS, and WhatsApp notifications > - Add custom URLs/webhooks > - Mask contact details ## Step 3: Flow-Specific Instructions #### NeSL Hybrid Flow ### What is NeSL Hybrid Flow? In NeSL hybrid flow, there are invitees with both NeSL eSign and other eSign types. NeSL signers perform their signing journey on the NeSL portal. Once all NeSL signers sign the document, then invitees with other eSign types start signing the document. #### NeSL Hybrid Flow - Sending Journey > **Warning — Mandatory** > > - *All NeSL invitees must be added first and grouped together in sequence.* You cannot place a reviewer or a non-NeSL signer between them. > > **Exception:** Only a [**reviewer**](https://knowledge.leegality.com/document-execution/leegality-features/invitee-level/types-of-invitee/reviewer) can be added as the first invitee. > - *Non-NeSL eSign invitees must be placed after all NeSL invitees*, as NeSL clears any pre-existing signatures. 1. Click **+ Add Invitee** and enter their **name**, **email address**, and/or **phone number**. 2. From the **Signature Type** dropdown, select **NeSL eSign**. > 📌 **Note:** An invitee configured with *NeSL eSign cannot use any other eSign type simultaneously*. 3. After all NeSL signers have been added, you can add other invitees using any other [**signature types**](https://knowledge.leegality.com/category/esign-types) such as **Aadhaar**, **Virtual**, **Quick**, or **DSC**. > ℹ️ **Info:** Non-NeSL invitees can use the full range of Leegality features available under both [**Invitee-level Options**](https://knowledge.leegality.com/category/invitee-level) and [**Signing Journey Options**](https://knowledge.leegality.com/category/document-level). #### NeSL Only Stamping ### What is NeSL Only Stamping? _(Stamping via NeSL and Signing via Leegality)_ The NeSL Only Stamping enables organisations to procure real-time e-stamps through NeSL while executing the signing process entirely within Leegality using your preferred eSign methods (e.g., Aadhaar, DSC, Virtual, and Quick Sign.). This offers a streamlined experience with the compliance benefits of NeSL stamping, without involving the more complex NeSL signing process. It is ideal for institutions that want to leverage **NeSL's instant, state-compliant stamp generation** but avoid the **multi-step NeSL signer experience**, which often leads to user drop-offs. #### Why Use NeSL Only Stamping Flow? - **Real-time stamp generation** - No need for maintaining stamp inventory. - **Dynamic party name stamping** - actual names like “XYZ Ltd.” instead of placeholders like “Borrower.” - **Automatic data upload to NeSL IU** via DDE, saving operational effort (if applicable). > **Warning — Prerequisite** > > **Approval required:** This flow is available **only to NeSL-approved clients**. Without NeSL's approval clients will be unable to use it. #### NeSL Only Stamping - Sending Journey 1. On the create page, toggle on the **NeSL Stamping** option. 2. Add and configure the invitees. > **Info — Note** > > Since no NeSL signers are involved, **you do not need to configure any invitee under the NeSL eSign type**. 3. Click on the **Signing Journey Options**. - **Number of NeSL parties:** Specify the involved [Parties](https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-parties) in the agreement whose data will go to NeSL IU. (NeSL Parties can be signing/non-signing parties in the agreement.) > At least **1 NeSL party** is required in NeSL only stamping flow. - **Number of Stamp Papers:** By default, it is 1. You can use multiple stamp papers if required. 4. Click **Next**. 5. Fill the [**NeSL Form**](https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-form) details via the Dashboard or upload the filled XLS file. 6. Configure the signing coordinates and **Send** the document. After document setup: ![](https://mermaid.ink/img/pako:eNo9j0FvwjAMhf-K5XNBSdc2tAekjWkntMN2G-UQNW6JRhKWpAyG-O9LmYZPftZ7_uwLdk4RNtjv3Xe3kz7C-q21kOpxsyYa5F7HMwSyKoCEEKU5aDuAp6-RQoTo4JXe11uYzZbwtJl6kH2vTxQg7ghodotMvkkq142GbPzzrzYv2qcl2h51JAKdEF3URxlJQe88BD3YiaYt3G_ZYoaD1wqb6EfK0JA3cpJ4me5uMXEMtdikVkn_2WJrrylzkPbDOfMf824cdtj0ch-SGg8qQZ-1HLw096lPX5NfudFGbDivb0uwueApyaKclyXjecELXgmxqDI8Y1OzOcsrXj4UtRB5Xl8z_LlR2bxciJxVNStzVi8EF9dfWbJ5WQ?type=png) > **Info — Note** > > **Stamping is triggered only after reviewer approval** (if reviewer is present). #### Credit Consumption - **NeSL Stamp Credits** are consumed upon successful stamp generation. - **Leegality eSign Credits** are consumed based on the eSign method used for signing. - **Credits are non-refundable** once deducted after stamp generation. #### NeSL eBG Flow ### What is NeSL eBG? NeSL eBG (Electronic Bank Guarantee) is a digital bank guarantee solution offered through the NeSL (National E-Governance Services Ltd.) platform. In the context of Leegality, NeSL eBG enables banks and corporates to issue, sign, and manage eBank Guarantees entirely online, streamlining the traditionally paper-heavy process. Leegality integrates with NeSL eBG to support the eSigning of eBG documents through the NeSL platform. The integration ensures compliance with NeSL's security and workflow requirements while offering a seamless user experience within Leegality's document journey. ### Standard Practice for NeSL eBG In most eBG use cases, only the bank officers (on behalf of the issuer) are required to sign the document. However, NeSL mandates the inclusion of Debtor and Beneficiary information during eBG issuance—even if they are not signing the document. To support this requirement, Leegality introduces **NeSL Parties** in the eBG flow. These are non-signing entities (typically the Debtor and the Beneficiary) whose details are still uploaded to NeSL IU. > 🔗 [Learn more about NeSL Parties](https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-parties) ### NeSL eBG Flow - Sending Journey 1. Add invitee and enter their **name, email address**, and/or **phone number**. 2. Click **Signature Type** and enable **NeSL eSign**. 3. Click on the **Signing Journey Options** and enable the **Number of NeSL Parties** toggle. > **Warning — Mandatory** > > At least 2 NeSL Parties (Debtor and Beneficiary) must be added for eBG flows. 4. Click **Next**. Here, you need to configure the details of Debtor and Beneficiary as NeSL Parties in the Form. ## Step 4: Fill NeSL Form Next, fill out the [**NeSL Form**](https://knowledge.leegality.com/document-execution/nesl/nesl-features/nesl-form). You can choose one of two methods: #### **Option 1: Excel Template** - Click **Download Template Excel File**. - The first row contains field names; fill in details in the second row accordingly. #### **Option 2: Dashboard Form** - Click **Proceed to filling dashboard form**. - A multi-section form opens, with section names on the left and corresponding fields on the right. > **Note:** Mandatory and optional fields vary depending on the selected registration type. ## Step 5: Configure Signing Coordinates 1. Place the [**signature coordinates**](https://knowledge.leegality.com/document-execution/leegality-features/signature-coordinate/signature-coordinate) on the document. 2. Preview the document and click **Send** to complete the process. After sending the document, you will be redirected to its [**details page**](https://knowledge.leegality.com/document-execution/nesl/details-page), where you can track the signing status of all invitees and perform additional actions. NeSL invitees will receive notifications from both NeSL and Leegality via their email address and/or phone number to [**sign the document**](https://knowledge.leegality.com/document-execution/nesl/nesl-signing-journey). Non-NeSL invitees will receive notifications from Leegality based on your configured settings. --- URL: https://knowledge.leegality.com/document-execution/nesl/nesl-signing-journey # NeSL Signing Journey This section explains how signers (invitees) can complete their NeSL eSigning process after receiving an invitation. #### OTP-based Signing Journey 1. Look for an invitation from NeSL. The message will contain a secure link to begin the eSigning process. 2. You will be redirected to NeSL’s eSigning platform. 3. Enter the OTP sent to the mobile number provided in the NeSL Form by the sender. 4. Once authenticated, the document will be displayed. Scroll to the bottom and click **I Agree** to proceed. 5. If the document includes an e-stamp, stamp details will be shown. Click **Next** to confirm. > ⚠️ **Important:** Once you click **Next**, the e-stamp paper will be generated. This action is **irreversible**. 6. The stamped version of the document will now be shown. Scroll down and click **Close** to continue. 7. A consent message will appear. Tick the checkbox to agree and click **Submit**. 8. A message will appear: *“You are being redirected to the ESP website.”* Click **Close** to proceed. 9. On the eSign Service Provider (ESP) site, enter your **Aadhaar number** and **OTP** to finish the eSign process. #### Face Auth Signing Journey You can now complete NeSL eSigning using Aadhaar face authentication, in addition to the existing Aadhaar OTP, biometric, and token-based eSign options. #### Prerequisites Before you begin, ensure you meet the following requirements: 1. You are using an Android device (face authentication is currently available only on Android). 2. Face authentication is enabled for your NeSL account. If you don't see this option, contact NeSL to request access. 3. Install the following apps on your device: - **Aadhaar Face RD** (by UIDAI): [Download from Play Store](https://play.google.com/store/apps/details?id=in.gov.uidai.facerd) - **eMudhra App** (by eMudhra, NeSL's eSign Service Provider): [Download from Play Store](https://play.google.com/store/apps/details?id=com.emudhra.esignpdf) #### Face authentication signing journey The NeSL process remains the same until you reach the eSigning step. After completing the link access, captcha, OTP authentication, and eStamping, follow these steps: 1. On the eSigning screen in NeSL, select **Face Auth Based eSign**. 2. You will be redirected to the eMudhra ESP page. 3. Select **Sign using Mobile App**. 4. The eMudhra App opens automatically. 5. Enter your Aadhaar number and complete the face capture process. 6. After successful verification, you will be redirected to the NeSL completion screen and then back to Leegality. > **Info — NeSL Only Stamping - Automatic Retry** > > If a NeSL only stamping fails due to temporary stamping issues at NeSL's end, Leegality will automatically retry it. Upon success, the system seamlessly attaches the stamp, deducts the fee, updates the status, and triggers your invitations. > > **Note:** NeSL form validation errors cannot be auto-retried and require you to send a new document. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/overview # eSignature and Seal settings This section allows you to save the eSignature seal and signature appearance for specific eSign types, including: * Virtual Sign * Quick Sign * Visual Sign * Document Signer Certificate (DSC) You can also configure the automated signing process for all these eSign types here. These saved configurations can be used whenever you sign a document using one of these eSign type. > **Info — Example** > > If you have configured a hand-drawn signature for Virtual Sign, it will be automatically selected when you need to use Virtual Sign, eliminating the need to upload or draw the signature again. This feature is particularly beneficial for regular signers, as it streamlines the signing process by saving their eSign and seal configurations, making document signing quicker and easier. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/set-automated-sign # Setting Up Automated Sign Before proceeding, ensure that your eSign for which you want to automated sign is already set up in your account. To Set Up Automated Sign in your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. For the desired eSign type, click on the **edit** icon on the right side. 4. Toggle the **Automated Sign** option to enable it. 5. Check the consent box to agree to the terms of using Automated Sign. 6. Set a password for the Automated Sign feature to secure its use. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/set-document-signer-certificate-dsc-for-your-account # Setting up Document Signer Certificate (DSC) The DSC configured here will also be used for bulk-signing the document. To set up a Document Signer Certificate for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In Document Signer Certificate, click on **Setup**. 4. Enter the **eSign Name**. It can be anything. 5. Choose where you want to store the Document Signer Certificate: - **My Server:** Select this if you want to store on your server. Provide the **Profile Access URL**, it should be publicly accessible. (**Important:** Leegality will provide a list of IP addresses for whitelisting to ensure secure access.) - **Leegality Server (_Recommended_):** If storing on Leegality's server, upload the `.pfx` file and enter the password of the .pfx file. 6. Provide the **Email Address(es)** for receiving certificate expiry notifications. 7. Click **Save** to complete the setup. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/set-esignature-seal-for-your-account # Setting up eSignature Seal An eSignature seal is a digital version of the traditional rubber stamp. It is used to authenticate signatures. If the sender requires your signature with an eSignature seal, the seal configured here will be pre-selected. To set up the eSignature seal for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Default eSignature Seal section, you can choose between three types of eSignature seals: - **Authorised Signatory:** Requires organization's name. - **Director:** Requires organization's name. - **Upload Physical Seal:** Upload an image of the physical seal. (Supported image formats are .jpg, .jpeg, and .png) > **Info** > > The company seal feature is available in every signing method, including **Aadhaar eSign**. When using Aadhaar eSign with a company seal, the signature will display your company seal instead of the Aadhaar logo. 4. You can see the preview of the eSignature seal on the right. 5. Click **Update** to save your settings. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/set-quick-sign-for-your-account # Setting up Quick Sign Quick Sign is a fast eSigning method that simplifies the signing process by eliminating OTP verification. It's ideal for situations where speed is prioritized over enforceability. Quick Sign is a fast eSigning method that simplifies the signing process by eliminating OTP verification. It's ideal for use cases where speed is prioritised over enforceability. To Set up Quick Sign for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Quick Sign section, click on the **Setup**. A side menu will appear on your screen with three options: - **Draw:** Draw your signature on the screen. - **Choose a pre-built virtual sign:** Select a pre-built signature from the available options. - **Upload a photo of your signature:** Upload an image of your hand-drawn signature. (Supported image formats are .jpeg, .jpg, and .png) 4. Select your preferred option and click **Save**. --- URL: https://knowledge.leegality.com/document-execution/settings/account-level/eSignature-and-seal/set-virtual-sign-for-your-account # Setting up Virtual Sign Virtual Sign is an electronic authentication that requires OTP verification of the Email or Phone Number. By setting up a Virtual Signature in your account, you can also use for automated signing of documents. To set up a Virtual Signature for your account: 1. Click on the **Settings ⚙️** icon in the top right corner. 2. From the left panel, go to **Settings > eSignature & Seal.** 3. In the Virtual Sign section, click on the **Setup**. A side menu will appear on your screen with three options: - **Draw:** Draw your signature on the screen and save it. - **Choose a pre-built virtual sign:** Select a pre-built virtual signature from the available options. - **Upload a photo of your signature:** Upload an image of your hand-drawn signature. (Supported image formats are .jpeg, .jpg, and .png) 4. Select your preferred option and click **Save**. --- URL: https://knowledge.leegality.com/document-execution/troubleshooting/login-troubleshooting # Login Troubleshooting A quick reference for the most common errors you may see while logging into or signing up on the Leegality dashboard, along with the steps to resolve them. | Error Message | Reason | Recommended Action | | :---- | :---- | :---- | | **Your account is locked due to 5 successive incorrect login attempts.** | Auto-lock triggered after five consecutive incorrect password attempts on the dashboard or a signing journey. | Open the unblock link sent to your registered email/phone number to unlock the account immediately. If the link is unavailable, contact [support@leegality.com](mailto:support@leegality.com) with the locked email, user name, and organisation name. | | **Email/phone number not registered with Leegality** | The email or phone number entered is not associated with any Leegality account. | On entering the OTP sent to the given email/phone number, the user is redirected to the sign-up page to create a new Leegality account. | | **Login OTP not received** (no error shown; OTP simply does not arrive) | Email landed in spam, address is on Leegality's suppression list (from a prior bounce or spam report), corporate firewall is blocking Leegality's domain, or OTP was sent to a different email. | Check spam/junk for mails from `noreply@leegality.com`. Resend the OTP and wait up to 2 minutes. Ask IT to whitelist Leegality's sending domain. Contact [support@leegality.com](mailto:support@leegality.com) for suppression list removal — include the affected email and organisation name. | | **Forgotten password** | User cannot recall their dashboard password and needs to set a new one. | Go to the [Leegality dashboard login page](https://dashboard.leegality.com/), enter your registered email, and click **Forgot Password**. Open the reset link from your inbox (check spam) and set a new password. If the reset email does not arrive, your address may be on Leegality's suppression list — contact [support@leegality.com](mailto:support@leegality.com) for removal. | | **Password reset email not received** | Same root cause as missing OTPs — spam filter, suppression list, or firewall block. | Check spam, then contact [support@leegality.com](mailto:support@leegality.com) for suppression list removal. | ## Still need help? If none of the steps above resolve your issue, contact [support@leegality.com](mailto:support@leegality.com) with your registered email, organisation name, the exact error message, and a screenshot if possible. --- URL: https://knowledge.leegality.com/document-execution/troubleshooting/sending-journey/upload-errors # PDF Upload Errors This page lists the common errors you may encounter when uploading a PDF on the **Create Document** page, along with their resolutions. If you encounter an upload issue, first verify your file meets the upload requirements documented in the [Sending Journey](https://knowledge.leegality.com/document-execution/getting-started/sending-journey) — PDF format, up to 10 files, combined size within 30 MB, not password-protected, not corrupt. If the file meets all requirements and the error persists, find your error message below.
ErrorCauseResolution
"Selected file is not allowed" The uploaded file does not meet the system's upload requirements. Common reasons:
  • The file is not a PDF
  • The PDF is corrupt
  • The PDF is password-protected
  • The PDF has editing or security restrictions
  1. Confirm the file is a valid PDF (.pdf) and not corrupt.
  2. Remove any password or security restrictions from the PDF.
  3. Re-save the PDF to clear any restrictive properties:
    • Open the PDF in Chrome or Adobe Reader
    • Click Print
    • Select Save as PDF as the destination
    • Save and re-upload the new copy
  4. Refresh the page, clear browser cache, or try a different browser.
  5. If you are on a corporate network or device, test on a personal device or network.
"The PDF file you are trying to upload is password protected. Please remove the password and try again." The PDF you are uploading is password-protected. Remove the password from the PDF and upload again. You can remove the password by opening the PDF in Adobe Acrobat (File > Properties > Security) or by re-saving via Print > Save as PDF in Chrome without a password.
"This particular PDF file is not suitable for eSigning. Please create a new file and try again." The file was recognised as a PDF, but its validation failed. This can happen with corrupted PDFs. Open the PDF in a standard PDF tool (Adobe Acrobat, Chrome, or Preview), re-save it, and re-upload the new copy.
"Unexpected error while uploading file. Please try again." An unexpected error occurred during upload. This is usually transient.
  1. Retry the upload once.
  2. Verify the file format and that the file is not corrupt.
  3. If the error persists, contact [support@leegality.com](mailto:support@leegality.com) with the error code and a screenshot.
Upload completes but the page does not advance Document upload stuck at 100%
  • Browser cache or session issue
  • PDF is corrupt
  • A corporate network or firewall blocking part of the upload flow
  1. Refresh the page and retry the upload.
  2. Recheck file requirements (PDF only, up to 10 files, combined size within 30 MB, A4 preferred).
  3. Try a different browser.
  4. If you are on a corporate network or device, test on a personal device or network.
## Still need help? If none of the steps above resolve your issue, contact [support@leegality.com](mailto:support@leegality.com) with the affected file (if shareable), the exact error message or error code, and a screenshot. --- # Changelog URL: https://knowledge.leegality.com/whats-new