SignSecureSignSecure Docs

Introduction

Overview of the SignSecure REST API.

View Markdown

The SignSecure API lets you programmatically create documents, add recipients, send for signing, track progress, and manage templates and credits.

Base URL

https://api.signpad.signsecure.in/api/v1

All endpoints are relative to this base URL. For local development, the server runs at http://localhost:3000/api/v1.

Authentication

Every request (except /health) requires an API key sent as a Bearer token in the Authorization header:

Authorization: Bearer signsecure_xxxxxxxx...

API keys are created from Settings > API Keys in the dashboard. The key is shown once on creation — store it securely.

Keys can be scoped with granular permissions per resource:

ResourceActions
documentsread, write, delete
signingread, write
templatesread, write, delete
creditsread
webhooksread, write, delete

Keys can also have an optional expiration date (1–365 days).

Rate Limits

Each API key is limited to 1,000 requests per hour. When the limit is exceeded, requests return 403.

Error Format

All errors return a consistent JSON envelope. Use code for programmatic handling and message for display. The details object carries structured context that helps you fix the problem — its shape depends on the error code.

{
  "code": "VALIDATION_ERROR",
  "message": "fileName: Required",
  "details": {
    "validation": {
      "fieldErrors": { "fileName": ["Required"] },
      "formErrors": [],
      "issues": [
        { "path": "fileName", "message": "Required", "code": "invalid_type" }
      ]
    }
  },
  "requestId": "req_abc123",
  "timestamp": "2026-03-11T10:30:00.000Z"
}
FieldTypeDescription
codestringMachine-readable constant — switch on this in your code
messagestringHuman-readable explanation — safe to show to users
detailsobject?Structured context (shape varies by code, omitted when not applicable)
requestIdstringUnique request ID — include this when contacting support
timestampstringISO 8601 timestamp of when the error occurred

Error Codes

Authentication & Authorization

CodeHTTPWhen it happensHow to fix
UNAUTHORIZED401Missing, invalid, or revoked API keyCheck the key is correct and not deleted in Settings > API Keys
FORBIDDEN403Key is disabled, expired, rate-limited, or lacks the required permissionRe-enable the key, create a new one, or add the missing permission scope
UNSUPPORTED_AUTH_HEADER400Sent the key via x-api-key headerUse Authorization: Bearer <key> instead
INVALID_AUTHORIZATION_HEADER400Authorization header is malformed (e.g., missing Bearer prefix)Format as Authorization: Bearer signsecure_xxxxx...

Validation & Input

CodeHTTPWhen it happensdetails shapeHow to fix
VALIDATION_ERROR400Request body or query params failed schema validation{ validation: { fieldErrors, formErrors, issues[] } }Check details.validation.issues for the exact field paths and messages
BAD_REQUEST400Invalid parameters that aren't covered by schema validation{ invalidRecipientIds[] } (when applicable)Read the message and fix the indicated parameter
INVALID_FILE_TYPE400fileType is not application/pdfOnly PDFs are supported
FILE_TOO_LARGE400fileSize exceeds 10 MB{ maxSize, providedSize }Compress or split the PDF to fit under 10,485,760 bytes
DUPLICATE_RECIPIENT400A recipient email already exists on the document, or the same email appears twice in your request{ duplicateEmails[] }Remove the duplicate email(s) or set replaceExisting: true

Document & Signing

CodeHTTPWhen it happensdetails shapeHow to fix
NOT_FOUND404Document, template, recipient, or form field does not exist (or you don't own it)Verify the ID is correct and belongs to your account
INVALID_STATUS400Operation requires a specific document status (usually draft) but the document is in a different stateCheck message for the required status; you may need to create a new document
NO_RECIPIENTS400Tried to send a document that has no signers or approversAdd at least one recipient with role signer or approver before sending
NOT_AVAILABLE400Requested the download URL but the PDF file hasn't been uploaded yetUpload the PDF via the presigned uploadUrl first
INVALID_SIGNATURE_POSITIONS400Signature fields reference page numbers that exceed the PDF's actual page count{ pdfPageCount, invalidPositions[], message }Reposition fields to valid pages (check details.pdfPageCount)
INVALID_SIGNATURE_PLACEMENT400Used text-based placement (type: "text") with a non-electronic signature method{ invalidRecipients[], recommendation }Switch to signatureMethod: "electronic" or use type: "coordinates" placement
TEXT_NOT_FOUND_IN_PDF400The searchText for text-based signature placement was not found anywhere in the PDF{ missingTexts[], totalPages }Update the PDF to include the text, or change to coordinate-based placement
PDF_VALIDATION_FAILED400The PDF file is corrupted, unreadable, or couldn't be downloaded from S3{ details }Re-upload the PDF file

Database & Server

CodeHTTPWhen it happensdetails shapeHow to fix
DUPLICATE_ENTRY409A unique database constraint was violated (e.g., duplicate email){ constraint, detail }Use a different value for the conflicting field
CONSTRAINT_VIOLATION400A database integrity constraint was violated{ constraint, detail }Check details.constraint for the specific rule that failed
INTERNAL_SERVER_ERROR500Unexpected server errorRetry the request; if it persists, contact support with the requestId

Validation Error Details

VALIDATION_ERROR is the most common error. The details.validation object gives you everything you need to show per-field error messages in your UI:

{
  "code": "VALIDATION_ERROR",
  "message": "fileName: Required",
  "details": {
    "validation": {
      "fieldErrors": {
        "fileName": ["Required"],
        "fileSize": ["Expected number, received string"]
      },
      "formErrors": [],
      "issues": [
        { "path": "fileName", "message": "Required", "code": "invalid_type" },
        { "path": "fileSize", "message": "Expected number, received string", "code": "invalid_type" }
      ]
    }
  },
  "requestId": "req_abc123",
  "timestamp": "2026-03-11T10:30:00.000Z"
}
  • fieldErrors — keyed by field path (e.g., "recipients.0.email"), each value is an array of error messages for that field
  • formErrors — array of errors not tied to a specific field (e.g., cross-field validation)
  • issues — flat array with each Zod validation issue including the code (e.g., invalid_type, too_small, invalid_enum_value)

Available Resources

ResourceDescription
DocumentsCreate, read, update, delete documents and manage file uploads
RecipientsAdd and remove document recipients (signers, approvers, CC)
Form FieldsPlace interactive fields on document pages
Signing WorkflowSend documents for signing, track progress, send reminders
TemplatesCreate reusable document templates
CreditsCheck balance, view transactions, get usage stats
WebhooksReceive real-time event notifications via HTTP

On this page