Template Management API

7 endpoints · Core API

The Template Management API allows users to create, retrieve, preview, and manage document templates dynamically. It enables reusable document structures with variable data placeholders, helping organizations automate document generation workflows, such as contracts, onboarding forms, or agreements.

Benefits

  • Reusable Templates
    Define once, use many times for standardized documents.
  • Dynamic Content
    Supports variable insertion into templates for personalized documents.
  • Preview Support
    Generate real-time previews before sending or signing.
  • Streamlined Document Generation
    Reduces manual effort in document creation.

What you can do

  • Create or upload new document templates
  • Preview filled templates with dynamic data
  • Fetch existing templates for document generation
  • Render a template to a PDF from field values alone

Two flows share these templates

Template render you just need the file. POST /template/render takes a template id and its field values and returns the filled PDF as base64. No signers are accepted, no document is created and no signing workflow starts. Charged as a Template API call, the same rate as /template/request. A validation error, an unknown template or an insufficient balance is not charged.

Template + Signer the document has to be signed. POST /template/preview renders it with the signer list so you can check it first, then POST /template/request creates the document and sends it for signature. Use these two together whenever a signature is the point.

Three flows share these templates. Pick the one that matches your use case.

A template is a reusable Word document with named placeholders. You send the values, SignCare fills them in. What differs is whether a signature is involved.

  • Template + Signer flow — the filled document has to be signed. Preview it, then send it for signature.
  • Template + eStamp + Signer flow — the document has to carry a SHCIL e-stamp and be signed. One request buys the stamp, creates the signing document and invites the signers.
  • Template render — you just need the file. No signers, no signing workflow, nothing created on the SignCare side.

Choosing an endpoint

EndpointFlowWhat you get backSignersCreates a document
POST /api/v1/Template/renderTemplate renderThe filled PDF, as base64Not acceptedNo
POST /api/v1/Template/previewTemplate + SignerThe filled PDF, as base64Part of the requestNo
POST /api/v1/Template/requestTemplate + SignerA document id + signing detailsRequiredYes — invites are sent
POST /api/v1/Template/request with shcilStampInfoTemplate + eStamp + SignerThe stamp and signing details in the same response (up to about 40 seconds), otherwise a 202 and the result from the status APIRequiredYes — the stamp is bought, then invites are sent
POST /api/v1/Template/request/statusTemplate + eStamp + SignerThe result of an earlier requestNot acceptedNo

Template render — when the document is the deliverable

Statements, receipts, certificates, sanction letters, filled-in forms — anything you are going to store, email or hand to a customer yourself. You send a template id and field values, you get a PDF back, and that is the whole interaction. No signer information is accepted and none is needed.

Template + Signer — when the document has to be signed

preview renders the document so you (or your user) can check it before committing. request then fills the same template, creates a document in your SignCare account, attaches the signers you name, and starts the signing workflow. Use these two together whenever a signature — Aadhaar, DSC or electronic — is the point.

Not sending the document for signature? Use /Template/render.

preview belongs to the signing flow: its request body carries the signer list you are about to send to, and it exists so you can check the document before request goes out.

If no signature is involved, render is the endpoint built for that — it takes template id and fields only, validates the values you send, and is not limited to templates created by the same user as the API key you are calling with.

Template + eStamp + Signer — when the document needs a SHCIL stamp

Some agreements must carry a SHCIL e-stamp before they are signed. Send the same POST /api/v1/Template/request you already use, and add a shcilStampInfo block. SignCare then buys the stamp, places it in the document, creates the signing document and invites the signers — in one request.

The call waits up to about 40 seconds for the stamp and the signing document:

  • Ready in time: the result comes back in the same response (200 OK).
  • Not ready in time: you get 202 Accepted and collect the result from the status API.
  • Webhook (optional): if you give a responseUrl, or one is configured for your account, the result is also delivered there.

Request

{
  "referenceId": "AGREEMENT-2026-0001",
  "templateId": "8f14e45f-ceea-467a-9f0a-1c2b3d4e5f60",
  "documentName": "Service Agreement",
  "signers": [
    {
      "userId": "d45cdb43-36d9-425f-8755-cd8432ca0968",
      "name": "Rahul Patel",
      "emailId": "rahul@example.com",
      "mobileNo": "9876543210",
      "signType": "Aadhaar",
      "order": 1
    },
    {
      "userId": "51456781-ec6f-4c11-ae59-3160f64beac6",
      "name": "Meera Shah",
      "emailId": "meera@example.com",
      "signType": "Electronic",
      "order": 2
    }
  ],
  "fields": [
    { "displayName": "Party Name", "required": false, "type": "Text", "fieldName": "{{var_PartyName}}", "fieldValue": "Rahul Patel" }
  ],
  "shcilStampInfo": {
    "firstPartyName": "Rahul Patel",
    "firstPartyMobile": "9876543210",
    "firstPartyPan": "ABCDE1234F",
    "secondPartyName": "Meera Shah",
    "secondPartyMobile": "9876543211",
    "stateCode": "AS",
    "articleCode": 42,
    "stampDutyAmount": 100,
    "stampDutyPaidBy": "Rahul Patel",
    "documentDescription": "Service Agreement"
  },
  "responseUrl": "https://your-server.example.com/signcare/callback"
}

referenceId — your own id for this request, 1 to 64 letters, digits, hyphens or underscores. It can be used once. A request that failed before a stamp was issued can be sent again with the same id.

signers[].userId — the signer position in the template, as returned by GET /api/v1/Template/get. Each position can be used only once.

responseUrl — optional. If you give one (or a webhook URL is configured for your account), the result is also delivered there. Without a webhook, use the response of this call or the status API.

shcilStampInfo fieldRequiredRules
stateCodeYesThe stateCode of the article you chose, from the Master Details API (see below).
articleCodeYesThe articleCode of a row in pdfArticles in the Master Details response. Rows in templateArticles do not work with this flow.
stampDutyAmountYesWhole rupees, at least the article's minimum duty.
stampDutyPaidByYesMust be exactly the first party's or second party's name.
firstPartyName, secondPartyNameAt least oneEnglish letters and spaces only, up to 200 characters.
firstPartyMobile, secondPartyMobileFor the party that paysExactly 10 digits.
firstPartyPan, secondPartyPanWhen the duty is above ₹2,00,000Valid PAN, for example ABCDE1234F.
considerationPriceNoNot negative.
documentDescriptionNoUp to 100 characters: letters, numbers and spaces only.

Choosing the state and the article

Take both values from the SHCIL Master Details API, GET /api/v1/StockHoldingEStamp/master-details. Its response has three lists:

ListWhat it is forUse it here?
statesThe states SHCIL stamping is available in.Yes — stateCode must be one of these.
pdfArticlesArticles stamped onto your own PDF. Every row has articleType set to CUSTOM.Yes — this is the only list to use.
templateArticlesArticles where SHCIL generates the document from fields. Every row has articleType set to SYSTEM.No. This flow sends your rendered template as a PDF. A request that uses one of these articles is rejected.
  1. Call the Master Details API.
  2. Choose the state from states.
  3. In pdfArticles, find the rows whose stateCode is that state and choose the article you need.
  4. Send that row's stateCode and articleCode in shcilStampInfo, exactly as listed. Another code that belongs to the same article, but is not listed in pdfArticles, is not accepted.

The same row tells you the rules for the rest of the request:

Field in the pdfArticles rowWhat it means for your request
minDuty, maxDutystampDutyAmount must be within this range.
bothPartyRequiredWhen true, send the name and mobile number of both parties (firstPartyName, firstPartyMobile, secondPartyName, secondPartyMobile).
stampDutyTypeWhen CONSIDERATION_PRICE, the duty depends on the transaction value: send considerationPrice. minConsiderationPrice and maxConsiderationPrice, when present, show the accepted range.
articleNameThe article's name, for display.
{
  "stateCode": "AS",
  "articleCode": 42,
  "articleName": "Agreement or Memorandum of an agreement - Agreements other than applicable under 5(a) and 5(b)",
  "minDuty": "100.0",
  "articleType": "CUSTOM",
  "bothPartyRequired": true
}

The Master Details API needs the SHCIL eStamp API to be enabled for your account. If it is not, the call is refused and you cannot look up articles.

Everything is checked before a stamp is bought

A request that fails any of these checks is rejected immediately with an error, and nothing is charged and no stamp is bought.

AreaWhat is checked
TemplateThe template id is valid and the template exists.
Reference idValid format, and not used before.
Document namePresent, valid characters, under 50 characters.
SignersAt least one signer. Each signer position belongs to the template and is used once. Name is valid. At least one of email or mobile number. Signature type, Aadhaar details and signing order are valid.
eSign accessThe eSign API is enabled for your account and subscribed, and your eSign wallet balance covers each signature type.
SHCIL detailsThe article is listed under pdfArticles (articleType CUSTOM) for that state. The duty is within the article's range. Both parties are given when the article requires it. PAN and mobile rules are met, and stampDutyPaidBy matches a party.
Names and descriptionParty names and the document description contain no special characters.
SHCIL walletThe balance covers this stamp plus all of your earlier stamps that are still in progress.

The response

How the call ends depends on how long the stamp takes:

OutcomeHTTP statusBody
Ready within about 40 seconds200 OKThe result, as shown under The result below
Failed within that timeThe error's own status, for example 400, 402 or 500The failure, as shown under When it failed below
Takes longer202 AcceptedThe accepted response shown next

The 202 Accepted response:

{
  "data": {
    "documentReferenceId": "AGREEMENT-2026-0001",
    "reconMappingId": "SCABCDEFGHIJKLMNOPQR",
    "status": "ACCEPTED"
  },
  "success": true,
  "statusCode": 202,
  "message": "Accepted. eStamp generation is taking longer than usual — fetch the stamped document and eSign links from the Template request status API using this referenceId. Do not retry this referenceId."
}

Keep documentReferenceId and reconMappingId; either one identifies this request later. Sending the same referenceId again while it is in progress waits for that same request and returns its result, or this same 202. It does not create a second stamp.

The result

The result body is the same in all three places: the 200 response, the status API and the webhook.

A webhook is an HTTP POST, and the x-signcare-event header tells you which result it is:

x-signcare-eventMeaning
TEMPLATE_ESTAMP_ESIGN_CREATEDThe stamp was issued and the signing document was created.
TEMPLATE_ESTAMP_ESIGN_FAILEDThe request failed after it was accepted.

When it succeeded

{
  "data": {
    "documentId": "01a13924-c53e-7730-a227-e04af1adfa17",
    "documentReferenceId": "AGREEMENT-2026-0001",
    "responseTimeStamp": "14-10-2026 06:41:13",
    "userInfo": [
      {
        "userRefId": "d45cdb43-36d9-425f-8755-cd8432ca0968",
        "userId": "fa6f7481-e512-44a5-a969-81392925de96",
        "docSignerId": "d0e36467-ee3c-4766-982d-df654591851f",
        "esignLink": "https://sign.example.com/sign/d0e36467-ee3c-4766-982d-df654591851f/rahul@example.com"
      },
      {
        "userRefId": "51456781-ec6f-4c11-ae59-3160f64beac6",
        "userId": "e21be59a-19c0-44de-b841-92fe48e3283d",
        "docSignerId": "892e587c-f847-4e04-984c-d2a493782459",
        "esignLink": "https://sign.example.com/sign/892e587c-f847-4e04-984c-d2a493782459/meera@example.com"
      }
    ],
    "uiModeURL": "",
    "stampDetails": {
      "eStampId": "943cdb8f-7ae2-4005-99c5-282de8cb7282",
      "reconMappingId": "SCABCDEFGHIJKLMNOPQR",
      "userDocumentId": 120886,
      "certId": "IN-AS00363558894070Y",
      "urn": "AS1004DIGID2026287376478ASAC",
      "certificateNo": "IN-AS00363558894070Y",
      "certificateIssuedDate": "14-Oct-2026 12:11 PM"
    }
  },
  "success": true,
  "statusCode": 200
}

The signers also receive their signing link by email or SMS. Later signing updates for the same document (signed, rejected, expired) are delivered through the usual eSign webhook.

When it failed

{
  "data": {
    "documentReferenceId": "AGREEMENT-2026-0001",
    "reconMappingId": "SCABCDEFGHIJKLMNOPQR",
    "status": "FAILED"
  },
  "success": false,
  "statusCode": 400,
  "message": "Insufficient StockHolding wallet balance. The stamp was not generated and nothing was charged. Recharge the wallet and submit the request again."
}

message gives the reason. If the stamp had already been issued before the failure, data.stampDetails is included — quote it to support so the stamp can be recovered. Otherwise nothing was charged, and you can send the request again with the same referenceId. Once a stamp has been issued, that referenceId cannot be reused.

Checking a result — POST /api/v1/Template/request/status

Use this API when the call returned 202, or when you do not use a webhook. It returns the same body that the 200 response carries, or that would be sent to your responseUrl.

  • It answers 200 for a finished request, including a failed one. Read success and statusCode in the body.
  • Suggested schedule after a 202: after 30 seconds, 1 minute and 5 minutes, then every 15 minutes.
  • It is free, and it only shows requests made with your own account.
{
  "documentReferenceId": "AGREEMENT-2026-0001"
}

Send documentReferenceId, reconMappingId, or both. If you send both they must belong to the same request.

HTTP statusMeaningWhat you receive
202The request is still in progress.The same slim body as the original 202. Check again shortly.
200The request has finished.The success body, or the failure body — read success, statusCode and message, exactly as in the webhook.
400Neither id was sent, an id is invalid, or the two ids belong to different requests.An error message.
401The API key is missing or invalid.An error message.
402The Template API is not available to your account.An error message.
404No such request for your account.An error message.

A request that has been found always answers with a successful lookup. For a request that failed, the failure code and the reason are in the response body, not in the HTTP status.

The documentId in a successful response is the id you need for the other eSign APIs, such as POST /api/v1/esign/status.

If the result has not arrived after a few minutes, check the status. A suggested schedule is after 30 seconds, 1 minute and 5 minutes, then every 15 minutes.

Billing and wallets

ItemWhen it is charged
Stamp duty and any service chargeDebited from your SHCIL stamp wallet when the stamp is issued. Nothing is debited if the request is rejected or fails before the stamp is issued.
Template API callBilled as a Template API call when the signing document is created.
eSignBilled as for any eSign request, according to your eSign pricing.

Keep enough balance for the stamp and for any earlier stamps still in progress. A request is rejected if the wallet cannot cover them.

Things to know

  • A stamp that SHCIL has not completed yet keeps the request in progress. The signing document is created automatically when SHCIL completes the stamp, and the result is then delivered.
  • Do not submit the same referenceId again while a request is in progress. Wait for the result, or check the status.
  • Party names accept English letters and spaces only, because SHCIL does not accept special characters.

Rendering a document

{
  "templateId": "8f14e45f-ceea-467a-9f0a-1c2b3d4e5f60",
  "documentName": "Sanction Letter - Rahul Patel",
  "fields": [
    { "displayName": "Borrower Name", "fieldName": "borrower_name", "type": "text", "fieldValue": "Rahul Patel" },
    { "displayName": "Sanction Amount", "fieldName": "sanction_amount", "type": "number", "fieldValue": "450000" },
    { "displayName": "Sanction Date", "fieldName": "sanction_date", "type": "date", "fieldValue": "2026-08-26" }
  ]
}

data in the response is the finished PDF, base64-encoded. Decode it and write it to a file — there is nothing further to poll or fetch.

templateId — required. The template id (GUID) from GET /api/v1/Template/get, which also returns each template's field definitions so you know what to send.

documentName — optional. Names the generated PDF; defaults to the template's own name.

fields — required, with at least one entry, when the template declares fields. Copy each field's displayName, fieldName and type exactly as returned by GET /api/v1/Template/get, and add fieldValue. All three are required on every entry; a request that leaves one out is rejected with a 400. The value is placed in the document by fieldName; the required-field and type checks use displayName. Matching is case-insensitive. You may leave out optional fields. (request is stricter — it expects one entry for every field the template declares.)

Send fieldValue as a string. Date values must parse as a date (for example 2026-08-26) and number values as a number (for example 450000).

Field values are validated

A field declared as date must parse as a date, a field declared as number must parse as a number, and a field marked required must carry a non-empty value. If any of these fail you get a 400 naming the field, and the call is not charged.

Billing

render is charged as a Template API call — the same rate as /Template/request. Rendering a PDF and creating a full signature request cost the same. Budget accordingly if you are generating documents in volume.

You are charged only when a PDF is actually produced. None of these cost anything:

  • a validation error on your field values (400)
  • a template id that does not exist (404)
  • an insufficient wallet balance (402)

Limits

render is rate limited to 50 requests per minute per API key + IP. Large templates take longer to render than small ones; a request is answered when the PDF is complete, so allow a generous client-side timeout for long documents.

GET

/api/v1/Template/get

#

Lists the templates created by the user that owns your API key, with their signers and field definitions.

docs.signcare.io/core/api/document-services/template-management-api/#get-api-v1-template-get

Takes no parameters. Use the templateId, signer userId values and field fieldName, displayName and type values from this response when calling render, preview and request.

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    array<object>optional
    No description.
    nullable
    Each item: 4 fields
    • templateId
      stringoptional
      No description.
      nullable
    • templatenName
      stringoptional
      No description.
      nullable
    • signers
      array<object>optional
      No description.
      nullable
      Each item: 9 fields
      • userId
        stringrequired
        Required. Signer id from the template, as returned by GET /api/v1/Template/get. Must be a GUID that belongs to the template.
        nullable
      • name
        stringrequired
        Required. Full name of the signer: letters, digits, spaces and , @ _ . ' - ( ) [ ].
        nullable
      • emailId
        stringconditional
        Conditional: required when mobileNo is not sent. Email address of the signer. At least one of emailId / mobileNo must be present per signer; the signature-create handler enforces that, and rejects a malformed address.
        nullable
      • mobileNo
        stringconditional
        Conditional: required when emailId is not sent. 10-digit mobile number of the signer, digits only, used instead of emailId when the signer has no email address — the invitation and the sign OTP then go by SMS. At least one of emailId / mobileNo must be present per signer.
        nullable
      • signType
        stringrequired
        Required. Signature method: Electronic, Aadhaar or Digital (case-sensitive).
        nullable
      • order
        integer (int32)optional
        Optional. Signing order position, starting at 1. Defaults to 0. Signing order is not currently enforced.
      • electronicOptions
        objectoptional
        No description.
        5 fields
        • canDraw
          booleanoptional
          No description.
        • canType
          booleanoptional
          No description.
        • canUpload
          booleanoptional
          No description.
        • captureGPSLocation
          booleanoptional
          No description.
        • capturePhoto
          booleanoptional
          No description.
      • aadhaarInfo
        objectoptional
        No description.
        3 fields
        • birthYear
          stringoptional
          No description.
          nullable
        • lastFourDigitOfAadhaar
          stringoptional
          No description.
          nullable
        • gender
          stringoptional
          No description.
          nullable
      • signatorySealInfo
        objectoptional
        No description.
        2 fields
        • name
          stringoptional
          Optional. Organization name printed in the seal text, for example ABC Pvt Ltd.
          nullable
        • sealType
          integer (int32)optional
          Optional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.
          nullable
    • templateFields
      array<object>optional
      No description.
      nullable
      Each item: 22 fields
      • displayName
        stringrequired
        Required. Field label, exactly as returned by GET /api/v1/Template/get. Used for the required-field and type checks (case-insensitive).
        nullable
      • required
        booleanoptional
        Optional. Whether the field is mandatory. The template's own setting is what is enforced; defaults to false.
      • type
        stringrequired
        Required. Field type, exactly as returned by GET /api/v1/Template/get (for example text, date, number, image).
        nullable
      • fieldName
        stringrequired
        Required. Placeholder name in the template document, exactly as returned by GET /api/v1/Template/get. The value is placed by this name (case-insensitive).
        nullable
      • fieldValue
        stringconditional
        Conditional: required when the template marks the field as required. Value to fill in, as a string. Date values must parse as a date and number values as a number.
        nullable
      • imageWidth
        number (float)optional
        No description.
        nullable
      • imageHeight
        number (float)optional
        No description.
        nullable
      • imageBorder
        booleanoptional
        No description.
        nullable
      • boxCount
        integer (int32)optional
        Boxed fields only: how many character boxes the template reserves. Left null the renderer derives it from the table row the marker sits in, which is the usual case — the form itself is the source of truth for how many boxes exist.
        nullable
      • uppercase
        booleanoptional
        Force the value to upper case. Forms that say "BLOCK LETTERS" want this.
        nullable
      • spacePolicy
        stringoptional
        "blank" (a space occupies a box) or "skip" (spaces are dropped).
        nullable
      • overflowPolicy
        stringoptional
        "reject" (default) or "truncate" when the value needs more boxes than exist.
        nullable
      • dateFormat
        stringoptional
        Date fields: .NET format string applied to the parsed value, e.g. "dd/MM/yyyy".
        nullable
      • decimalPlaces
        integer (int32)optional
        No description.
        nullable
      • thousandSeparator
        booleanoptional
        No description.
        nullable
      • options
        array<string>optional
        Checkbox: the options in the group — one marker is authored per option, and the field's value selects which of them is ticked.
        nullable
      • checkedMark
        stringoptional
        Glyph written into a ticked box. Defaults to a check mark "✓".
        nullable
      • checkedMarkFont
        stringoptional
        Font for the tick. Null inherits the surrounding text's font, which may not carry the check-mark glyph — set a font with symbol coverage if a tick renders as a hollow box.
        nullable
      • multiSelect
        booleanoptional
        Checkbox groups: allow more than one option to be ticked.
        nullable
      • displayTag
        stringoptional
        Layout types: the single character the editor shows at the field's anchor so the author can see it is there. Author-chosen, defaults to "▫". Stripped before the value is placed, so it never appears in the rendered document.
        nullable
      • maxLength
        integer (int32)optional
        Value types: reject a value longer than this before the document is created.
        nullable
      • pattern
        stringoptional
        Value types: regular expression the value must match (PAN, IFSC, Aadhaar...).
        nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": [ { "templateId": "string", "templatenName": "string", "signers": [ { "userId": "string", "name": "string", "emailId": "string", "mobileNo": "string", "signType": "string", "order": 0, "electronicOptions": { "canDraw": false, "canType": false, "canUpload": false, "captureGPSLocation": false, "capturePhoto": false }, "aadhaarInfo": { "birthYear": "string", "lastFourDigitOfAadhaar": "string", "gender": "string" }, "signatorySealInfo": { "name": "string", "sealType": 0 } } ], "templateFields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ] } ], "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X GET 'https://uat-ext.signcare.io/api/v1/Template/get' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID'
POST

/api/v1/Template/preview

#

Renders a template with your field values and returns the PDF as base64, without creating a document.

docs.signcare.io/core/api/document-services/template-management-api/#post-api-v1-template-preview

Part of the Template + Signer flow. The request must include a signers array, but signers do not change the PDF. Only templates created by the user that owns the API key can be previewed. Required fields and field types are not checked here; they are checked by request.

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • templateId
    stringrequired
    Required. Identifier (GUID) of the template to preview, as returned by GET /api/v1/Template/get. Only templates created by the user that owns the API key can be previewed.
    nullable
  • documentName
    stringrequired
    Required. Name of the document for the preview. The preview PDF is named after the template; this value is not used for the file.
    nullable
  • signers
    array<object>required
    Required. Array of signers; it must be present but may be empty. Signers do not change the preview PDF. Each signer needs userId, name and signType.
    nullable
    Each item: 9 fields
    • userId
      stringrequired
      Required. Signer id from the template, as returned by GET /api/v1/Template/get. Must be a GUID that belongs to the template.
      nullable
    • name
      stringrequired
      Required. Full name of the signer: letters, digits, spaces and , @ _ . ' - ( ) [ ].
      nullable
    • emailId
      stringconditional
      Conditional: required when mobileNo is not sent. Email address of the signer. At least one of emailId / mobileNo must be present per signer; the signature-create handler enforces that, and rejects a malformed address.
      nullable
    • mobileNo
      stringconditional
      Conditional: required when emailId is not sent. 10-digit mobile number of the signer, digits only, used instead of emailId when the signer has no email address — the invitation and the sign OTP then go by SMS. At least one of emailId / mobileNo must be present per signer.
      nullable
    • signType
      stringrequired
      Required. Signature method: Electronic, Aadhaar or Digital (case-sensitive).
      nullable
    • order
      integer (int32)optional
      Optional. Signing order position, starting at 1. Defaults to 0. Signing order is not currently enforced.
    • electronicOptions
      objectoptional
      No description.
      5 fields
      • canDraw
        booleanoptional
        No description.
      • canType
        booleanoptional
        No description.
      • canUpload
        booleanoptional
        No description.
      • captureGPSLocation
        booleanoptional
        No description.
      • capturePhoto
        booleanoptional
        No description.
    • aadhaarInfo
      objectoptional
      No description.
      3 fields
      • birthYear
        stringoptional
        No description.
        nullable
      • lastFourDigitOfAadhaar
        stringoptional
        No description.
        nullable
      • gender
        stringoptional
        No description.
        nullable
    • signatorySealInfo
      objectoptional
      No description.
      2 fields
      • name
        stringoptional
        Optional. Organization name printed in the seal text, for example ABC Pvt Ltd.
        nullable
      • sealType
        integer (int32)optional
        Optional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.
        nullable
  • fields
    array<object>required
    Required. Field values to fill in. Each entry needs displayName, fieldName and type exactly as returned by GET /api/v1/Template/get, plus fieldValue. Values are placed by fieldName. Preview does not check required fields or value types.
    nullable
    Each item: 22 fields
    • displayName
      stringrequired
      Required. Field label, exactly as returned by GET /api/v1/Template/get. Used for the required-field and type checks (case-insensitive).
      nullable
    • required
      booleanoptional
      Optional. Whether the field is mandatory. The template's own setting is what is enforced; defaults to false.
    • type
      stringrequired
      Required. Field type, exactly as returned by GET /api/v1/Template/get (for example text, date, number, image).
      nullable
    • fieldName
      stringrequired
      Required. Placeholder name in the template document, exactly as returned by GET /api/v1/Template/get. The value is placed by this name (case-insensitive).
      nullable
    • fieldValue
      stringconditional
      Conditional: required when the template marks the field as required. Value to fill in, as a string. Date values must parse as a date and number values as a number.
      nullable
    • imageWidth
      number (float)optional
      No description.
      nullable
    • imageHeight
      number (float)optional
      No description.
      nullable
    • imageBorder
      booleanoptional
      No description.
      nullable
    • boxCount
      integer (int32)optional
      Boxed fields only: how many character boxes the template reserves. Left null the renderer derives it from the table row the marker sits in, which is the usual case — the form itself is the source of truth for how many boxes exist.
      nullable
    • uppercase
      booleanoptional
      Force the value to upper case. Forms that say "BLOCK LETTERS" want this.
      nullable
    • spacePolicy
      stringoptional
      "blank" (a space occupies a box) or "skip" (spaces are dropped).
      nullable
    • overflowPolicy
      stringoptional
      "reject" (default) or "truncate" when the value needs more boxes than exist.
      nullable
    • dateFormat
      stringoptional
      Date fields: .NET format string applied to the parsed value, e.g. "dd/MM/yyyy".
      nullable
    • decimalPlaces
      integer (int32)optional
      No description.
      nullable
    • thousandSeparator
      booleanoptional
      No description.
      nullable
    • options
      array<string>optional
      Checkbox: the options in the group — one marker is authored per option, and the field's value selects which of them is ticked.
      nullable
    • checkedMark
      stringoptional
      Glyph written into a ticked box. Defaults to a check mark "✓".
      nullable
    • checkedMarkFont
      stringoptional
      Font for the tick. Null inherits the surrounding text's font, which may not carry the check-mark glyph — set a font with symbol coverage if a tick renders as a hollow box.
      nullable
    • multiSelect
      booleanoptional
      Checkbox groups: allow more than one option to be ticked.
      nullable
    • displayTag
      stringoptional
      Layout types: the single character the editor shows at the field's anchor so the author can see it is there. Author-chosen, defaults to "▫". Stripped before the value is placed, so it never appears in the rendered document.
      nullable
    • maxLength
      integer (int32)optional
      Value types: reject a value longer than this before the document is created.
      nullable
    • pattern
      stringoptional
      Value types: regular expression the value must match (PAN, IFSC, Aadhaar...).
      nullable
Sample request body
{ "templateId": "string", "documentName": "string", "signers": [ { "userId": "string", "name": "string", "emailId": "string", "mobileNo": "string", "signType": "string", "order": 0, "electronicOptions": { "canDraw": false, "canType": false, "canUpload": false, "captureGPSLocation": false, "capturePhoto": false }, "aadhaarInfo": { "birthYear": "string", "lastFourDigitOfAadhaar": "string", "gender": "string" }, "signatorySealInfo": { "name": "string", "sealType": 0 } } ], "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ] }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    stringoptional
    No description.
    nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": "string", "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Requestsame body as 200
401Unauthorizedsame body as 200
500Internal Server Errorsame body as 200
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/Template/preview' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "templateId": "string", "documentName": "string", "signers": [ { "userId": "string", "name": "string", "emailId": "string", "mobileNo": "string", "signType": "string", "order": 0, "electronicOptions": { "canDraw": false, "canType": false, "canUpload": false, "captureGPSLocation": false, "capturePhoto": false }, "aadhaarInfo": { "birthYear": "string", "lastFourDigitOfAadhaar": "string", "gender": "string" }, "signatorySealInfo": { "name": "string", "sealType": 0 } } ], "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ] }'
POST

/api/v1/Template/render

#

Renders a template to a PDF from field values alone and returns it as base64. This is the template-render flow: document generation with no signer association at all. No signers are accepted, no document is created and no signing workflow starts. The Template + Signer flow is separate and unchanged — `/preview` renders a document together with its signer list so it can be checked, and `/request` then creates it and sends it for signature. Billed as a Template API call, the same as `/request`: it checks the wallet and debits on success. A validation error, an unknown template or an empty wallet costs nothing. Rate limited on the client+IP bucket (50/min) rather than the 1-per-5-minutes default: that default exists to throttle per-call provider cost, and rendering calls no provider.

docs.signcare.io/core/api/document-services/template-management-api/#post-api-v1-template-render

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • templateId
    stringrequired
    Required. Identifier (GUID) of the template to render, as returned by GET /api/v1/Template/get.
    nullable
  • documentName
    stringoptional
    Optional. Name of the generated PDF. Defaults to the template's own name.
    nullable
  • fields
    array<object>conditional
    Conditional: required, with at least one entry, when the template declares fields. Field values to fill in. Each entry needs displayName, fieldName and type exactly as returned by GET /api/v1/Template/get, plus fieldValue. Values are placed by fieldName; required and type (date, number) checks use displayName. You may leave out optional fields.
    nullable
    Each item: 22 fields
    • displayName
      stringrequired
      Required. Field label, exactly as returned by GET /api/v1/Template/get. Used for the required-field and type checks (case-insensitive).
      nullable
    • required
      booleanoptional
      Optional. Whether the field is mandatory. The template's own setting is what is enforced; defaults to false.
    • type
      stringrequired
      Required. Field type, exactly as returned by GET /api/v1/Template/get (for example text, date, number, image).
      nullable
    • fieldName
      stringrequired
      Required. Placeholder name in the template document, exactly as returned by GET /api/v1/Template/get. The value is placed by this name (case-insensitive).
      nullable
    • fieldValue
      stringconditional
      Conditional: required when the template marks the field as required. Value to fill in, as a string. Date values must parse as a date and number values as a number.
      nullable
    • imageWidth
      number (float)optional
      No description.
      nullable
    • imageHeight
      number (float)optional
      No description.
      nullable
    • imageBorder
      booleanoptional
      No description.
      nullable
    • boxCount
      integer (int32)optional
      Boxed fields only: how many character boxes the template reserves. Left null the renderer derives it from the table row the marker sits in, which is the usual case — the form itself is the source of truth for how many boxes exist.
      nullable
    • uppercase
      booleanoptional
      Force the value to upper case. Forms that say "BLOCK LETTERS" want this.
      nullable
    • spacePolicy
      stringoptional
      "blank" (a space occupies a box) or "skip" (spaces are dropped).
      nullable
    • overflowPolicy
      stringoptional
      "reject" (default) or "truncate" when the value needs more boxes than exist.
      nullable
    • dateFormat
      stringoptional
      Date fields: .NET format string applied to the parsed value, e.g. "dd/MM/yyyy".
      nullable
    • decimalPlaces
      integer (int32)optional
      No description.
      nullable
    • thousandSeparator
      booleanoptional
      No description.
      nullable
    • options
      array<string>optional
      Checkbox: the options in the group — one marker is authored per option, and the field's value selects which of them is ticked.
      nullable
    • checkedMark
      stringoptional
      Glyph written into a ticked box. Defaults to a check mark "✓".
      nullable
    • checkedMarkFont
      stringoptional
      Font for the tick. Null inherits the surrounding text's font, which may not carry the check-mark glyph — set a font with symbol coverage if a tick renders as a hollow box.
      nullable
    • multiSelect
      booleanoptional
      Checkbox groups: allow more than one option to be ticked.
      nullable
    • displayTag
      stringoptional
      Layout types: the single character the editor shows at the field's anchor so the author can see it is there. Author-chosen, defaults to "▫". Stripped before the value is placed, so it never appears in the rendered document.
      nullable
    • maxLength
      integer (int32)optional
      Value types: reject a value longer than this before the document is created.
      nullable
    • pattern
      stringoptional
      Value types: regular expression the value must match (PAN, IFSC, Aadhaar...).
      nullable
Sample request body
{ "templateId": "string", "documentName": "string", "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ] }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    stringoptional
    No description.
    nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": "string", "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/Template/render' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "templateId": "string", "documentName": "string", "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ] }'
POST

/api/v1/Template/design

#

Creates or updates a template — the authoring counterpart to the endpoints above, which only consume templates that already exist. Rate limited on the client+IP bucket (50/min), not the default 1-per-5-minutes used for verification calls: this is a person clicking Save in a designer, and the provider-cost reasoning behind the tight default does not apply.

docs.signcare.io/core/api/document-services/template-management-api/#post-api-v1-template-design

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • templateId
    string (uuid)optional
    Optional. Omit to create a new template; send an existing template id (GUID) to update that template in place.
    nullable
  • name
    stringrequired
    Required. Template name. It must be unique among your templates (not case-sensitive); a duplicate returns 400.
    nullable
  • document
    objectoptional
    No description.
    5 fields
    • fileName
      stringrequired
      Required. File name of the document, for example offer-letter.docx.
      nullable
    • extension
      stringoptional
      Optional. File extension including the dot. Defaults to `.docx`.
      nullable
    • data
      stringrequired
      Required. Base64 of the file, WITHOUT a data-URL prefix.
      nullable
    • fileLocation
      stringoptional
      Optional. Ignored; the storage location is set by the server.
      nullable
    • fileSize
      integer (int32)optional
      Optional. File size in bytes. Not used.
  • users
    array<object>optional
    Optional. Signers, in signing order, each carrying their signature positions.
    nullable
    Each item: 5 fields
    • orderNo
      integer (int32)optional
      Optional. Position of the signer in the signing order, starting at 1. Defaults to 0.
    • userId
      string (uuid)required
      Required. Id (GUID) that identifies this signer within the template. Use this same id as signers[].userId when creating a document from the template.
    • name
      stringrequired
      Required. Name of the signer role or person.
      nullable
    • signType
      stringoptional
      Optional. SignType as a string: 1 Electronic, 2 Aadhaar, 3 Digital (DSC).
      nullable
    • pDFPages
      array<object>optional
      No description.
      nullable
      Each item: 4 fields
      • pageNumber
        integer (int32)optional
        No description.
      • pageSize
        number (float)optional
        Page HEIGHT in points. The name is historical.
      • pageWidth
        number (float)optional
        No description.
      • pdfCoordinates
        array<object>optional
        No description.
        nullable
        Each item: 4 fields
        • x1
          number (float)optional
          No description.
        • x2
          number (float)optional
          No description.
        • y1
          number (float)optional
          No description.
        • y2
          number (float)optional
          No description.
  • fields
    stringoptional
    Optional. The field definitions, as a JSON ARRAY IN A STRING — not an object. Each entry needs a unique fieldName; duplicate fieldName values return 400. SignCare stores this blob verbatim, which is what lets a caller keep its own metadata (e.g. which workflow step fills a field) alongside the fields themselves.
    nullable
  • departmentId
    stringoptional
    Optional. Department the template belongs to.
    nullable
Sample request body
{ "templateId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "string", "document": { "fileName": "string", "extension": "string", "data": "string", "fileLocation": "string", "fileSize": 0 }, "users": [ { "orderNo": 0, "userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "string", "signType": "string", "pDFPages": [ { "pageNumber": 0, "pageSize": 0, "pageWidth": 0, "pdfCoordinates": [ { "x1": null, "x2": null, "y1": null, "y2": null } ] } ] } ], "fields": "string", "departmentId": "string" }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    stringoptional
    No description.
    nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": "string", "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/Template/design' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "templateId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "string", "document": { "fileName": "string", "extension": "string", "data": "string", "fileLocation": "string", "fileSize": 0 }, "users": [ { "orderNo": 0, "userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "string", "signType": "string", "pDFPages": [ { "pageNumber": 0, "pageSize": 0, "pageWidth": 0, "pdfCoordinates": [ { "x1": null, "x2": null, "y1": null, "y2": null } ] } ] } ], "fields": "string", "departmentId": "string" }'
GET

/api/v1/Template/design/{templateId}

#

Loads a template for editing: the .docx as base64, plus the field and signer definitions exactly as they were saved.

docs.signcare.io/core/api/document-services/template-management-api/#get-api-v1-template-design-templateid

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.

Path parameters

  • templateId
    stringrequired
    Required. Identifier (GUID) of the template to load, in the URL path.

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    Everything needed to reopen a template in an editor.
    5 fields
    • wordContent
      stringoptional
      No description.
      nullable
    • name
      stringoptional
      No description.
      nullable
    • signerInfo
      stringoptional
      JSON array in a string — the signers and their signature positions.
      nullable
    • documentFields
      stringoptional
      JSON array in a string — the field definitions, exactly as saved.
      nullable
    • stampInfo
      stringoptional
      No description.
      nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "wordContent": "string", "name": "string", "signerInfo": "string", "documentFields": "string", "stampInfo": "string" }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X GET 'https://uat-ext.signcare.io/api/v1/Template/design/{templateId}' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID'
POST

/api/v1/Template/request

#

Create a document from a template and send it for signing, optionally with a SHCIL eStamp.

docs.signcare.io/core/api/document-services/template-management-api/#post-api-v1-template-request

Creates a document from a template and sends it to your signers. When SHCIL eStamp details are included, a stamp is purchased first and placed in the document. The request waits up to about 40 seconds for this to finish and returns the result in the same response; if it takes longer, it is accepted and you collect the result afterwards.

How the two options work

Without eStamp detailsWith SHCIL eStamp details
ProcessingImmediateThe request waits up to about 40 seconds for the stamp and the signing document.
Successful response200 OK with the document and each signer's signing link200 OK with the signing links and stamp details when ready within the wait. Otherwise 202 Accepted with the status ACCEPTED.
Webhook (response URL)OptionalOptional. If you provide one (or one is configured for your account) the result is also delivered there.
If the result is not in the responseNot applicableCall the Template request status API with your reference id. It returns the same result at any time.
If something goes wrongAn error response straight awayA request that is invalid is rejected straight away and nothing is charged. A failure after the request is accepted is returned in the response when it happens within the wait, otherwise it is available from the status API (and your webhook, if any).

Checked before any stamp is purchased

When eStamp details are included, the following are verified first. A request that fails any check is rejected immediately and nothing is charged.

AreaWhat is checked
TemplateThe template id is valid and the template exists. The template has signer positions.
Reference id1 to 64 letters, digits, hyphens or underscores, and not used before.
DocumentA document name is given, uses valid characters and is under 50 characters.
SignersAt least one signer. Each signer position belongs to the template and is used only once. Name, email or mobile number (at least one), signature type, Electronic options, Aadhaar details and signing order are valid.
eSign accessThe eSign API is enabled and subscribed, and the wallet balance covers each signature type.
SHCIL detailsThe article is listed under pdfArticles (articleType CUSTOM) in the Master Details API for that state. Minimum stamp duty (whole rupees), PAN and mobile number rules, and the payer matches one of the parties.
Party namesLetters and spaces only, up to 200 characters.
Document descriptionUp to 100 characters: letters, numbers and spaces only.
SHCIL walletThe balance covers this stamp and all of your earlier stamps that are still in progress.

Response when the result is ready (200)

The body is the same as the response of the Template request status API: the eSign document with each signer's signing link, and the stamp details.

Response when the request is accepted but not ready yet (202)

FieldDescription
data: documentReferenceIdYour reference id.
data: reconMappingIdThe SignCare reconciliation id of the request.
data: statusACCEPTED.

Do not submit the same reference id again. Submitting it while the request is in progress waits for the same request and returns its result, or the same 202.

Getting the result later

Call the Template request status API with your reference id or the reconciliation id to get the result at any time. A webhook is optional: if you provide a response URL, or one is configured for your account, the same result is also sent there, and the type of result is given in the x-signcare-event header of the notification.

A failure after acceptance

If the stamp or the signing document cannot be completed and this happens within the wait, the response carries the failure with its HTTP status (for example 400, 402 or 500) and the reason in the message. Later failures are available from the status API.

Responses

HTTP statusMeaning
200 OKThe document was created. With eStamp details this means the stamp and the signing document are both ready.
202 AcceptedThe request was accepted but is not ready within the wait. Get the result from the Template request status API (or your webhook).
400 Bad RequestA validation failed. The message states which one.
401 UnauthorizedThe API key is missing or invalid.
402 Payment RequiredThe eSign API is not enabled, or the wallet balance is not sufficient.
403 ForbiddenYour account is not subscribed to the eSign API.
404 Not FoundThe template does not exist.
500 Internal Server ErrorAn unexpected error occurred.

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • referenceId
    stringrequired
    Required. Your own unique reference for the document: 1 to 64 letters, digits, hyphens or underscores. A reference that already exists is rejected.
    nullable
  • templateId
    stringrequired
    Required. Identifier (GUID) of the template, as returned by GET /api/v1/Template/get.
    nullable
  • documentName
    stringrequired
    Required. Name of the document, up to 50 characters: letters, digits, spaces and , @ _ . ' - ( ) [ ].
    nullable
  • sequentialSigning
    booleanoptional
    Optional. Accepted but currently ignored: signers are not forced to sign in order. Defaults to false.
  • skipVerificationCode
    booleanoptional
    Optional. Set to true to skip the verification code step for signers. Defaults to false.
  • signers
    array<object>required
    Required. Signers for the document, at least one. Each userId must be a signer id from the template (see GET /api/v1/Template/get).
    nullable
    Each item: 9 fields
    • userId
      stringrequired
      Required. Signer id from the template, as returned by GET /api/v1/Template/get. Must be a GUID that belongs to the template.
      nullable
    • name
      stringrequired
      Required. Full name of the signer: letters, digits, spaces and , @ _ . ' - ( ) [ ].
      nullable
    • emailId
      stringconditional
      Conditional: required when mobileNo is not sent. Email address of the signer. At least one of emailId / mobileNo must be present per signer; the signature-create handler enforces that, and rejects a malformed address.
      nullable
    • mobileNo
      stringconditional
      Conditional: required when emailId is not sent. 10-digit mobile number of the signer, digits only, used instead of emailId when the signer has no email address — the invitation and the sign OTP then go by SMS. At least one of emailId / mobileNo must be present per signer.
      nullable
    • signType
      stringrequired
      Required. Signature method: Electronic, Aadhaar or Digital (case-sensitive).
      nullable
    • order
      integer (int32)optional
      Optional. Signing order position, starting at 1. Defaults to 0. Signing order is not currently enforced.
    • electronicOptions
      objectoptional
      No description.
      5 fields
      • canDraw
        booleanoptional
        No description.
      • canType
        booleanoptional
        No description.
      • canUpload
        booleanoptional
        No description.
      • captureGPSLocation
        booleanoptional
        No description.
      • capturePhoto
        booleanoptional
        No description.
    • aadhaarInfo
      objectoptional
      No description.
      3 fields
      • birthYear
        stringoptional
        No description.
        nullable
      • lastFourDigitOfAadhaar
        stringoptional
        No description.
        nullable
      • gender
        stringoptional
        No description.
        nullable
    • signatorySealInfo
      objectoptional
      No description.
      2 fields
      • name
        stringoptional
        Optional. Organization name printed in the seal text, for example ABC Pvt Ltd.
        nullable
      • sealType
        integer (int32)optional
        Optional. Label shown below the signature: 1 = Authorised Signatory, 2 = Director, 3 = Company Seal. Any other value is rejected.
        nullable
  • fields
    array<object>required
    Required. Field values to fill in. Send exactly one entry for every field the template declares (the counts must match). Each entry needs displayName, fieldName and type exactly as returned by GET /api/v1/Template/get, plus fieldValue. Required fields must have a non-empty value; date and number fields must parse as a date or number.
    nullable
    Each item: 22 fields
    • displayName
      stringrequired
      Required. Field label, exactly as returned by GET /api/v1/Template/get. Used for the required-field and type checks (case-insensitive).
      nullable
    • required
      booleanoptional
      Optional. Whether the field is mandatory. The template's own setting is what is enforced; defaults to false.
    • type
      stringrequired
      Required. Field type, exactly as returned by GET /api/v1/Template/get (for example text, date, number, image).
      nullable
    • fieldName
      stringrequired
      Required. Placeholder name in the template document, exactly as returned by GET /api/v1/Template/get. The value is placed by this name (case-insensitive).
      nullable
    • fieldValue
      stringconditional
      Conditional: required when the template marks the field as required. Value to fill in, as a string. Date values must parse as a date and number values as a number.
      nullable
    • imageWidth
      number (float)optional
      No description.
      nullable
    • imageHeight
      number (float)optional
      No description.
      nullable
    • imageBorder
      booleanoptional
      No description.
      nullable
    • boxCount
      integer (int32)optional
      Boxed fields only: how many character boxes the template reserves. Left null the renderer derives it from the table row the marker sits in, which is the usual case — the form itself is the source of truth for how many boxes exist.
      nullable
    • uppercase
      booleanoptional
      Force the value to upper case. Forms that say "BLOCK LETTERS" want this.
      nullable
    • spacePolicy
      stringoptional
      "blank" (a space occupies a box) or "skip" (spaces are dropped).
      nullable
    • overflowPolicy
      stringoptional
      "reject" (default) or "truncate" when the value needs more boxes than exist.
      nullable
    • dateFormat
      stringoptional
      Date fields: .NET format string applied to the parsed value, e.g. "dd/MM/yyyy".
      nullable
    • decimalPlaces
      integer (int32)optional
      No description.
      nullable
    • thousandSeparator
      booleanoptional
      No description.
      nullable
    • options
      array<string>optional
      Checkbox: the options in the group — one marker is authored per option, and the field's value selects which of them is ticked.
      nullable
    • checkedMark
      stringoptional
      Glyph written into a ticked box. Defaults to a check mark "✓".
      nullable
    • checkedMarkFont
      stringoptional
      Font for the tick. Null inherits the surrounding text's font, which may not carry the check-mark glyph — set a font with symbol coverage if a tick renders as a hollow box.
      nullable
    • multiSelect
      booleanoptional
      Checkbox groups: allow more than one option to be ticked.
      nullable
    • displayTag
      stringoptional
      Layout types: the single character the editor shows at the field's anchor so the author can see it is there. Author-chosen, defaults to "▫". Stripped before the value is placed, so it never appears in the rendered document.
      nullable
    • maxLength
      integer (int32)optional
      Value types: reject a value longer than this before the document is created.
      nullable
    • pattern
      stringoptional
      Value types: regular expression the value must match (PAN, IFSC, Aadhaar...).
      nullable
  • stampInfo
    objectoptional
    Represents e-stamp information required for stamped documents.
    9 fields
    • firstPartyName
      stringconditional
      Conditional: required when stampInfo is sent. Name of the first party in the agreement.
      nullable
    • secondPartyName
      stringconditional
      Conditional: required when stampInfo is sent. Name of the second party in the agreement.
      nullable
    • stampDutyPaidBy
      stringconditional
      Conditional: required when stampInfo is sent. Party that pays the stamp duty.
      nullable
    • purposeOfStampDuty
      stringconditional
      Conditional: required when stampInfo is sent. Purpose of the stamp duty.
      nullable
    • considerationPrice
      stringconditional
      Conditional: required when stampInfo is sent. Consideration price or transaction value, as a string.
      nullable
    • stampDutyValue
      stringconditional
      Conditional: required when stampInfo is sent. Stamp duty amount, as a string.
      nullable
    • articleId
      stringconditional
      Conditional: required when stampInfo is sent. Article identifier for the stamp duty category.
      nullable
    • branchId
      stringconditional
      Conditional: required when stampInfo is sent. Branch identifier for e-stamp processing.
      nullable
    • state
      stringconditional
      Conditional: required when stampInfo is sent. State in which the e-stamp is issued.
      nullable
  • shcilStampInfo
    objectoptional
    SHCIL eStamp details for Template + SHCIL combined flow.
    12 fields
    • firstPartyName
      stringoptional
      First party name. English letters and spaces only (max 200) — SHCIL does not accept special characters or digits.
      nullable
    • firstPartyPan
      stringoptional
      First party PAN (e.g. ABCDE1234F). Required when the first party pays more than ₹2,00,000.
      nullable
    • firstPartyMobile
      stringoptional
      First party mobile, exactly 10 digits. Required when the first party pays the stamp duty.
      nullable
    • secondPartyName
      stringoptional
      Second party name. English letters and spaces only (max 200).
      nullable
    • secondPartyPan
      stringoptional
      Second party PAN. Required when the second party pays more than ₹2,00,000.
      nullable
    • secondPartyMobile
      stringoptional
      Second party mobile, exactly 10 digits. Required when the second party pays the stamp duty.
      nullable
    • stateCode
      stringoptional
      Two-letter state code of the chosen article, from the Master Details API (states and pdfArticles), for example AS. Not case-sensitive.
      nullable
    • articleCode
      integer (int32)optional
      Article code of a row in pdfArticles (articleType CUSTOM) in the Master Details API response, used exactly as listed. Articles listed under templateArticles are rejected by this API.
    • stampDutyAmount
      number (double)optional
      Stamp duty in whole rupees, within the minDuty and maxDuty of the chosen pdfArticles row.
    • stampDutyPaidBy
      stringoptional
      Must equal the first or second party name (letters and spaces only, max 200).
      nullable
    • considerationPrice
      number (double)optional
      No description.
      nullable
    • documentDescription
      stringoptional
      Optional, max 100 characters: letters, numbers and spaces only — no special characters.
      nullable
  • responseUrl
    stringoptional
    Optional. Response URL that receives document status updates. When omitted, the webhook URL configured for your account is used.
    nullable
  • descriptionForInvitee
    stringoptional
    Optional. Message shown to signers on the signing page.
    nullable
  • finalCopyRecipientsEmailId
    stringoptional
    Optional. Email address that receives a copy of the final signed document.
    nullable
  • returnUrl
    stringoptional
    Optional. Absolute https URL the signer's browser is sent to after signing.
    nullable
Sample request body
{ "referenceId": "string", "templateId": "string", "documentName": "string", "sequentialSigning": false, "skipVerificationCode": false, "signers": [ { "userId": "string", "name": "string", "emailId": "string", "mobileNo": "string", "signType": "string", "order": 0, "electronicOptions": { "canDraw": false, "canType": false, "canUpload": false, "captureGPSLocation": false, "capturePhoto": false }, "aadhaarInfo": { "birthYear": "string", "lastFourDigitOfAadhaar": "string", "gender": "string" }, "signatorySealInfo": { "name": "string", "sealType": 0 } } ], "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ], "stampInfo": { "firstPartyName": "string", "secondPartyName": "string", "stampDutyPaidBy": "string", "purposeOfStampDuty": "string", "considerationPrice": "string", "stampDutyValue": "string", "articleId": "string", "branchId": "string", "state": "string" }, "shcilStampInfo": { "firstPartyName": "string", "firstPartyPan": "string", "firstPartyMobile": "string", "secondPartyName": "string", "secondPartyPan": "string", "secondPartyMobile": "string", "stateCode": "string", "articleCode": 0, "stampDutyAmount": 0, "stampDutyPaidBy": "string", "considerationPrice": 0, "documentDescription": "string" }, "responseUrl": "string", "descriptionForInvitee": "string", "finalCopyRecipientsEmailId": "string", "returnUrl": "string" }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    No description.
    6 fields
    • documentId
      stringoptional
      No description.
      nullable
    • documentReferenceId
      stringoptional
      No description.
      nullable
    • responseTimeStamp
      stringoptional
      No description.
      nullable
    • userInfo
      array<object>optional
      No description.
      nullable
      Each item: 3 fields
      • userRefId
        stringoptional
        No description.
        nullable
      • userId
        stringoptional
        No description.
        nullable
      • esignLink
        stringoptional
        No description.
        nullable
    • uiModeURL
      stringoptional
      No description.
      nullable
    • stampDetails
      objectoptional
      SHCIL eStamp certificate details returned in the Template+SHCIL response.
      7 fields
      • eStampId
        string (uuid)optional
        No description.
        nullable
      • reconMappingId
        stringoptional
        No description.
        nullable
      • userDocumentId
        integer (int64)optional
        No description.
        nullable
      • certId
        stringoptional
        No description.
        nullable
      • urn
        stringoptional
        No description.
        nullable
      • certificateNo
        stringoptional
        No description.
        nullable
      • certificateIssuedDate
        stringoptional
        No description.
        nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "documentId": "string", "documentReferenceId": "string", "responseTimeStamp": "string", "userInfo": [ { "userRefId": "string", "userId": "string", "esignLink": "string" } ], "uiModeURL": "string", "stampDetails": { "eStampId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "reconMappingId": "string", "userDocumentId": 0, "certId": "string", "urn": "string", "certificateNo": "string", "certificateIssuedDate": "string" } }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
202Accepted
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    Slim 202 body for Template+SHCIL+eSign: the request passed validation and was accepted; the final result (stamp + eSign links) is delivered to the caller's responseUrl.
    3 fields
    • documentReferenceId
      stringoptional
      No description.
      nullable
    • reconMappingId
      stringoptional
      No description.
      nullable
    • status
      stringoptional
      No description.
      nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "documentReferenceId": "string", "reconMappingId": "string", "status": "string" }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    stringoptional
    No description.
    nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": "string", "messages": [ "string" ], "request_id": "string", "isBillable": false }
401Unauthorizedsame body as 400
402Payment Requiredsame body as 400
404Not Foundsame body as 400
500Internal Server Errorsame body as 400
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/Template/request' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "referenceId": "string", "templateId": "string", "documentName": "string", "sequentialSigning": false, "skipVerificationCode": false, "signers": [ { "userId": "string", "name": "string", "emailId": "string", "mobileNo": "string", "signType": "string", "order": 0, "electronicOptions": { "canDraw": false, "canType": false, "canUpload": false, "captureGPSLocation": false, "capturePhoto": false }, "aadhaarInfo": { "birthYear": "string", "lastFourDigitOfAadhaar": "string", "gender": "string" }, "signatorySealInfo": { "name": "string", "sealType": 0 } } ], "fields": [ { "displayName": "string", "required": false, "type": "string", "fieldName": "string", "fieldValue": "string", "imageWidth": 0, "imageHeight": 0, "imageBorder": false, "boxCount": 0, "uppercase": false, "spacePolicy": "string", "overflowPolicy": "string", "dateFormat": "string", "decimalPlaces": 0, "thousandSeparator": false, "options": [ "string" ], "checkedMark": "string", "checkedMarkFont": "string", "multiSelect": false, "displayTag": "string", "maxLength": 0, "pattern": "string" } ], "stampInfo": { "firstPartyName": "string", "secondPartyName": "string", "stampDutyPaidBy": "string", "purposeOfStampDuty": "string", "considerationPrice": "string", "stampDutyValue": "string", "articleId": "string", "branchId": "string", "state": "string" }, "shcilStampInfo": { "firstPartyName": "string", "firstPartyPan": "string", "firstPartyMobile": "string", "secondPartyName": "string", "secondPartyPan": "string", "secondPartyMobile": "string", "stateCode": "string", "articleCode": 0, "stampDutyAmount": 0, "stampDutyPaidBy": "string", "considerationPrice": 0, "documentDescription": "string" }, "responseUrl": "string", "descriptionForInvitee": "string", "finalCopyRecipientsEmailId": "string", "returnUrl": "string" }'
POST

/api/v1/Template/request/status

#

Check the result of a Template and SHCIL eStamp request.

docs.signcare.io/core/api/document-services/template-management-api/#post-api-v1-template-request-status

Use this API to find out what happened to a document request that was submitted with SHCIL eStamp details, for example when the result notification (webhook) did not reach your system. It returns the same information that is sent to your response URL, so you can handle both in the same way. There is no charge for this call.

Request

Send your own reference id, the SignCare reconciliation id, or both. If you send both, they must belong to the same request.

FieldTypeRequiredDescription
documentReferenceIdstringEither oneThe reference id you used when you created the request. 1 to 64 letters, digits, hyphens or underscores.
reconMappingIdstringEither oneThe reconciliation id returned when the request was accepted. Letters and digits only.

Result of the lookup

HTTP statusRequest stateSuccessWhat you receive
202 AcceptedIn progress: queued, being stamped, or waiting for SHCILtrueThe reference id, the reconciliation id and the status ACCEPTED. Check again shortly.
200 OKCompleted successfullytrueThe document, the signer links and the stamp details.
200 OKCompleted with a failurefalseThe reason for the failure, the reference ids, the status FAILED, and the stamp details if a stamp had already been issued.

Whenever the request is found, the lookup itself succeeds. For a request that failed, the failure code and the reason are in the response body, exactly as in the webhook.

Details of a completed request

FieldTypeDescription
documentIdstringIdentifier of the signing document. Use it with the other eSign APIs.
documentReferenceIdstringYour reference id.
responseTimeStampstringDate and time the signing document was created.
userInfolistOne entry per signer, in the order you submitted them.
userInfo: userRefIdstringThe signer slot identifier you submitted.
userInfo: userIdstringSignCare identifier of the signer.
userInfo: docSignerIdstringIdentifier of the signer on the document.
userInfo: esignLinkstringThe signing link sent to the signer. Not provided for a signer who is waiting for an earlier signer.
stampDetails: eStampIdstringUnique identifier of the eStamp.
stampDetails: reconMappingIdstringThe reconciliation id of the request.
stampDetails: userDocumentIdnumberSHCIL document number.
stampDetails: certIdstringCertificate id issued by SHCIL.
stampDetails: urnstringUnique reference number of the stamp.
stampDetails: certificateNostringCertificate number.
stampDetails: certificateIssuedDatestringDate and time the certificate was issued.

Details of a failed request

FieldTypeDescription
messagestringThe reason the request failed.
documentReferenceIdstringYour reference id.
reconMappingIdstringThe reconciliation id of the request.
statusstringFAILED.
stampDetailsobjectProvided only when a stamp had already been issued before the failure. Same fields as above. Share them with support so the stamp can be recovered.

A request that failed can be submitted again with the same reference id.

Error responses

HTTP statusSituationMessage
400 Bad RequestNeither id was sentValidation Error: Provide 'documentReferenceId' or 'reconMappingId'.
400 Bad RequestAn id contains characters that are not allowedValidation Error: The 'documentReferenceId' passed in the request is invalid. (or the same for 'reconMappingId')
400 Bad RequestBoth ids were sent but belong to different requestsValidation Error: 'documentReferenceId' and 'reconMappingId' do not belong to the same request.
401 UnauthorizedThe API key is missing or invalidMissing or invalid X-API-KEY header.
404 Not FoundNo such request exists for your accountNo Template + SHCIL eStamp request was found for the given documentReferenceId / reconMappingId.

Guidance

TopicGuidance
Your data onlyYou can look up only the requests made with your own account. An id that does not exist, or that belongs to another account, returns the same Not Found response.
When to use itThe result normally reaches your response URL within seconds, and failed deliveries are retried automatically over several hours. If you have not received it after a few minutes, check here. Suggested schedule: after 30 seconds, 1 minute and 5 minutes, then every 15 minutes.
Stamp waiting for SHCILThe response stays In progress. The signing document is created automatically once SHCIL completes the stamp.
Long-running requestsIf a request stays In progress for much longer than usual, contact support and quote its reference id.
Signing linksThese are the same links that were sent to the signers by email or SMS.

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • documentReferenceId
    stringoptional
    The reference id you used when you created the request. 1 to 64 letters, digits, hyphens or underscores.
    nullable
  • reconMappingId
    stringoptional
    The reconciliation id returned when the request was accepted. Letters and digits only.
    nullable
Sample request body
{ "documentReferenceId": "string", "reconMappingId": "string" }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    No description.
    6 fields
    • documentId
      stringoptional
      No description.
      nullable
    • documentReferenceId
      stringoptional
      No description.
      nullable
    • responseTimeStamp
      stringoptional
      No description.
      nullable
    • userInfo
      array<object>optional
      No description.
      nullable
      Each item: 3 fields
      • userRefId
        stringoptional
        No description.
        nullable
      • userId
        stringoptional
        No description.
        nullable
      • esignLink
        stringoptional
        No description.
        nullable
    • uiModeURL
      stringoptional
      No description.
      nullable
    • stampDetails
      objectoptional
      SHCIL eStamp certificate details returned in the Template+SHCIL response.
      7 fields
      • eStampId
        string (uuid)optional
        No description.
        nullable
      • reconMappingId
        stringoptional
        No description.
        nullable
      • userDocumentId
        integer (int64)optional
        No description.
        nullable
      • certId
        stringoptional
        No description.
        nullable
      • urn
        stringoptional
        No description.
        nullable
      • certificateNo
        stringoptional
        No description.
        nullable
      • certificateIssuedDate
        stringoptional
        No description.
        nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "documentId": "string", "documentReferenceId": "string", "responseTimeStamp": "string", "userInfo": [ { "userRefId": "string", "userId": "string", "esignLink": "string" } ], "uiModeURL": "string", "stampDetails": { "eStampId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "reconMappingId": "string", "userDocumentId": 0, "certId": "string", "urn": "string", "certificateNo": "string", "certificateIssuedDate": "string" } }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
202Accepted
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    Slim 202 body for Template+SHCIL+eSign: the request passed validation and was accepted; the final result (stamp + eSign links) is delivered to the caller's responseUrl.
    3 fields
    • documentReferenceId
      stringoptional
      No description.
      nullable
    • reconMappingId
      stringoptional
      No description.
      nullable
    • status
      stringoptional
      No description.
      nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "documentReferenceId": "string", "reconMappingId": "string", "status": "string" }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    stringoptional
    No description.
    nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether 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.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": "string", "messages": [ "string" ], "request_id": "string", "isBillable": false }
401Unauthorizedsame body as 400
402Payment Requiredsame body as 400
404Not Foundsame body as 400
500Internal Server Errorsame body as 400
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/Template/request/status' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "documentReferenceId": "string", "reconMappingId": "string" }'