Zignature API

Programmatically create templates, send documents for signing, and manage your entire document workflow. The API uses JSON for request and response bodies and standard HTTP methods.

Base URL
https://app.zignature.io/api
Authentication
X-Auth-Token
API key in request header
Format
JSON
Request & response bodies
API Documents
$0.20
Per document signed via API

Authentication

All API requests require authentication via the X-Auth-Token header. You can find your API token in Settings → API within your Zignature dashboard.

Your API token carries full account privileges. Keep it secret — never expose it in client-side code, public repositories, or browser requests. Use environment variables and server-side calls only.

Production
Live API token
Documents count toward billing at $0.20/doc
Sandbox
Test API token
Free, unlimited. Documents watermarked TEST

Errors

The API uses standard HTTP status codes to indicate the result of a request. Codes in the 2xx range indicate success. Codes in the 4xx range indicate a client error. Codes in the 5xx range indicate a server error.

StatusMeaningDescription
200OKRequest succeeded
201CreatedResource successfully created
401UnauthorizedMissing or invalid X-Auth-Token header
403ForbiddenAuthenticated but not authorized to access this resource
404Not FoundThe requested resource does not exist
422UnprocessableValidation failed — check the error field in the response body
429Too Many RequestsRate limit exceeded — wait before retrying
500Server ErrorAn unexpected error occurred on our end

Error responses return a JSON body with an error field describing the issue:

OAuth 2.0

For third-party integrations, Zignature supports the standard OAuth 2.0 Authorization Code flow. This allows your application to access Zignature on behalf of a user without handling their credentials directly.

Endpoints

EndpointMethodDescription
/oauth/authorizeGETDisplay consent screen to the user
/oauth/tokenPOSTExchange authorization code or refresh token for an access token
/oauth/revokePOSTRevoke an access or refresh token

Authorization Flow

1
Register an OAuth App

Create an application in Developer Portal → OAuth Apps. You’ll receive a client_id and client_secret.

2
Redirect to Authorize

Send the user to /oauth/authorize with your client_id, redirect_uri, response_type=code, and requested scope.

3
User Grants Access

The user sees a consent screen listing the requested scopes and approves your app. Zignature redirects back to your redirect_uri with a temporary code.

4
Exchange Code for Token

POST to /oauth/token with the code, client_id, client_secret, and grant_type=authorization_code. You’ll receive an access_token (valid 2 hours) and refresh_token.

5
Make API Calls

Use the access token as a Bearer token: Authorization: Bearer YOUR_ACCESS_TOKEN. When expired, use the refresh token to get a new one.

Available Scopes

ScopeDescription
templates:readView templates and their fields
templates:writeCreate, edit, and archive templates
submissions:readView submissions, documents, and signer status
submissions:writeSend documents, create submissions, and manage signers
webhooks:readView webhook endpoints and delivery logs
webhooks:manageCreate, update, and delete webhook endpoints
account:readView account info and team members
account:manageManage account settings, users, and billing

Token Details

ParameterValue
Access token lifetime2 hours (7200 seconds)
Authorization code lifetime10 minutes (600 seconds)
Refresh tokenReturned with every token exchange; use to obtain a new access token
Client authenticationVia request body params or HTTP Basic Auth (client_id:client_secret)
GET /oauth/authorize Authorization request

Redirect the user to this endpoint to begin the authorization flow. Displays a consent screen listing the requested scopes. On approval, redirects back to redirect_uri with a temporary authorization code.

ParameterTypeDescription
client_id requiredstringYour OAuth application’s client ID
redirect_uri requiredstringMust match one of the registered redirect URIs for your app
response_type requiredstringMust be code
scopestringSpace-separated list of scopes (e.g. templates:read submissions:write)
statestringOpaque value for CSRF protection; returned unchanged in the callback
✓ 302 Redirect
Location: https://yourapp.com/callback?code=abc123def456&state=random_csrf_token
POST /oauth/token Exchange code or refresh token

Exchange an authorization code for an access token, or use a refresh token to obtain a new access token. Client authentication is required via body params or HTTP Basic Auth.

ParameterTypeDescription
grant_type requiredstringauthorization_code or refresh_token
codestringThe authorization code (required when grant_type=authorization_code)
refresh_tokenstringThe refresh token (required when grant_type=refresh_token)
client_id requiredstringYour OAuth application’s client ID
client_secret requiredstringYour OAuth application’s client secret
redirect_uristringRequired when grant_type=authorization_code; must match the original
✓ 200 OK
{
  "access_token": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
  "token_type": "Bearer",
  "expires_in": 7200,
  "refresh_token": "f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5",
  "scope": "templates:read submissions:write",
  "created_at": 1740000000
}
POST /oauth/revoke Revoke a token

Invalidate an access token or refresh token. The token is immediately revoked and can no longer be used. Per RFC 7009, this endpoint always returns 200 even if the token was already revoked or not found.

ParameterTypeDescription
token requiredstringThe access token or refresh token to revoke
client_id requiredstringYour OAuth application’s client ID
client_secret requiredstringYour OAuth application’s client secret
✓ 200 OK
{}

Account

Retrieve information about the currently authenticated API user and account.

GET /api/user Get current user

Returns the currently authenticated user's profile and account details. Useful for verifying API token validity and retrieving account configuration.

✓ 200 OK
{
  "id": 6,
  "email": "erik@zignature.io",
  "first_name": "Erik",
  "last_name": "Admin",
  "role": "admin",
  "account_id": 6,
  "account_name": "Zignature",
  "created_at": "2026-01-15T08:00:00Z",
  "updated_at": "2026-02-19T12:30:00Z"
}

Quick Start

Send your first signature request in under 60 seconds. Just three steps: get your API key, create a template in the dashboard, then call the API.

1
Get your API key

Go to Settings → API in your dashboard and copy your token.

2
Create a template

Upload a PDF or build from scratch in the template editor. Note the template ID.

3
Send for signing

Make a POST request to /api/submissions with the template ID and submitter emails. See the code example on the right.

Embedding

Embed Zignature signing forms directly into your application. Provide a seamless in-app signing experience without redirecting users away from your product.

Full documentation: Signing Form Component · Form Builder Component

your-app.com/contracts/sign

Form Embed

Generate an embed for a specific signer. Each embed is tied to one submission and one recipient. Create a submission via POST /api/submissions with "send_email": false, then embed the returned embed_src URL. Each submission counts as one API send. Best for contracts, proposals, and one-to-one signing.

Embed Events

Listen for signing events from the embedded form using window.addEventListener('message', ...). Events include:

EventDescription
completedSubmitter finished signing the document
declinedSubmitter declined to sign
loadedSigning form fully loaded in iframe

Submissions

Signature requests are initiated with the Submissions API. Submissions can contain one or multiple submitters. Creating a submission sends the document for signing.

GET /api/submissions List all submissions
ParameterTypeDescription
template_idIntegerFilter by template
statusStringFilter: pending, completed, declined, expired
qStringSearch by name, email, or phone
slugStringFilter by unique submission slug
template_folderStringFilter by folder name
archivedBooleanReturn only archived submissions when true
limitIntegerResults per page (default: 10, max: 100)
afterIntegerCursor ID — returns submissions with ID greater than this value
beforeIntegerCursor ID — returns submissions with ID less than this value
✓ 200 OK
{
  "data": [{
    "id": 42,
    "source": "api",
    "status": "completed",
    "created_at": "2026-02-19T10:00:00Z",
    "updated_at": "2026-02-19T15:30:00Z",
    "archived_at": null,
    "submitters": [{
      "id": 101,
      "email": "signer@example.com",
      "status": "completed",
      "role": "First Party"
    }],
    "template": {
      "id": 1000,
      "name": "Service Agreement"
    }
  }],
  "pagination": {
    "count": 10,
    "next": 43,
    "prev": 32
  }
}
GET /api/submissions/{id} Get a submission
ParameterTypeDescription
idrequiredIntegerThe submission ID

Returns the submission with full submitter details, document URLs, field values, and audit events. Document URLs are signed and expire after the configured period.

✓ 200 OK
{
  "id": 42,
  "source": "api",
  "status": "completed",
  "created_at": "2026-02-19T10:00:00Z",
  "updated_at": "2026-02-19T15:30:00Z",
  "submitters": [{
    "id": 101,
    "email": "signer@example.com",
    "name": "John Doe",
    "role": "First Party",
    "status": "completed",
    "completed_at": "2026-02-19T15:30:00Z",
    "embed_src": "https://app.zignature.io/s/abc123",
    "values": [
      {"field": "Full Name", "value": "John Doe"},
      {"field": "Signature", "value": "https://..."}
    ],
    "documents": [{
      "name": "contract.pdf",
      "url": "https://..."
    }]
  }],
  "template": {
    "id": 1000,
    "name": "Service Agreement"
  }
}
GET /api/submissions/{id}/documents Download signed documents
ParameterTypeDescription
idrequiredIntegerThe submission ID
✓ 200 OK
[{
  "name": "contract.pdf",
  "url": "https://app.zignature.io/blobs/...",
  "content_type": "application/pdf",
  "size": 245890
}]
POST /api/submissions Create a submission
ParameterTypeDescription
template_idrequiredIntegerTemplate to send for signing
submittersrequiredArrayList of submitters with email, role, name, phone
send_emailBooleanSend invitation emails (default: true). Set false for embedding.
send_smsBooleanSend via SMS (default: false)
orderStringpreserved (sequential) or random (parallel)
completed_redirect_urlStringRedirect URL after completion
expire_atStringExpiration date (ISO 8601)
messageObjectCustom email subject and body
bcc_completedStringBCC email for signed documents
reply_toStringReply-to email for invitation messages
external_idStringYour application-specific unique key

Submitter Properties

PropertyTypeDescription
emailStringSubmitter email address
roleStringRole name (e.g. "First Party")
nameStringSubmitter full name
phoneStringPhone number (E.164 format)
valuesObjectPre-filled field values
metadataObjectCustom key-value metadata
completedBooleanAuto-sign (mark as completed)
fieldsArrayPer-field config: name, default_value, readonly, required
✓ 200 OK
[{
  "id": 1,
  "submission_id": 42,
  "email": "signer@example.com",
  "role": "First Party",
  "status": "sent",
  "slug": "abc123",
  "embed_src": "https://app.zignature.io/s/abc123",
  "preferences": {}
}]
POST /api/submissions/init Initialize a submission

Creates a submission and returns a structured response with the submission ID and submitter details including embed_src URLs. Accepts the same parameters as POST /api/submissions. Ideal for embedded signing flows where you need the submission ID and embed URLs immediately.

ParameterTypeDescription
template_idrequiredIntegerTemplate to send for signing
submittersrequiredArrayList of submitters with email, name, role, phone
send_emailBooleanSend invitation emails (default: true). Set false for embedded signing.
send_smsBooleanSend via SMS (default: false)
orderStringpreserved (sequential) or random (parallel)
completed_redirect_urlStringRedirect URL after completion
expire_atStringExpiration date (ISO 8601)
messageObjectCustom email subject and body
✓ 200 OK
{
  "id": 42,
  "submitters": [{
    "id": 101,
    "slug": "abc123",
    "email": "signer@example.com",
    "embed_src": "https://app.zignature.io/s/abc123",
    "role": "First Party",
    "status": "sent"
  }]
}
POST /api/submissions/emails Send by email (simplified)

Simplified endpoint for sending signature requests via email. Pass submitter email addresses directly.

✓ 200 OK
[{
  "id": 102,
  "submission_id": 43,
  "email": "jane@company.com",
  "status": "sent",
  "slug": "def456",
  "embed_src": "https://app.zignature.io/s/def456"
}]
DELETE /api/submissions/{id} Archive a submission
ParameterTypeDescription
idrequiredIntegerThe submission ID (in URL path)

Archives the submission. Archived submissions can be restored from the dashboard. Returns the archived submission object.

✓ 200 OK
{
  "id": 42,
  "status": "pending",
  "archived_at": "2026-02-20T09:00:00Z"
}

Templates

Manage reusable document templates. Templates define the structure of your documents including signature fields, text inputs, and form elements.

GET /api/templates List all templates
ParameterTypeDescription
qStringSearch templates by name
folderStringFilter by folder name
archivedBooleanReturn archived templates only
external_idStringFilter by external ID
limitIntegerResults per page (default: 10, max: 100)
afterIntegerCursor ID — returns templates with ID greater than this value
beforeIntegerCursor ID — returns templates with ID less than this value
✓ 200 OK
{
  "data": [{
    "id": 1000,
    "name": "Service Agreement",
    "created_at": "2026-01-10T08:00:00Z",
    "updated_at": "2026-02-15T12:00:00Z",
    "folder_name": "Contracts",
    "fields": [{
      "name": "Full Name",
      "type": "text",
      "required": true
    }],
    "submitters": [{"name": "First Party"}],
    "author": {
      "id": 6,
      "email": "erik@zignature.io"
    }
  }],
  "pagination": {
    "count": 10,
    "next": 1001,
    "prev": 990
  }
}
GET /api/templates/{id} Get template details
ParameterTypeDescription
idrequiredIntegerThe template ID

Returns the full template object including name, fields, schema, documents, submitter roles, and configuration. Document URLs are signed and expire after the configured period.

✓ 200 OK
{
  "id": 1000,
  "name": "Service Agreement",
  "created_at": "2026-01-10T08:00:00Z",
  "updated_at": "2026-02-15T12:00:00Z",
  "folder_name": "Contracts",
  "external_id": null,
  "schema": [{
    "attachment_uuid": "a1b2c3d4",
    "name": "contract.pdf"
  }],
  "fields": [
    {"name": "Full Name", "type": "text", "required": true},
    {"name": "Signature", "type": "signature", "required": true},
    {"name": "Date", "type": "date", "required": false}
  ],
  "submitters": [{"name": "First Party", "uuid": "s1"}],
  "author": {
    "id": 6,
    "email": "erik@zignature.io"
  },
  "documents": [{
    "name": "contract.pdf",
    "url": "https://app.zignature.io/blobs/..."
  }]
}
PUT /api/templates/{id} Update a template

Update template properties including name, folder, external ID, roles, and field configurations.

ParameterTypeDescription
idrequiredIntegerThe template ID (in URL path)
nameStringUpdated template name
folder_nameStringMove template to this folder
external_idStringYour application-specific unique key
rolesArrayUpdate submitter role names
fieldsArrayUpdate field definitions
✓ 200 OK
{
  "id": 1000,
  "name": "Updated Agreement",
  "updated_at": "2026-02-20T09:00:00Z",
  "folder_name": "Contracts",
  "external_id": "ext-123"
}
POST /api/templates/{id}/clone Clone a template

Creates a full duplicate of the template including all documents, fields, and configuration.

ParameterTypeDescription
idrequiredIntegerThe template ID to clone (in URL path)
nameStringName for the cloned template
folder_nameStringFolder for the cloned template
external_idStringExternal ID for the cloned template
✓ 200 OK
{
  "id": 1001,
  "name": "Service Agreement (Copy)",
  "created_at": "2026-02-20T09:00:00Z",
  "folder_name": "Contracts",
  "fields": [...],
  "submitters": [{"name": "First Party"}]
}
POST /api/templates/{id}/submissions Create submission from template

Create a new submission directly from a template. This is a convenience endpoint — equivalent to POST /api/submissions with the template ID in the URL path instead of the request body.

ParameterTypeDescription
idrequiredIntegerThe template ID (in URL path)
submittersrequiredArrayList of submitters with email, name, role, phone
send_emailBooleanSend invitation emails (default: true)
orderStringpreserved or random
✓ 200 OK
[{
  "id": 103,
  "submission_id": 44,
  "email": "signer@example.com",
  "role": "First Party",
  "status": "sent",
  "slug": "ghi789",
  "embed_src": "https://app.zignature.io/s/ghi789"
}]
GET /api/templates/{id}/submissions List template submissions

Retrieve all submissions created from a specific template. Supports pagination.

ParameterTypeDescription
idrequiredIntegerThe template ID (in URL path)
limitIntegerResults per page (default: 10, max: 100)
afterIntegerCursor ID for pagination
beforeIntegerCursor ID for pagination
✓ 200 OK
{
  "data": [{
    "id": 42,
    "source": "api",
    "status": "pending",
    "created_at": "2026-02-19T10:00:00Z",
    "submitters": [{
      "id": 101,
      "email": "signer@example.com",
      "status": "sent"
    }],
    "template": {
      "id": 1000,
      "name": "Service Agreement"
    }
  }],
  "pagination": {
    "count": 5,
    "next": 43,
    "prev": 37
  }
}
DELETE /api/templates/{id} Archive a template
ParameterTypeDescription
idrequiredIntegerThe template ID (in URL path)

Archives the template. Archived templates can be restored from the dashboard. Returns the archived template object.

✓ 200 OK
{
  "id": 1000,
  "name": "Service Agreement",
  "archived_at": "2026-02-20T09:00:00Z"
}

Submitters

View and manage individual signers within a submission. Each submitter represents a person who needs to sign or fill out parts of the document.

GET /api/submitters List all submitters
ParameterTypeDescription
submission_idIntegerFilter by submission
qStringSearch by name, email, or phone
completed_afterStringFilter submitters completed after this date (ISO 8601)
completed_beforeStringFilter submitters completed before this date (ISO 8601)
external_idStringFilter by external ID
limitIntegerResults per page (default: 10, max: 100)
afterIntegerCursor ID — returns submitters with ID greater than this value
beforeIntegerCursor ID — returns submitters with ID less than this value
✓ 200 OK
{
  "data": [{
    "id": 101,
    "submission_id": 42,
    "email": "signer@example.com",
    "name": "John Doe",
    "role": "First Party",
    "status": "completed",
    "completed_at": "2026-02-19T15:30:00Z",
    "opened_at": "2026-02-19T14:00:00Z",
    "sent_at": "2026-02-19T10:00:00Z"
  }],
  "pagination": {
    "count": 10,
    "next": 102,
    "prev": 91
  }
}
GET /api/submitters/{id} Get submitter details
ParameterTypeDescription
idrequiredIntegerThe submitter ID

Returns the submitter with status, field values, document URLs, metadata, and audit events. Document URLs are signed and expire after the configured period.

✓ 200 OK
{
  "id": 101,
  "submission_id": 42,
  "email": "signer@example.com",
  "name": "John Doe",
  "role": "First Party",
  "slug": "abc123",
  "status": "completed",
  "sent_at": "2026-02-19T10:00:00Z",
  "opened_at": "2026-02-19T14:00:00Z",
  "completed_at": "2026-02-19T15:30:00Z",
  "embed_src": "https://app.zignature.io/s/abc123",
  "values": [
    {"field": "Full Name", "value": "John Doe"},
    {"field": "Signature", "value": "https://..."}
  ],
  "documents": [{
    "name": "contract.pdf",
    "url": "https://app.zignature.io/blobs/..."
  }],
  "metadata": {}
}
PUT /api/submitters/{id} Update a submitter
ParameterTypeDescription
idrequiredIntegerThe submitter ID (in URL path)
nameStringSubmitter full name
emailStringUpdated email address
phoneStringUpdated phone number (E.164 format)
external_idStringYour application-specific unique key
valuesObjectPre-filled field values
metadataObjectCustom key-value metadata
send_emailBooleanRe-send invitation email after update
send_smsBooleanRe-send invitation via SMS after update
completedBooleanMark submitter as completed (auto-sign)
✓ 200 OK
{
  "id": 101,
  "email": "signer@example.com",
  "name": "John Doe",
  "phone": "+15551234567",
  "status": "sent",
  "external_id": "user-456",
  "metadata": {"plan": "enterprise"},
  "updated_at": "2026-02-20T09:00:00Z"
}

Tools & Utilities

Utility endpoints for document operations like merging templates, verifying PDF signatures, and sending documents in bulk.

POST /api/tools/merge Merge multiple PDFs

Merge multiple PDF files into a single PDF document. Accepts base64-encoded PDF files and returns a single merged PDF.

ParameterTypeDescription
filesrequiredArrayArray of base64-encoded PDF files to merge (minimum 2)
✓ 200 OK
{
  "data": "JVBERi0xLjQKMS..."
}
POST /api/tools/verify Verify PDF signature

Verify the digital signature on a signed PDF document. Returns checksum verification against the Zignature database and detailed signature information including signer identity, signing reason, and certificate chain validation.

ParameterTypeDescription
filerequiredStringBase64-encoded PDF file content
✓ 200 OK
{
  "checksum_status": "verified",
  "signatures": [{
    "signer_name": "John Doe",
    "signing_reason": "Document signing",
    "signing_time": "2026-02-19T15:30:00Z",
    "signature_type": "adbe.pkcs7.detached",
    "verification_result": ["The signature is valid."]
  }]
}
POST /api/bulk_send Bulk send to multiple recipients

Send a template to multiple recipients in a single API call. Each recipient gets their own submission.

ParameterTypeDescription
template_idrequiredIntegerTemplate to send
submittersrequiredArrayArray of submitter arrays, one per recipient
✓ 200 OK
[
  {"id": 45, "status": "pending", "submitters": [{"email": "alice@example.com"}]},
  {"id": 46, "status": "pending", "submitters": [{"email": "bob@example.com"}]},
  {"id": 47, "status": "pending", "submitters": [{"email": "carol@example.com"}]}
]
POST /api/attachments Upload a file

Upload a file (PDF, DOCX, or image) and receive a URL that can be used as a file reference in other API calls such as submission creation.

ParameterTypeDescription
filerequiredFileThe file to upload (multipart/form-data)
nameStringOptional display name for the file
✓ 200 OK
{
  "id": 501,
  "uuid": "f8e7d6c5-b4a3-2019-8765-4321fedcba98",
  "url": "https://app.zignature.io/blobs/...",
  "filename": "contract.pdf",
  "content_type": "application/pdf",
  "byte_size": 245890,
  "created_at": "2026-02-20T09:00:00Z"
}

Events API

Retrieve event logs for form and submission activity. Useful for audit trails, debugging, and monitoring your integration.

GET /api/events/form/{type} List form events

Retrieve form completion events. Returns submitter data with documents and attachments. Paginated by completion timestamp.

ParameterTypeDescription
typepathStringEvent type filter: completed
afterIntegerUnix timestamp — return events after this time
beforeIntegerUnix timestamp — return events before this time
limitIntegerNumber of events to return (default: 10)
✓ 200 OK
{
  "data": [{
    "event_type": "form.completed",
    "timestamp": "2026-02-19T15:30:00Z",
    "data": {
      "id": 101,
      "email": "signer@example.com",
      "submission_id": 42,
      "status": "completed",
      "documents": ["https://app.zignature.io/blobs/..."]
    }
  }],
  "pagination": {
    "count": 1,
    "next": 1740000600,
    "prev": 1740000600
  }
}
GET /api/events/submission/{type} List submission events

Retrieve submission completion events. Only returns submissions where all submitters have completed. Paginated by completion timestamp.

ParameterTypeDescription
typepathStringEvent type filter: completed
afterIntegerUnix timestamp — return events after this time
beforeIntegerUnix timestamp — return events before this time
limitIntegerNumber of events to return (default: 10)
✓ 200 OK
{
  "data": [{
    "event_type": "submission.completed",
    "timestamp": "2026-02-19T15:30:00Z",
    "data": {
      "id": 42,
      "source": "api",
      "template_id": 1000,
      "status": "completed",
      "submitters": [{
        "email": "signer@example.com",
        "status": "completed"
      }]
    }
  }],
  "pagination": {
    "count": 1,
    "next": 1740000600,
    "prev": 1740000600
  }
}

Extension / CRM API

Powers CRM integrations (Salesforce Lightning, HubSpot, Pipedrive, Zoho CRM). Provides CRM context fetching, AI-powered field mapping, document sending, audit trails, signer management, and CRM writeback.

GET /api/extension/context Get CRM record context

Fetches CRM record data including fields, values, and related objects. Supports Salesforce, HubSpot, Pipedrive, and Zoho CRM.

ParameterTypeDescription
providerrequiredStringCRM provider: salesforce, hubspot, pipedrive, zoho_crm
record_idrequiredStringThe CRM record ID
object_typeStringCRM object type (default: Contact)
✓ 200 OK
POST /api/extension/field_mappings AI-powered field mapping

Uses AI heuristics to map CRM record fields to template fields with confidence scores. Supports line items and related records.

ParameterTypeDescription
template_idrequiredIntegerTemplate ID to map fields for
crm_fieldsrequiredObjectCRM field key-value pairs
line_itemsArrayProduct/line item data
related_recordsObjectRelated record data (Account, Contact)
✓ 200 OK
POST /api/extension/send Send document for signature

Creates a submission from a template and sends to recipients. Supports CRM field values, line items, and writeback for edited values.

ParameterTypeDescription
template_idrequiredIntegerTemplate to send
recipientsrequiredArrayList of signers (email, name)
field_valuesObjectPre-filled field values
crm_contextObjectCRM context (provider, record_id, object_type)
✓ 200 OK
GET /api/extension/documents List documents for CRM record

Returns all documents associated with a CRM record including signer status, progress, and CRM context.

✓ 200 OK
GET /api/extension/documents/{id}/audit Get document audit trail

Returns the complete audit trail for a document including sent, viewed, signed, declined, and reassigned events.

✓ 200 OK
POST /api/extension/reassign_submitter Reassign a signer

Reassigns a pending signer to a different person. Marks original as declined/reassigned, sends invitation to new signer.

ParameterTypeDescription
submitter_idrequiredIntegerSubmitter ID to reassign
emailrequiredStringNew signer email
nameStringNew signer name
reasonStringReason for reassignment
✓ 200 OK
POST /api/extension/describe_object Describe CRM object schema

Returns field schema for a CRM object type. Supports custom objects across all 4 CRM providers.

✓ 200 OK
GET /api/extension/documents/{id}/download Get document download URL

Returns a download URL for the signed document PDF.

✓ 200 OK

Deal Desk API

Enterprise-grade deal approval workflows. Query review status, approve, reject, or send back deals. Includes risk scoring, drift detection, and multi-level approval chains. Requires Enterprise plan.

GET /api/extension/deal_desk/review Get deal review status

Retrieves the current deal desk review for a CRM record including status, risk score, drift analysis, approval chain, and activity timeline.

ParameterTypeDescription
providerrequiredStringCRM provider
record_idrequiredStringCRM record ID
object_typeStringCRM object type
✓ 200 OK
{
  "id": 42,
  "status": "pending",
  "current_level": 1,
  "deal_value": 50000.00,
  "risk_score": 35,
  "drift_detected": false,
  "approvals": [{
    "level": 1,
    "status": "pending",
    "approver_type": "role"
  }]
}
POST /api/extension/deal_desk/review/{id}/approve Approve a deal review

Approves the current pending approval level. Advances to next level or completes the review if all levels approved.

ParameterTypeDescription
commentStringOptional approval comment
✓ 200 OK
POST /api/extension/deal_desk/review/{id}/reject Reject a deal review

Rejects the current pending approval level. Comment is required.

ParameterTypeDescription
commentrequiredStringRejection reason
✓ 200 OK
POST /api/extension/deal_desk/review/{id}/send_back Send back for revision

Sends a deal review back to the requester for changes. Comment is required.

ParameterTypeDescription
commentrequiredStringExplanation of what needs revision
✓ 200 OK

Webhooks

Receive real-time HTTP POST notifications when events occur. Configure webhook URLs and secrets in Settings → Webhooks.

submission.created
New submission was created
submission.completed
All submitters finished signing
submission.expired
Submission expired before completion
submission.archived
Submission was archived
form.viewed
Signing form was opened
form.started
Submitter started filling fields
form.completed
Submitter completed and signed
form.declined
Submitter declined to sign
template.created
New template was created
template.updated
Template was modified

Webhook payloads include the full object data. Verify webhook authenticity using your webhook secret with HMAC-SHA256 signature in the X-Hmac-Sha256 header.

SCIM v2 Provisioning

Automate user and group provisioning with the SCIM 2.0 API. Connect your identity provider (Okta, Azure AD, OneLogin, etc.) to automatically sync users and teams with Zignature. Requires Enterprise plan.

Base URL & Authentication

All SCIM endpoints are under /api/scim/v2. Authenticate with a SCIM Bearer token generated in Settings → SCIM Provisioning.

DetailValue
Base URLhttps://app.zignature.io/api/scim/v2
Auth headerAuthorization: Bearer YOUR_SCIM_TOKEN
Content-Typeapplication/scim+json

Discovery Endpoints

EndpointDescription
GET /ServiceProviderConfigReturns supported SCIM features (Patch, Bulk, Filter)
GET /ResourceTypesLists supported resource types: User and Group
GET /SchemasFull JSON schemas for User and Group resources

Users

GET /api/scim/v2/Users List users

Returns a paginated list of provisioned users. Supports SCIM filtering with filter parameter (e.g. userName eq "user@example.com").

ParameterTypeDescription
filterstringSCIM filter expression (e.g. userName eq "user@example.com")
startIndexinteger1-based pagination offset (default: 1)
countintegerNumber of results per page (default: 100)
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
  "totalResults": 2,
  "startIndex": 1,
  "itemsPerPage": 100,
  "Resources": [{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "userName": "jane@example.com",
    "name": { "givenName": "Jane", "familyName": "Smith" },
    "emails": [{ "value": "jane@example.com", "primary": true }],
    "active": true
  }]
}
GET /api/scim/v2/Users/{id} Get user

Retrieve a single user by their UUID.

✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "userName": "jane@example.com",
  "name": { "givenName": "Jane", "familyName": "Smith" },
  "emails": [{ "value": "jane@example.com", "primary": true }],
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-01-15T08:00:00Z",
    "lastModified": "2026-02-19T12:30:00Z"
  }
}
POST /api/scim/v2/Users Create user

Provision a new user in the account. If a previously archived user matches the email, they will be reactivated.

ParameterTypeDescription
userName requiredstringUser’s email address
name.givenNamestringFirst name
name.familyNamestringLast name
emailsarrayArray of email objects with value and primary fields
✓ 201 Created
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "userName": "newuser@example.com",
  "name": { "givenName": "New", "familyName": "User" },
  "emails": [{ "value": "newuser@example.com", "primary": true }],
  "active": true
}
PUT /api/scim/v2/Users/{id} Replace user

Full replacement of a user resource. Setting active: false archives the user.

ParameterTypeDescription
userName requiredstringUser’s email address
name.givenNamestringFirst name
name.familyNamestringLast name
activebooleanSet to false to deactivate/archive
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "userName": "jane@example.com",
  "active": true
}
PATCH /api/scim/v2/Users/{id} Update user

Partial update using SCIM Patch operations. Supported ops: add, replace.

ParameterTypeDescription
Operations requiredarrayArray of patch operations with op, path, and value
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "userName": "jane@example.com",
  "active": false
}
DELETE /api/scim/v2/Users/{id} Delete user

Archive (soft-delete) a user. The user can be reactivated by creating a new user with the same email.

✓ 204 No Content

Groups

GET /api/scim/v2/Groups List groups

Returns a paginated list of groups (teams). Supports SCIM filtering with filter parameter.

ParameterTypeDescription
filterstringSCIM filter expression (e.g. displayName eq "Engineering")
startIndexinteger1-based pagination offset (default: 1)
countintegerNumber of results per page (default: 100)
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
  "totalResults": 1,
  "Resources": [{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
    "displayName": "Engineering",
    "members": [
      { "value": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "display": "jane@example.com" }
    ]
  }]
}
GET /api/scim/v2/Groups/{id} Get group

Retrieve a single group (team) by UUID, including its member list.

✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
  "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "displayName": "Engineering",
  "members": [
    { "value": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "display": "jane@example.com" }
  ],
  "meta": {
    "resourceType": "Group",
    "created": "2026-01-10T09:00:00Z",
    "lastModified": "2026-02-20T14:00:00Z"
  }
}
POST /api/scim/v2/Groups Create group

Create a new group (team) and optionally assign members by their user UUIDs.

ParameterTypeDescription
displayName requiredstringName of the group/team
membersarrayArray of objects with value (user UUID)
✓ 201 Created
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
  "id": "d4e5f6a7-b8c9-0123-defa-234567890123",
  "displayName": "Sales",
  "members": []
}
PUT /api/scim/v2/Groups/{id} Replace group

Full replacement of a group resource. Replaces the group name and entire member list.

ParameterTypeDescription
displayName requiredstringGroup name
membersarrayComplete member list (replaces existing)
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
  "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "displayName": "Engineering",
  "members": [
    { "value": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "display": "jane@example.com" }
  ]
}
PATCH /api/scim/v2/Groups/{id} Update group

Partial update using SCIM Patch operations. Supports add, replace, and remove operations. Use path-based filtering to remove specific members (e.g. members[value eq "uuid"]).

ParameterTypeDescription
Operations requiredarrayArray of patch operations with op, path, and value
✓ 200 OK
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
  "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
  "displayName": "Engineering",
  "members": [
    { "value": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "display": "jane@example.com" },
    { "value": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "display": "newuser@example.com" }
  ]
}
DELETE /api/scim/v2/Groups/{id} Delete group

Archive (soft-delete) a group and remove all member associations.

✓ 204 No Content

SDKs & Libraries

Use the Zignature API with your preferred language. All code examples use standard HTTP libraries — no SDK installation required.

JavaScript
📜TypeScript
🐍Python
🔴Ruby
PHP
Java
🖥C#
🐧Go

MCP Server

Connect AI assistants like Claude, ChatGPT, Gemini, Cursor, and VS Code Copilot to Zignature. Manage templates, send documents, handle contracts, run Deal Desk approvals, manage users and teams — all through natural language.

Endpoint

POST https://app.zignature.io/mcp

Protocol

JSON-RPC 2.0 · MCP version 2025-03-26

Transport

Streamable HTTP (single endpoint)

Tools Available

57 tools across 10 categories — full platform control

MCP Authentication

The MCP server uses the same API token as the REST API. Pass it via the X-Auth-Token header in your MCP client configuration.

HeaderValueDescription
X-Auth-Token requiredstringYour Zignature API token. Found in Settings → API.
Content-Type requiredstringMust be application/json

Available Tools

The MCP server exposes 57 tools across 10 categories. AI assistants can manage your entire Zignature account.

Templates (8 tools)

ToolDescriptionKey Parameters
list_templatesList templates with search and folder filteringquery, folder
get_templateGet template details, fields, and rolestemplate_id
create_templateCreate a new template with rolesname
update_templateUpdate name or move to foldertemplate_id
archive_templateArchive a templatetemplate_id
restore_templateRestore an archived templatetemplate_id
clone_templateClone a template with all fieldstemplate_id
suggest_templateFind templates by descriptiondescription

Folders (3 tools)

ToolDescriptionKey Parameters
list_foldersList all template folders
create_folderCreate a new foldername
rename_folderRename an existing folderfolder_id, name

Documents & Signing (9 tools)

ToolDescriptionKey Parameters
send_documentSend document for signaturetemplate_id, submitters
bulk_send_documentSend to up to 100 recipientstemplate_id, recipients
list_documentsList submissions with status filtersstatus, query
get_document_statusDetailed signer progresssubmission_id
void_documentCancel a pending documentsubmission_id
download_documentGet signed PDF download URLssubmission_id
get_audit_trailFull event timeline with IPssubmission_id
send_reminderRemind pending signerssubmission_id
archive_documentArchive a submissionsubmission_id

Users & Teams (7 tools)

ToolDescriptionKey Parameters
list_usersList account usersstatus, role
invite_userInvite a new useremail
update_userUpdate user name or roleuser_id
deactivate_userDeactivate a useruser_id
list_teamsList all teams
create_teamCreate a new teamname
manage_team_membersAdd or remove team membersteam_id, action, user_id

Webhooks (5 tools)

ToolDescriptionKey Parameters
list_webhooksList webhook endpoints
create_webhookCreate a webhookurl
update_webhookUpdate webhook URLwebhook_id, url
delete_webhookDelete a webhookwebhook_id
test_webhookSend test eventwebhook_id

Account, Branding & Billing (4 tools)

ToolDescriptionKey Parameters
get_accountAccount details, branding, subscription
update_accountUpdate name, timezone, localename, timezone
update_brandingChange brand colorprimary_color
get_billingPlan, usage, subscription status

Contracts / CLM (8 tools)

ToolDescriptionKey Parameters
list_contractsList contracts with filtersstatus, counterparty
get_contractFull contract details with parties and versionscontract_id
create_contractCreate a draft contracttitle
update_contractUpdate contract detailscontract_id
transition_contractChange contract statuscontract_id, new_status
delete_contractDelete a contractcontract_id
get_contract_dashboardPipeline stats and trends
promote_submission_to_contractCreate contract from signed docsubmission_id

Deal Desk (6 tools)

ToolDescriptionKey Parameters
get_deal_desk_dashboardPending reviews, approval rates, pipeline
list_deal_desk_reviewsList reviews with filtersstatus, risk_level
get_deal_desk_reviewFull review with approvalsreview_id
action_deal_desk_reviewApprove, reject, or send backreview_id, action
list_deal_desk_policiesList approval policies
get_deal_desk_analyticsApproval rates and trendsperiod

Clause Library (4 tools)

ToolDescriptionKey Parameters
list_clausesList clauses with category/searchcategory, query
create_clauseAdd a clause to the librarytitle, content
update_clauseUpdate an existing clauseclause_id
delete_clauseRemove a clauseclause_id

Other (3 tools)

ToolDescriptionKey Parameters
list_notificationsRecent user notificationsunread_only
get_submission_eventsDetailed event logsubmission_id
search_contactsSearch past recipientsquery

Setup Guides

Add Zignature to your AI assistant with a simple configuration snippet. Replace YOUR_API_TOKEN with your actual API token.

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "zignature": {
      "url": "https://app.zignature.io/mcp",
      "headers": {
        "X-Auth-Token": "YOUR_API_TOKEN"
      }
    }
  }
}

Claude Code CLI

Run from your terminal:

claude mcp add zignature \
  --transport http \
  --url https://app.zignature.io/mcp \
  --header "X-Auth-Token: YOUR_API_TOKEN"

Cursor

Add to .cursor/mcp.json in your project:

{
  "mcpServers": {
    "zignature": {
      "url": "https://app.zignature.io/mcp",
      "headers": {
        "X-Auth-Token": "YOUR_API_TOKEN"
      }
    }
  }
}

VS Code (Copilot)

Add to .vscode/mcp.json in your project:

{
  "servers": {
    "zignature": {
      "type": "http",
      "url": "https://app.zignature.io/mcp",
      "headers": {
        "X-Auth-Token": "YOUR_API_TOKEN"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "zignature": {
      "serverUrl": "https://app.zignature.io/mcp",
      "headers": {
        "X-Auth-Token": "YOUR_API_TOKEN"
      }
    }
  }
}

Gemini (Google AI Studio)

In Google AI Studio, go to Tools → Add MCP Server and enter:

URL: https://app.zignature.io/mcp
Header: X-Auth-Token: YOUR_API_TOKEN

Gemini will discover all 57 tools automatically via the MCP protocol.

ChatGPT (Custom GPT Actions)

ChatGPT connects to Zignature through GPT Actions using the REST API with an OpenAPI spec. This lets your Custom GPT list templates, send documents, check statuses, and download signed PDFs.

Setup Steps

  1. Go to chatgpt.com/gpts/editor and create a new GPT.
  2. Click Configure → Create new action.
  3. Click Import from URL and paste: https://app.zignature.io/openapi/chatgpt
  4. Under Authentication, select API Key, set Header to X-Auth-Token, and paste your API token.
  5. Save your GPT and start using it — say “List my templates” or “Send an NDA to alice@example.com”.

OpenAPI Spec URL: https://app.zignature.io/openapi/chatgpt

API Pricing $0.20 per document · Volume discounts from $0.10/doc · Sandbox always free
View Full Pricing →