NeSL e-Stamp
4 endpoints · Core API
The NeSL e-Stamp API provides integration with National e-Governance Services Ltd. (NeSL), India’s first Information Utility established under the Insolvency and Bankruptcy Code (IBC). NeSL enables legally valid digital stamping (e-Stamping) for agreements and documents, ensuring authenticity, transparency, and compliance with applicable stamp duty regulations. This API suite helps organizations digitize stamping workflows, reduce dependency on physical stamp papers, prevent fraud, and maintain audit-ready records.
The NeSL e-Stamp module provides the following APIs:
1. Get States: Retrieve the list of supported states for NeSL e-Stamping, along with their respective state codes required for stamp duty processing.
2. Get Article Code by State Code: Fetch applicable article codes based on the selected state code. Article codes define the type of document or transaction for which stamp duty is applicable.
3. Initiate NeSL Workflow: Initiate a NeSL e-Stamp workflow by submitting stamping details such as state, article code, duty value, and document information to generate an e-Stamp request.
4. Get NeSL Workflow Details: Retrieve the current status and detailed information of an initiated NeSL e-Stamp workflow, including processing state and reference details.
What you can do
Using this API suite, you can configure state-wise stamping requirements, identify correct article codes, initiate NeSL e-Stamp workflows, and track workflow status end-to-end. It enables seamless digital stamping, ensures accurate stamp duty application, improves turnaround time, and ensures legally compliant execution of agreements for individuals and entities.
Fetches the list of states supported for NeSL eStamping.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataarray<object>optionalNo description.nullable
Each item: 2 fields
- codestringoptionalNo description.nullable
- valuestringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
Fetches the article codes and descriptions for a specific state.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Query parameters
- stateCodestringoptionalRequired. Two-letter state code, case-insensitive (e.g., 'GJ', 'MH'). Call the states API for valid codes. An unknown code returns 404.
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
3 fields
- stateCodestringoptionalNo description.nullable
- stateNamestringoptionalNo description.nullable
- articlesarray<object>optionalNo description.nullable
Each item: 3 fields
- articleCodestringoptionalNo description.nullable
- articleNumberstringoptionalNo description.nullable
- descriptionstringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
Initiates a NeSL eStamp and multi-party Digital Signing workflow. Supports an optional "UI Mode" via the `uiMode` flag — creates the request in a pending-review state and returns a signed anonymous URL where signer coordinates can be reviewed before submission.
This API is used to create an e-Stamping and Digital Signing request for a legal document.
UI Mode (Optional Review Before Submission)
Set uiMode=true in the request body to defer submission to NeSL. When enabled:
-
The transaction is persisted in a PendingReview state. The submission to NeSL is not made yet.
-
The response returns a
uiUrlin addition toEStampId. The workflow/NeSL fields stay empty until confirmation. -
Open
uiUrlin a browser (no portal login required) — the lightweight review screen shows the uploaded PDF, pre-filled eStamp details and signer coordinates so the customer can adjust them. -
Clicking Confirm & Submit in the UI triggers the actual NeSL submission and the normal webhook flow resumes — your configured
ResponseWebhookUrlfires on status changes just as in the legacy flow. -
The signed URL expires after 7 days by default (configurable per-environment). Tampered or expired links return 401/410.
-
Backward compatibility: omitting
uiMode(or setting itfalse) is byte-identical to today's direct-submission behaviour.
Example response shapes:
uiMode=false(default):{ "eStampId": "...", "neslURL": "https://.../sign?...", "parallelSigningURLs": [...] }uiMode=true:{ "eStampId": "...", "neslURL": "", "parallelSigningURLs": null, "uiUrl": "https://<frontend>/nesl-stamp/review/<txId>?sig=...&exp=..." }
It allows you to upload a PDF, apply the required stamp duty as per state regulations, and define the signing flow for multiple parties all in a single API call.
For example, a bank can use this API to:
-
Apply a stamp duty for a Loan Agreement between the Bank and the Borrower.
-
Simultaneously apply a stamp duty for a Guarantee Bond between the Bank and the Guarantor.
-
Define who signs, in what order, and where on the document the signature box appears.
All of this happens in one request instead of multiple separate calls.
Q. What is documentInfo and why is it required?
documentInfo is the section that carries the actual PDF file that needs to be e-stamped and signed.
It contains two fields:
-
name - Required. The display name of the file, for example Loan_Agreement.pdf. Maximum 40 characters; letters, digits, spaces and the characters , @ _ . ' - ( ) [ ] only.
-
content - Required. The entire PDF file converted to a Base64 string. Maximum size 20 MB. The PDF must not already be signed.
Q. Who are firstParty and secondParty?
firstParty is typically the Lender (the Bank) and secondParty is typically the Borrower. Both are mandatory because NeSL requires both parties to generate a legally valid stamp certificate.
Each party object must contain:
-
name - Full legal name as it should appear on the stamp certificate.
-
signerName - Optional. The individual who signs on behalf of the entity (e.g., "Virag Kubadia" for "SignCare Solutions Pvt Ltd"). When provided, this name is shown in the signature box instead of name. See the dedicated signerName Q&A below for full details.
-
email - The email address where the signing invitation link will be sent. Must be different for every party in the request.
-
phone - A 10-digit mobile number. Must be Aadhaar-linked if Aadhaar OTP signing is used.
-
pan - PAN number for KYC verification. NeSL cross-checks this against government records. Format: AAAAA9999A (5 uppercase letters, 4 digits, 1 uppercase letter). Must be different for every party in the request.
-
pin - Conditional: required when stateCode is West Bengal (WB) or Madhya Pradesh (MP); optional otherwise. 6-digit postal PIN code. See the dedicated pin Q&A below.
-
doi - Date of incorporation (for an entity) or date of birth (for an individual), as an ISO 8601 date such as 1990-01-15. NeSL uses this to verify the PAN against official records.
-
signType - A list of allowed signing methods, at least one. Send each value as a separate array item. Accepted values (case-sensitive): Aadhaar (OTP-based eSign), Electronic (email OTP), DSC (hardware token).
Each party object also supports these optional fields for signing position, company seal, and Aadhaar verification:
-
signAppearance - Optional. Corner of the page for the signature box, sent as a number. Values: 1 (Top_Left), 2 (Top_Right), 3 (Bottom_Left), 4 (Bottom_Right), 5 (PageCoordinates, requires pageInfo). Default: 3 (Bottom_Left).
-
pageToBeSigned - Conditional: required unless pageInfo is provided. Which pages this party should sign, sent as a number. Values: 1 (FIRST), 2 (LAST), 3 (EVEN), 4 (ODD), 5 (ALL), 6 (SPECIFY). There is no default value; send 5 to sign every page.
-
pageNumber - Conditional: required when pageToBeSigned is 6 (SPECIFY) and pageInfo is not provided. Comma-separated page numbers (e.g., "1,3,7").
-
pageInfo - Optional. A list of manual page coordinates used instead of automatic placement for this party.
-
signatorySealInfo - Optional. Adds a company seal text ("For, OrgName" above and seal type text below) around the signature box.
-
aadhaarVerificationOptions - Optional. When signType includes
"Aadhaar", provides the invitee's demographic details for NeSL to cross-verify before the Aadhaar eSign. The cross-check runs only whenverifyInviteeis true. See the dedicated Q&A below for full details.
Q. When should I use coBorrowers?
coBorrowers is an array that allows you to add multiple additional signatories under the same role.
Each co-borrower follows the same structure as firstParty and secondParty (name, email, phone, doi, signType), except that pan is optional and signerName is not supported. Co-borrowers also support ovdType and ovdValue as an alternative to pan when the co-borrower does not have a PAN card. See the dedicated ovdType/ovdValue Q&A below. If there are no co-borrowers, omit the field or pass null.
Q. What is the guarantor field?
The guarantor is an optional single party object used when a third individual is guaranteeing the loan agreement.
It uses the same fields as firstParty and secondParty (name, email, phone, doi, signType). The guarantor also supports ovdType and ovdValue as an alternative to pan — see the dedicated ovdType/ovdValue Q&A below.
For the guarantor's stamp duty, add a separate entry in the root additionalArticles list where firstPartyName is the Lender and secondPartyName is the Guarantor.
Business rule: The Lender (firstParty) stays constant. The Guarantor replaces the Borrower as the second party only on the guarantor-specific stamp articles.
Q. What are ovdType and ovdValue and when should I use them?
OVD stands for Officially Valid Document. These two fields are available on coBorrowers and guarantor only — they are NOT available on firstParty or secondParty, where PAN is always mandatory.
Use ovdType and ovdValue when the co-borrower or guarantor does not have a PAN card. Instead of PAN, you provide an alternate government-issued identity document for NeSL KYC verification.
ovdType — The type of the identity document. Use one of these values (spelling must match; letter case is ignored):
passportdriving licensevoter idothers
ovdValue — The document number of the OVD. The format is checked for each type:
-
passport: 1 letter followed by 7 digits (e.g., A1234567). -
driving license: 2 letters followed by 13 digits, 15 characters in total (e.g., MH0120100012345). Hyphens and spaces are ignored. -
voter id: 3 letters followed by 7 digits (e.g., ABC1234567). -
others: any non-empty value.
Rules:
-
ovdType and ovdValue must always be provided together — you cannot send one without the other.
-
Send either pan or the ovdType/ovdValue pair, not both. A party that has both is rejected.
-
If the party has a PAN, provide pan and leave ovdType and ovdValue as null.
-
If the party does not have a PAN, provide ovdType and ovdValue and leave pan as null.
-
Every coBorrower and the guarantor must have either a PAN or an OVD. Each pan, email and ovdValue must be different across all parties in the request.
Q. What is stateCode and where do I get it?
stateCode is the two-letter code for the Indian state where the stamp duty is to be registered.
Different states have different stamp duty rates and article codes, so this field is mandatory. Example: GJ for Gujarat, MH for Maharashtra, KA for Karnataka. The code is not case-sensitive.
Call the /states API first to get a complete list of valid state codes. Any other code is rejected.
Q. What is referenceId?
referenceId is your unique transaction identifier used to track this workflow end-to-end in your own system. It must be unique per request, is 1 to 64 characters long, and may contain only letters, digits, hyphen (-) and underscore (_). A reference that was already used is rejected.
Q. What are additionalArticles and why are they required?
additionalArticles defines the legal and financial details for each stamp certificate to be generated.
A single loan can involve multiple stamp articles. For example, one article for the main loan agreement and a separate one for a guarantee bond.
Each article entry contains:
-
firstPartyName - The name printed as the first party on the official stamp paper. Always the Lender.
-
secondPartyName - The name printed as the second party on the official stamp paper. The Borrower for loan articles, or the Guarantor for guarantee articles.
-
stampdutyPaidBy - The name of the party who will pay the stamp duty (note the lowercase "d" in the field name). A legal requirement on the stamp certificate. It must match this article's firstPartyName or secondPartyName (letter case is ignored); any other name is rejected.
-
articleCode - A unique code for the document type (e.g., mortgage deed, acknowledgement of debt). Call the /article-code API with your stateCode to get valid codes.
-
amount - The stamp duty value in rupees (INR), as a number. Must be greater than zero. The total of all article amounts is debited from your NeSL wallet.
-
considerationPrice - The total transaction or loan value for this article in rupees, sent as a string (e.g., "100000").
-
description - An optional short description of the transaction.
All fields except description are required, and at least one article must be sent.
Q. Why are firstPartyName and secondPartyName required inside additionalArticles even though firstParty and secondParty are already provided?
firstParty and secondParty at the root level define who signs the document digitally. However, firstPartyName and secondPartyName inside each additionalArticle define the names that are physically printed on the official NeSL stamp certificate.
These can differ per article. For example, a single request may have one article for the Borrower (where secondPartyName is the Borrower) and another article for the Guarantor (where secondPartyName is the Guarantor). This is why each article must explicitly declare its own party names.
Q. How do I find the correct articleCode?
First call the /states API to get your state code. Then call the /article-code API passing the stateCode as a parameter. This returns all available document types and their article codes for that state.
Q. What does sequentialSigning control?
sequentialSigning is optional and defaults to true. It determines the order in which signing invitations are sent. The order is firstParty, secondParty, coBorrowers (in array order), then guarantor. Omit the field to use the default; do not send null.
-
true: Signers are invited one at a time in the order defined. The next person is notified only after the previous one has signed.
-
false: All signers receive the invitation at the same time and can sign in any order.
Q. How do I control where each person signs?
Positioning is now handled individually for each party (FirstParty, SecondParty, CoBorrowers, and Guarantor) using three properties inside each party object:
-
signAppearance - Optional. Defines the corner of the page for the signature box. Values: 1 (Top_Left), 2 (Top_Right), 3 (Bottom_Left), 4 (Bottom_Right), 5 (PageCoordinates, requires pageInfo). Default: 3.
-
pageToBeSigned - Conditional: required unless pageInfo is provided. Defines which pages this party should sign. Values: 1 (FIRST), 2 (LAST), 3 (EVEN), 4 (ODD), 5 (ALL), 6 (SPECIFY). There is no default value.
-
pageNumber - Conditional: required if pageToBeSigned is set to 6 (SPECIFY) and pageInfo is not provided. Provide a comma-separated list of page numbers (e.g., "1,3,7").
Optional: Manual PageInfo at Party Level If you need pixel-perfect manual control, each party also has an optional pageInfo list. If provided, those boxes are used instead of the automated signAppearance placement for that specific party. This allows you to define exact coordinates per page for every participant.
Each pageInfo entry has pageSize (page height in points), pageWidth (page width in points) and a pdfCoordinates list. Each coordinate box has:
-
page - Send "ALL" to use the box on every page; otherwise leave it empty and set pageNumber.
-
pageNumber - Comma-separated 1-based page numbers (e.g., "1,3"). Required when page is not "ALL".
-
x1, y1 - Left and top position of the box, in points from the top-left corner of the page.
-
x2, y2 - Width and height of the box, in points (not the bottom-right corner).
This flexible structure allows a Co-Borrower to sign pages 1-3 while a Guarantor signs only the Last page, all within a single request.
Q. What is responseWebhookUrl?
responseWebhookUrl is your server endpoint where SignCare will POST real-time notifications for signing events such as party signed, document completed, or rejected.
This is optional. If not provided, the system falls back to the webhook URL configured in your account settings.
Q. What is redirectUrl?
redirectUrl is the URL where the signer is redirected in their browser after completing the signing process. Optional, used to bring the user back to your application.
Q. Why is doi mandatory?
doi is the date of incorporation (for an entity) or date of birth (for an individual). It is a mandatory requirement from NeSL to register the stamping transaction and verify each party against the official government PAN database. Send it as an ISO 8601 date, for example 1990-01-15.
Commonly Asked Questions
Q. What is the role of the articleCode?
Every state has different codes for different types of legal instruments (e.g., Indemnity Bond vs. Affidavit). You must provide the correct code corresponding to the state selected in stateCode to ensure legal validity.
Q. How do coBorrowers differ from the secondParty?
While both are signatories, secondParty is usually the primary counterparty, whereas coBorrowers is an array that allows you to add multiple additional signatories under the same role.
Q. Why are firstPartyName and secondPartyName required inside additionalArticles?
Even though firstParty and secondParty are already defined at the root level, additionalArticles can cover multiple stamp certificates — each potentially involving different parties (e.g., a borrower article and a guarantor article).
firstPartyName and secondPartyName inside additionalArticles represent the names that are physically printed on the official stamp certificate issued by NeSL. These may differ per article — for example, in a borrower article the secondPartyName is the borrower, while in a guarantor article the secondPartyName is the guarantor. This is why these fields must be explicitly set per article.
Q. Why is doi required?
doi is the date of incorporation (for an entity) or date of birth (for an individual). It is a mandatory field for NeSL to register the stamping transaction and verify the party against the PAN database.
Q. What is signatorySealInfo and when should I use it?
signatorySealInfo is an optional object inside each party that adds a company seal text around the signature box on the PDF. It is typically used when the signer is signing on behalf of a company or organization.
When provided, the system renders "For, [OrganizationName]" above the signature box and a seal type label (e.g., "Authorised Signatory") below it.
It contains two fields:
-
name - The name of the organization (e.g., "ABC Bank Ltd"). This is printed as "For, ABC Bank Ltd" above the signature box.
-
sealType - Defines the label printed below the signature box. Values: 1 (Authorised Signatory), 2 (Director), 3 (Company Seal).
If signatorySealInfo is null or not provided for a party, no company seal text is added — only the bare signature box appears.
Q. What is signerName and when should I use it?
signerName is an optional field available on firstParty, secondParty, and guarantor. It is NOT available on coBorrowers — co-borrowers always sign as themselves.
Use signerName when the party is a company or organization and a specific individual is signing on its behalf. When provided, this individual's name is displayed inside the signature box on the document and in the UiMode review screen instead of the entity name.
Example scenario: The first party is a bank named "SignCare Solutions Pvt Ltd". The person actually signing on the bank's behalf is "Virag Kubadia". In this case:
-
name = "SignCare Solutions Pvt Ltd" (the legal entity — used for NeSL stamp certificate)
-
signerName = "Virag Kubadia" (the individual — shown in the signing box on the document)
If signerName is not provided, the party's name is used as the label inside the signing box — which is the correct behaviour when an individual is signing for themselves.
Q. What is pin and when is it required?
pin is the 6-digit postal PIN code of the party's address. It is available on firstParty and secondParty only.
This field is mandatory for firstParty and secondParty when stateCode is one of two states:
- West Bengal (WB)
- Madhya Pradesh (MP)
NeSL requires the PIN code for address verification in these states as part of the stamp duty registration process. For all other states this field is optional and can be omitted or passed as null. If sent, it must be exactly 6 digits.
Format: exactly 6 digits (e.g., "400001" for Mumbai, "110001" for Delhi).
Q. What is aadhaarVerificationOptions and when should I send it?
aadhaarVerificationOptions is an optional object inside each party (firstParty, secondParty, coBorrowers entries, and guarantor).
It is only used when that party's signType includes "Aadhaar". The API does not reject a request that omits it.
NeSL performs a demographic cross-check — it matches the details you send here against the Aadhaar database before it allows the invitee to complete Aadhaar OTP signing. If the details do not match, the signing step is rejected at the NeSL end.
The object contains the following fields:
-
verifyInvitee (boolean, optional, default
false) — Set totrueto enable demographic verification for this party. Iffalse, the other fields are ignored and no cross-check is performed. -
dateOfBirth (string, conditional) — Needed when verifyInvitee is
true. Full date of birth of the invitee. Format:YYYY-MM-DD. Example:"1990-07-15". Must match the DOB registered in Aadhaar. -
lastFourDigitOfAadhaar (string, conditional) — Needed when verifyInvitee is
true. Last 4 digits of the invitee's Aadhaar number, exactly 4 digits. Example:"4321". NeSL uses this to locate the correct Aadhaar record. -
gender (string, conditional) — Needed when verifyInvitee is
true. Gender of the invitee as registered in Aadhaar. Accepted values:"Male","Female"(letter case is ignored;"M"and"F"are also accepted). -
verifyName (boolean, optional) — Accepted but not applied to NeSL signing; the invitee's name is not verified against Aadhaar. Defaults to
false.
Important rules:
-
If signType is
"Aadhaar"and aadhaarVerificationOptions isnullor verifyInvitee isfalse, NeSL will still allow signing but skips the demographic cross-check. It is strongly recommended to always pass the demographic details when using Aadhaar signing to reduce signing failures. -
When verifyInvitee is
true, send dateOfBirth, lastFourDigitOfAadhaar and gender together. The API does not reject a missing value, but the cross-check needs all three. -
The gender field accepts
"Male"or"Female"(or"M","F"). Other values are rejected. -
dateOfBirth must be in strict
YYYY-MM-DDformat. Passing formats like"15/07/1990"or"July 15 1990"will cause a validation error. -
aadhaarVerificationOptions applies independently to each party. Two parties in the same request can have different signTypes — one using Aadhaar (with demographic options) and another using Electronic (with null options).
Validation Rules for Signing Position Fields
The following validation rules apply to signAppearance, pageToBeSigned, pageNumber, and pageInfo for each party:
Rule 1: At least one positioning method is required. You must provide either signAppearance (a corner like Bottom_Left) or pageInfo (manual coordinates). Both cannot be null at the same time. If you omit signAppearance entirely, it defaults to 3 (Bottom_Left).
Rule 2: signAppearance must be a valid value. If provided, it must be one of: 1 (Top_Left), 2 (Top_Right), 3 (Bottom_Left), 4 (Bottom_Right), or 5 (PageCoordinates). If signAppearance is explicitly null or invalid and pageInfo is also not provided, the request will be rejected.
Rule 3: pageToBeSigned is required unless pageInfo is provided, and it has no default value. You must tell the system which pages to sign (ALL, LAST, FIRST, etc.). If you provide manual pageInfo, pageToBeSigned becomes optional because pageInfo already specifies the pages.
Rule 4: pageToBeSigned must be a valid value. If provided, it must be one of: 1 (FIRST), 2 (LAST), 3 (EVEN), 4 (ODD), 5 (ALL), or 6 (SPECIFY). Invalid values are rejected unless pageInfo is provided as a fallback.
Rule 5: pageNumber is required when pageToBeSigned is SPECIFY and pageInfo is not provided. If you set pageToBeSigned to 6 (SPECIFY), you must provide a comma-separated list of page numbers in pageNumber (e.g., "1,3,7"). You cannot say "specific pages" without telling the system which ones.
Rule 6: pageInfo is required when signAppearance is PageCoordinates. If you set signAppearance to 5 (PageCoordinates), you must provide the pageInfo list with the exact X1, Y1, X2, Y2 coordinates. You cannot select "custom coordinates" without actually providing them.
Summary: pageInfo (manual coordinates) overrides everything. If you provide it, signAppearance and pageToBeSigned become optional. If you do not provide pageInfo, then signAppearance and pageToBeSigned are required and must be valid values.
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
- Content-Typestringrequiredapplication/json
Body parameters
application/json- documentInfoobjectrequiredDocument information for NeSL stamp request.
2 fields
- namestringrequiredRequired. File name of the document, e.g. "LoanAgreement.pdf". Max 40 characters; letters, digits, spaces and the characters , @ _ . ' - ( ) [ ] only.nullable
- contentstringrequiredRequired. Base64-encoded content of the PDF. Maximum size 20 MB. The PDF must not already be signed.nullable
- firstPartyobjectrequiredPrimary party details (First Party / Second Party) for NeSL stamp request. PAN is mandatory. OVD is not accepted for these parties.
14 fields
- namestringrequiredRequired. Full legal name of the party (entity or individual). Max Length: 100.minLength 0maxLength 100default John Doe
- signerNamestringoptionalOptional. Name of the individual who signs on behalf of a company or entity (e.g. "Jane Doe"). Shown in the signature box instead of name. Max Length: 100.nullableminLength 0maxLength 100
- emailstring (email)requiredRequired. Valid email address of the party. Must be different from every other party in the request (case-insensitive).minLength 1default john.doe@gmail.com
- phonestringrequiredRequired. Mobile number of the party. Must be exactly 10 digits.length 10pattern ^\d{10}$default 1234567890
- panstringrequiredRequired. PAN card number in the format AAAAA9999A (5 uppercase letters, 4 digits, 1 uppercase letter), e.g. "ABCDE1234F". Must be different from every other party in the request.minLength 1pattern ^[A-Z]{5}[0-9]{4}[A-Z]{1}$default ABCDE1234F
- pinstringconditionalConditional: required when stateCode is WB or MP. Postal PIN code, exactly 6 digits. Optional for other states.nullablepattern ^\d{6}$
- doistring (date-time)requiredRequired. Date of incorporation (for an entity) or date of birth (for an individual), as an ISO 8601 date, e.g. "1990-01-15".
- signTypearray<string>requiredRequired. Signing methods allowed for this party, at least one. Send each value as a separate array item. Allowed values (case-sensitive): "Aadhaar", "Electronic", "DSC".default ["Electronic"]
- aadhaarVerificationOptionsobjectoptionalNo description.
5 fields
- verifyInviteebooleanoptionalOptional. Set to true to have the signer's Aadhaar details cross-checked before Aadhaar signing. Default: false. When false, the other fields in this object are ignored.
- dateOfBirthstringconditionalConditional: needed when verifyInvitee is true. Date of birth as registered in Aadhaar. Format: YYYY-MM-DD, e.g. "1990-07-15". Other formats are rejected.nullable
- lastFourDigitOfAadhaarstringconditionalConditional: needed when verifyInvitee is true. Last 4 digits of the signer's Aadhaar number, as a string, e.g. "4321". Exactly 4 digits.nullable
- genderstringconditionalConditional: needed when verifyInvitee is true. Gender as registered in Aadhaar: "Male" or "Female" (case-insensitive; "M" and "F" are also accepted).nullable
- verifyNamebooleanoptionalOptional. Accepted but not applied to NeSL signing; the signer's name is not verified against Aadhaar. Default: false.
- signAppearanceinteger (int32)optionalPosition of signature on the page. Top_Left (1) = top-left corner, Top_Right (2) = top-right corner, Bottom_Left (3) = bottom-left corner, Bottom_Right (4) = bottom-right corner, PageCoordinates (5) = custom coordinates defined in PageCoordinates property.values: 1 | 2 | 3 | 4 | 5
- pageToBeSignedinteger (int32)optionalDefines which pages of the document should be signed. FIRST (1) = first page only, LAST (2) = last page only, EVEN (3) = even-numbered pages, ODD (4) = odd-numbered pages, ALL (5) = all pages (default), SPECIFY (6) = specific pages defined in PageNumber property (e.g. "1-2-3"), NONE (7) = no pages.values: 1 | 2 | 3 | 4 | 5 | 6
- pageNumberstringconditionalConditional: required when pageToBeSigned is 6 (SPECIFY) and pageInfo is not provided. Comma-separated 1-based page numbers, e.g. "1,3,7".nullable
- pageInfoarray<object>optionalOptional. Manual signature box coordinates for this party. When provided, these boxes are used instead of automatic placement.nullable
Each item: 3 fields
- pageSizenumber (float)optionalOptional. Height of the PDF page in points.
- pageWidthnumber (float)optionalOptional. Width of the PDF page in points.
- pdfCoordinatesarray<object>requiredRequired. Signature boxes for this page entry. Each box applies to every page it names in pageNumber, or to all pages when page is "ALL".nullable
Each item: 6 fields
- pagestringoptionalOptional. Send "ALL" to use this box on every page. Otherwise leave empty and set pageNumber.nullable
- pageNumberstringconditionalConditional: required when page is not "ALL". Comma-separated 1-based page numbers where this box is placed, e.g. "1" or "1,3".nullable
- x1number (float)requiredRequired. Left position (X) of the signature box, in points from the left edge of the page.
- y1number (float)requiredRequired. Top position (Y) of the signature box, in points from the top edge of the page.
- x2number (float)requiredRequired. Width of the signature box, in points.
- y2number (float)requiredRequired. Height of the signature box, in points.
- signatorySealInfoobjectoptionalNo description.
2 fields
- namestringoptionalOptional. Organization name printed in the seal text, for example ABC Pvt Ltd.nullable
- sealTypeinteger (int32)optionalOptional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.nullable
- secondPartyobjectrequiredPrimary party details (First Party / Second Party) for NeSL stamp request. PAN is mandatory. OVD is not accepted for these parties.
14 fields
- namestringrequiredRequired. Full legal name of the party (entity or individual). Max Length: 100.minLength 0maxLength 100default John Doe
- signerNamestringoptionalOptional. Name of the individual who signs on behalf of a company or entity (e.g. "Jane Doe"). Shown in the signature box instead of name. Max Length: 100.nullableminLength 0maxLength 100
- emailstring (email)requiredRequired. Valid email address of the party. Must be different from every other party in the request (case-insensitive).minLength 1default john.doe@gmail.com
- phonestringrequiredRequired. Mobile number of the party. Must be exactly 10 digits.length 10pattern ^\d{10}$default 1234567890
- panstringrequiredRequired. PAN card number in the format AAAAA9999A (5 uppercase letters, 4 digits, 1 uppercase letter), e.g. "ABCDE1234F". Must be different from every other party in the request.minLength 1pattern ^[A-Z]{5}[0-9]{4}[A-Z]{1}$default ABCDE1234F
- pinstringconditionalConditional: required when stateCode is WB or MP. Postal PIN code, exactly 6 digits. Optional for other states.nullablepattern ^\d{6}$
- doistring (date-time)requiredRequired. Date of incorporation (for an entity) or date of birth (for an individual), as an ISO 8601 date, e.g. "1990-01-15".
- signTypearray<string>requiredRequired. Signing methods allowed for this party, at least one. Send each value as a separate array item. Allowed values (case-sensitive): "Aadhaar", "Electronic", "DSC".default ["Electronic"]
- aadhaarVerificationOptionsobjectoptionalNo description.
5 fields
- verifyInviteebooleanoptionalOptional. Set to true to have the signer's Aadhaar details cross-checked before Aadhaar signing. Default: false. When false, the other fields in this object are ignored.
- dateOfBirthstringconditionalConditional: needed when verifyInvitee is true. Date of birth as registered in Aadhaar. Format: YYYY-MM-DD, e.g. "1990-07-15". Other formats are rejected.nullable
- lastFourDigitOfAadhaarstringconditionalConditional: needed when verifyInvitee is true. Last 4 digits of the signer's Aadhaar number, as a string, e.g. "4321". Exactly 4 digits.nullable
- genderstringconditionalConditional: needed when verifyInvitee is true. Gender as registered in Aadhaar: "Male" or "Female" (case-insensitive; "M" and "F" are also accepted).nullable
- verifyNamebooleanoptionalOptional. Accepted but not applied to NeSL signing; the signer's name is not verified against Aadhaar. Default: false.
- signAppearanceinteger (int32)optionalPosition of signature on the page. Top_Left (1) = top-left corner, Top_Right (2) = top-right corner, Bottom_Left (3) = bottom-left corner, Bottom_Right (4) = bottom-right corner, PageCoordinates (5) = custom coordinates defined in PageCoordinates property.values: 1 | 2 | 3 | 4 | 5
- pageToBeSignedinteger (int32)optionalDefines which pages of the document should be signed. FIRST (1) = first page only, LAST (2) = last page only, EVEN (3) = even-numbered pages, ODD (4) = odd-numbered pages, ALL (5) = all pages (default), SPECIFY (6) = specific pages defined in PageNumber property (e.g. "1-2-3"), NONE (7) = no pages.values: 1 | 2 | 3 | 4 | 5 | 6
- pageNumberstringconditionalConditional: required when pageToBeSigned is 6 (SPECIFY) and pageInfo is not provided. Comma-separated 1-based page numbers, e.g. "1,3,7".nullable
- pageInfoarray<object>optionalOptional. Manual signature box coordinates for this party. When provided, these boxes are used instead of automatic placement.nullable
Each item: 3 fields
- pageSizenumber (float)optionalOptional. Height of the PDF page in points.
- pageWidthnumber (float)optionalOptional. Width of the PDF page in points.
- pdfCoordinatesarray<object>requiredRequired. Signature boxes for this page entry. Each box applies to every page it names in pageNumber, or to all pages when page is "ALL".nullable
Each item: 6 fields
- pagestringoptionalOptional. Send "ALL" to use this box on every page. Otherwise leave empty and set pageNumber.nullable
- pageNumberstringconditionalConditional: required when page is not "ALL". Comma-separated 1-based page numbers where this box is placed, e.g. "1" or "1,3".nullable
- x1number (float)requiredRequired. Left position (X) of the signature box, in points from the left edge of the page.
- y1number (float)requiredRequired. Top position (Y) of the signature box, in points from the top edge of the page.
- x2number (float)requiredRequired. Width of the signature box, in points.
- y2number (float)requiredRequired. Height of the signature box, in points.
- signatorySealInfoobjectoptionalNo description.
2 fields
- namestringoptionalOptional. Organization name printed in the seal text, for example ABC Pvt Ltd.nullable
- sealTypeinteger (int32)optionalOptional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.nullable
- coBorrowersarray<object>optionalOptional. Additional signatories under the same role. Each needs a PAN or an OVD (ovdType and ovdValue), not both. signerName is not supported for co-borrowers. Omit or send null when there are none.nullable
Each item: 14 fields
- namestringrequiredRequired. Full legal name of the co-borrower. Max Length: 100.minLength 0maxLength 100default John Doe
- emailstring (email)requiredRequired. Valid email address of the co-borrower. Must be different from every other party in the request (case-insensitive).minLength 1default john.doe@gmail.com
- phonestringrequiredRequired. Mobile number. Must be exactly 10 digits.length 10pattern ^\d{10}$default 1234567890
- panstringconditionalConditional: required when ovdType and ovdValue are not sent. PAN in the format AAAAA9999A, e.g. "ABCDE1234F". Do not send both PAN and OVD. Must be different from every other party in the request.nullablepattern ^[A-Z]{5}[0-9]{4}[A-Z]{1}$
- ovdTypestringconditionalConditional: required, together with ovdValue, when pan is not sent. Allowed values (case-insensitive): "passport", "driving license", "voter id", "others".nullable
- ovdValuestringconditionalConditional: required, together with ovdType, when pan is not sent. Document number. passport: 1 letter + 7 digits; driving license: 2 letters + 13 digits (hyphens and spaces ignored); voter id: 3 letters + 7 digits; others: any non-empty value. Must be different from every other party's document number.nullable
- doistring (date-time)requiredRequired. Date of incorporation or date of birth, as an ISO 8601 date, e.g. "1990-01-15".
- signTypearray<string>requiredRequired. Signing methods allowed for this co-borrower, at least one. Send each value as a separate array item. Allowed values (case-sensitive): "Aadhaar", "Electronic", "DSC".default ["Electronic"]
- aadhaarVerificationOptionsobjectoptionalNo description.
5 fields
- verifyInviteebooleanoptionalOptional. Set to true to have the signer's Aadhaar details cross-checked before Aadhaar signing. Default: false. When false, the other fields in this object are ignored.
- dateOfBirthstringconditionalConditional: needed when verifyInvitee is true. Date of birth as registered in Aadhaar. Format: YYYY-MM-DD, e.g. "1990-07-15". Other formats are rejected.nullable
- lastFourDigitOfAadhaarstringconditionalConditional: needed when verifyInvitee is true. Last 4 digits of the signer's Aadhaar number, as a string, e.g. "4321". Exactly 4 digits.nullable
- genderstringconditionalConditional: needed when verifyInvitee is true. Gender as registered in Aadhaar: "Male" or "Female" (case-insensitive; "M" and "F" are also accepted).nullable
- verifyNamebooleanoptionalOptional. Accepted but not applied to NeSL signing; the signer's name is not verified against Aadhaar. Default: false.
- signAppearanceinteger (int32)optionalPosition of signature on the page. Top_Left (1) = top-left corner, Top_Right (2) = top-right corner, Bottom_Left (3) = bottom-left corner, Bottom_Right (4) = bottom-right corner, PageCoordinates (5) = custom coordinates defined in PageCoordinates property.values: 1 | 2 | 3 | 4 | 5
- pageToBeSignedinteger (int32)optionalDefines which pages of the document should be signed. FIRST (1) = first page only, LAST (2) = last page only, EVEN (3) = even-numbered pages, ODD (4) = odd-numbered pages, ALL (5) = all pages (default), SPECIFY (6) = specific pages defined in PageNumber property (e.g. "1-2-3"), NONE (7) = no pages.values: 1 | 2 | 3 | 4 | 5 | 6
- pageNumberstringconditionalConditional: required when pageToBeSigned is 6 (SPECIFY) and pageInfo is not provided. Comma-separated 1-based page numbers, e.g. "1,3,7".nullable
- pageInfoarray<object>optionalOptional. Manual signature box coordinates for this co-borrower. When provided, these boxes are used instead of automatic placement.nullable
Each item: 3 fields
- pageSizenumber (float)optionalOptional. Height of the PDF page in points.
- pageWidthnumber (float)optionalOptional. Width of the PDF page in points.
- pdfCoordinatesarray<object>requiredRequired. Signature boxes for this page entry. Each box applies to every page it names in pageNumber, or to all pages when page is "ALL".nullable
Each item: 6 fields
- pagestringoptionalOptional. Send "ALL" to use this box on every page. Otherwise leave empty and set pageNumber.nullable
- pageNumberstringconditionalConditional: required when page is not "ALL". Comma-separated 1-based page numbers where this box is placed, e.g. "1" or "1,3".nullable
- x1number (float)requiredRequired. Left position (X) of the signature box, in points from the left edge of the page.
- y1number (float)requiredRequired. Top position (Y) of the signature box, in points from the top edge of the page.
- x2number (float)requiredRequired. Width of the signature box, in points.
- y2number (float)requiredRequired. Height of the signature box, in points.
- signatorySealInfoobjectoptionalNo description.
2 fields
- namestringoptionalOptional. Organization name printed in the seal text, for example ABC Pvt Ltd.nullable
- sealTypeinteger (int32)optionalOptional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.nullable
- guarantorobjectoptionalParty details for NeSL stamp request including personal info and signing preferences.
15 fields
- namestringrequiredRequired. Full legal name of the party (entity or individual). Max Length: 100.minLength 0maxLength 100default John Doe
- signerNamestringoptionalOptional. Name of the individual who signs on behalf of a company or entity (e.g. "Jane Doe"). Shown in the signature box instead of name. Max Length: 100.nullableminLength 0maxLength 100
- emailstring (email)requiredRequired. Valid email address of the party. Must be different from every other party in the request (case-insensitive).minLength 1default john.doe@gmail.com
- phonestringrequiredRequired. Mobile number of the party. Must be exactly 10 digits.length 10pattern ^\d{10}$default 1234567890
- panstringconditionalConditional: required when ovdType and ovdValue are not sent. PAN in the format AAAAA9999A (5 uppercase letters, 4 digits, 1 uppercase letter), e.g. "ABCDE1234F". Do not send both PAN and OVD. Must be different from every other party in the request.nullablepattern ^[A-Z]{5}[0-9]{4}[A-Z]{1}$
- ovdTypestringconditionalConditional: required, together with ovdValue, when pan is not sent. Type of identity document. Allowed values (case-insensitive): "passport", "driving license", "voter id", "others".nullable
- ovdValuestringconditionalConditional: required, together with ovdType, when pan is not sent. Document number. Format by ovdType: passport is 1 letter + 7 digits (A1234567); driving license is 2 letters + 13 digits (hyphens and spaces are ignored); voter id is 3 letters + 7 digits (ABC1234567); others accepts any non-empty value. Must be different from every other party's document number.nullable
- doistring (date-time)requiredRequired. Date of incorporation (for an entity) or date of birth (for an individual), as an ISO 8601 date, e.g. "1990-01-15".
- signTypearray<string>requiredRequired. Signing methods allowed for this party, at least one. Send each value as a separate array item. Allowed values (case-sensitive): "Aadhaar", "Electronic", "DSC".default ["Electronic"]
- aadhaarVerificationOptionsobjectoptionalNo description.
5 fields
- verifyInviteebooleanoptionalOptional. Set to true to have the signer's Aadhaar details cross-checked before Aadhaar signing. Default: false. When false, the other fields in this object are ignored.
- dateOfBirthstringconditionalConditional: needed when verifyInvitee is true. Date of birth as registered in Aadhaar. Format: YYYY-MM-DD, e.g. "1990-07-15". Other formats are rejected.nullable
- lastFourDigitOfAadhaarstringconditionalConditional: needed when verifyInvitee is true. Last 4 digits of the signer's Aadhaar number, as a string, e.g. "4321". Exactly 4 digits.nullable
- genderstringconditionalConditional: needed when verifyInvitee is true. Gender as registered in Aadhaar: "Male" or "Female" (case-insensitive; "M" and "F" are also accepted).nullable
- verifyNamebooleanoptionalOptional. Accepted but not applied to NeSL signing; the signer's name is not verified against Aadhaar. Default: false.
- signAppearanceinteger (int32)optionalPosition of signature on the page. Top_Left (1) = top-left corner, Top_Right (2) = top-right corner, Bottom_Left (3) = bottom-left corner, Bottom_Right (4) = bottom-right corner, PageCoordinates (5) = custom coordinates defined in PageCoordinates property.values: 1 | 2 | 3 | 4 | 5
- pageToBeSignedinteger (int32)optionalDefines which pages of the document should be signed. FIRST (1) = first page only, LAST (2) = last page only, EVEN (3) = even-numbered pages, ODD (4) = odd-numbered pages, ALL (5) = all pages (default), SPECIFY (6) = specific pages defined in PageNumber property (e.g. "1-2-3"), NONE (7) = no pages.values: 1 | 2 | 3 | 4 | 5 | 6
- pageNumberstringconditionalConditional: required when pageToBeSigned is 6 (SPECIFY) and pageInfo is not provided. Comma-separated 1-based page numbers, e.g. "1,3,7".nullable
- pageInfoarray<object>optionalOptional. Manual signature box coordinates for this party. When provided, these boxes are used instead of automatic placement.nullable
Each item: 3 fields
- pageSizenumber (float)optionalOptional. Height of the PDF page in points.
- pageWidthnumber (float)optionalOptional. Width of the PDF page in points.
- pdfCoordinatesarray<object>requiredRequired. Signature boxes for this page entry. Each box applies to every page it names in pageNumber, or to all pages when page is "ALL".nullable
Each item: 6 fields
- pagestringoptionalOptional. Send "ALL" to use this box on every page. Otherwise leave empty and set pageNumber.nullable
- pageNumberstringconditionalConditional: required when page is not "ALL". Comma-separated 1-based page numbers where this box is placed, e.g. "1" or "1,3".nullable
- x1number (float)requiredRequired. Left position (X) of the signature box, in points from the left edge of the page.
- y1number (float)requiredRequired. Top position (Y) of the signature box, in points from the top edge of the page.
- x2number (float)requiredRequired. Width of the signature box, in points.
- y2number (float)requiredRequired. Height of the signature box, in points.
- signatorySealInfoobjectoptionalNo description.
2 fields
- namestringoptionalOptional. Organization name printed in the seal text, for example ABC Pvt Ltd.nullable
- sealTypeinteger (int32)optionalOptional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.nullable
- sequentialSigningbooleanoptionalOptional. When true (default), signers are invited one at a time in this order: firstParty, secondParty, coBorrowers, guarantor. When false, all signers are invited at the same time. Omit the field to use the default; do not send null.nullable
- stateCodestringrequiredRequired. Two-letter code of the state where the stamp duty is paid (case-insensitive). Accepted codes: AN, AP, AS, BR, CG, DN, DL, GA, GJ, HP, JK, JH, KA, KL, LA, MP, MH, MN, ML, OD, PY, PB, RJ, TN, TS, TR, UP, UK, WB. Call the states API for the list with state names.minLength 1default GJ
- additionalArticlesarray<object>requiredRequired. One entry per stamp certificate, with at least one entry. Each entry has its own first party name, second party name, payer, article code, amount and consideration price. The total of all amounts is debited from your NeSL wallet, so the wallet balance must cover it.
Each item: 7 fields
- firstPartyNamestringrequiredRequired. Name printed as the first party on this stamp certificate (usually the lender).minLength 1default John Doe
- secondPartyNamestringrequiredRequired. Name printed as the second party on this stamp certificate (the borrower, or the guarantor for a guarantee article).minLength 1default John Doe
- stampdutyPaidBystringrequiredRequired. Name of the party who pays the stamp duty. Must match this article's firstPartyName or secondPartyName (case-insensitive). The JSON field name is stampdutyPaidBy (lowercase "d").minLength 1default John Doe
- articleCodestringrequiredRequired. Article code for the document type, from the article-code API for the same stateCode (e.g., "003").minLength 1default 003
- amountnumber (double)requiredRequired. Stamp duty amount in INR. Must be greater than zero. Debited from your NeSL wallet.min 0.01default 200
- considerationPricestringrequiredRequired. Consideration price (value of the transaction) in INR for this article, sent as a string, e.g. "100000".minLength 1default 100000
- descriptionstringoptionalOptional. Short description of the transaction.nullable
- referenceIdstringrequiredRequired. Your unique reference for this request. 1 to 64 characters: letters, digits, hyphen (-) and underscore (_) only. A reference that was already used is rejected.minLength 0maxLength 64default nesl1234
- responseWebhookUrlstringoptionalOptional. URL that receives status callbacks for this request. If omitted, the webhook URL configured for your account is used.nullabledefault https://example.com/webhooks/nesl
- redirectUrlstringoptionalOptional. URL to redirect the signer to after signing is completed.nullabledefault https://example.com/signing-complete
- uiModebooleanoptionalOptional. When true, the request is created in a pending-review state and is NOT submitted to NeSL yet. The response will include a `uiUrl` (an anonymous, signed link) where the customer can review the document and adjust signer coordinates before confirming submission. Default: false (legacy direct flow).default false
Sample request body
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
5 fields
- eStampIdstringoptionalNo description.nullable
- documentIdstringoptionalNo description.nullable
- neSLURLstringoptionalNo description.nullable
- parallelSigningURLsarray<object>optionalNo description.nullable
Each item: 6 fields
- sequenceNumberinteger (int32)optionalNo description.nullable
- identificationNumberstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- emailIdstringoptionalNo description.nullable
- mobileNostringoptionalNo description.nullable
- urlstringoptionalNo description.nullable
- uiUrlstringoptionalPopulated only when the init request had `uiMode=true`. An anonymous signed URL where the customer can review the document and adjust signer coordinates before confirming submission. Null for the legacy direct-submission flow.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500
Code samplescurl · Node.js · Python
Downloads the signed documents and audit logs for a specific NeSL workflow. Returns workflow status, signatory details (including per-signer sign URL), and the stamped document as Base64.
SignatoriesInfo.SignUrl behaviour
| Scenario | SignUrl value |
|---|---|
| Signer's sign URL has been assigned (stamp initiated successfully, parallel signing) | Non-null URL string |
| Sequential signing — signer is not yet the active signer in the queue | null (URL assigned only when it becomes their turn) |
| Sign URL assignment failed during NeSL initiation | null |
| Signer has already completed signing | Non-null but URL is expired/consumed — check Status == "Signed" before using |
Recommended consumer logic: display the sign link only when signUrl != null AND status != "Signed".
Headers
- X-API-KEYstringrequiredYour secret API key for the environment you are calling (Stage and Live use different keys).
- X-API-APP-IDstringrequiredThe App ID issued together with the key.
Query parameters
- eStampIdstringoptionalRequired. Query parameter. The eStampId (a GUID) returned by the init API.
Responses
200OK
- successbooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 200
- messagestringoptionalNo description.nullabledefault XXXXX
- dataobjectoptionalNo description.
5 fields
- eStampIdstringoptionalNo description.nullable
- documentIdstringoptionalNo description.nullable
- workflowStatusstringoptionalNo description.nullable
- signatoriesInfoarray<object>optionalNo description.nullable
Each item: 7 fields
- emailIDstringoptionalNo description.nullable
- namestringoptionalNo description.nullable
- statusstringoptionalNo description.nullable
- remarksstringoptionalNo description.nullable
- signTypestringoptionalNo description.nullable
- signedDatestringoptionalNo description.nullable
- signUrlstringoptionalThe signing URL for this signer to complete their NeSL eStamp signature. <b>Non-null</b> when the signing URL has been successfully assigned after NeSL initiation (parallel signing mode). <b>Null</b> when: (1) sequential signing and it is not yet this signer's turn, or (2) URL assignment failed during initiation. Even when non-null, the URL may be expired if `Status == "Signed"` — always check status before presenting the link.nullable
- fileListarray<object>optionalNo description.nullable
Each item: 2 fields
- documentNamestringoptionalNo description.nullable
- base64FileDatastringoptionalNo description.nullable
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- isBillablebooleanoptionalWhether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
400Bad Request
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 400
401Unauthorized
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 401
500Internal Server Error
- dataobjectoptionalNo description.
- messagesarray<string>optionalNo description.nullable
- request_idstringoptionalNo description.nullable
- successbooleanoptionalNo description.default false
- messagestringoptionalNo description.nullabledefault XXXXX
- isBillablebooleanoptionalNo description.
- statusCodeinteger (int32)optionalNo description.default 500