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.
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.
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.
| Status | Meaning | Description |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource successfully created |
| 401 | Unauthorized | Missing or invalid X-Auth-Token header |
| 403 | Forbidden | Authenticated but not authorized to access this resource |
| 404 | Not Found | The requested resource does not exist |
| 422 | Unprocessable | Validation failed — check the error field in the response body |
| 429 | Too Many Requests | Rate limit exceeded — wait before retrying |
| 500 | Server Error | An 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
| Endpoint | Method | Description |
|---|---|---|
| /oauth/authorize | GET | Display consent screen to the user |
| /oauth/token | POST | Exchange authorization code or refresh token for an access token |
| /oauth/revoke | POST | Revoke an access or refresh token |
Authorization Flow
Create an application in Developer Portal → OAuth Apps. You’ll receive a client_id and client_secret.
Send the user to /oauth/authorize with your client_id, redirect_uri, response_type=code, and requested scope.
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.
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.
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
| Scope | Description |
|---|---|
| templates:read | View templates and their fields |
| templates:write | Create, edit, and archive templates |
| submissions:read | View submissions, documents, and signer status |
| submissions:write | Send documents, create submissions, and manage signers |
| webhooks:read | View webhook endpoints and delivery logs |
| webhooks:manage | Create, update, and delete webhook endpoints |
| account:read | View account info and team members |
| account:manage | Manage account settings, users, and billing |
Token Details
| Parameter | Value |
|---|---|
| Access token lifetime | 2 hours (7200 seconds) |
| Authorization code lifetime | 10 minutes (600 seconds) |
| Refresh token | Returned with every token exchange; use to obtain a new access token |
| Client authentication | Via request body params or HTTP Basic Auth (client_id:client_secret) |
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.
| Parameter | Type | Description |
|---|---|---|
| client_id required | string | Your OAuth application’s client ID |
| redirect_uri required | string | Must match one of the registered redirect URIs for your app |
| response_type required | string | Must be code |
| scope | string | Space-separated list of scopes (e.g. templates:read submissions:write) |
| state | string | Opaque value for CSRF protection; returned unchanged in the callback |
Location: https://yourapp.com/callback?code=abc123def456&state=random_csrf_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.
| Parameter | Type | Description |
|---|---|---|
| grant_type required | string | authorization_code or refresh_token |
| code | string | The authorization code (required when grant_type=authorization_code) |
| refresh_token | string | The refresh token (required when grant_type=refresh_token) |
| client_id required | string | Your OAuth application’s client ID |
| client_secret required | string | Your OAuth application’s client secret |
| redirect_uri | string | Required when grant_type=authorization_code; must match the original |
{
"access_token": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
"token_type": "Bearer",
"expires_in": 7200,
"refresh_token": "f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5",
"scope": "templates:read submissions:write",
"created_at": 1740000000
}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.
| Parameter | Type | Description |
|---|---|---|
| token required | string | The access token or refresh token to revoke |
| client_id required | string | Your OAuth application’s client ID |
| client_secret required | string | Your OAuth application’s client secret |
{}Account
Retrieve information about the currently authenticated API user and account.
Returns the currently authenticated user's profile and account details. Useful for verifying API token validity and retrieving account configuration.
{
"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.
Go to Settings → API in your dashboard and copy your token.
Upload a PDF or build from scratch in the template editor. Note the template ID.
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
Embed Events
Listen for signing events from the embedded form using window.addEventListener('message', ...). Events include:
| Event | Description |
|---|---|
| completed | Submitter finished signing the document |
| declined | Submitter declined to sign |
| loaded | Signing 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.
| Parameter | Type | Description |
|---|---|---|
| template_id | Integer | Filter by template |
| status | String | Filter: pending, completed, declined, expired |
| q | String | Search by name, email, or phone |
| slug | String | Filter by unique submission slug |
| template_folder | String | Filter by folder name |
| archived | Boolean | Return only archived submissions when true |
| limit | Integer | Results per page (default: 10, max: 100) |
| after | Integer | Cursor ID — returns submissions with ID greater than this value |
| before | Integer | Cursor ID — returns submissions with ID less than this value |
{
"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
}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The 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.
{
"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"
}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The submission ID |
[{
"name": "contract.pdf",
"url": "https://app.zignature.io/blobs/...",
"content_type": "application/pdf",
"size": 245890
}]| Parameter | Type | Description |
|---|---|---|
| template_idrequired | Integer | Template to send for signing |
| submittersrequired | Array | List of submitters with email, role, name, phone |
| send_email | Boolean | Send invitation emails (default: true). Set false for embedding. |
| send_sms | Boolean | Send via SMS (default: false) |
| order | String | preserved (sequential) or random (parallel) |
| completed_redirect_url | String | Redirect URL after completion |
| expire_at | String | Expiration date (ISO 8601) |
| message | Object | Custom email subject and body |
| bcc_completed | String | BCC email for signed documents |
| reply_to | String | Reply-to email for invitation messages |
| external_id | String | Your application-specific unique key |
Submitter Properties
| Property | Type | Description |
|---|---|---|
| String | Submitter email address | |
| role | String | Role name (e.g. "First Party") |
| name | String | Submitter full name |
| phone | String | Phone number (E.164 format) |
| values | Object | Pre-filled field values |
| metadata | Object | Custom key-value metadata |
| completed | Boolean | Auto-sign (mark as completed) |
| fields | Array | Per-field config: name, default_value, readonly, required |
[{
"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": {}
}]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.
| Parameter | Type | Description |
|---|---|---|
| template_idrequired | Integer | Template to send for signing |
| submittersrequired | Array | List of submitters with email, name, role, phone |
| send_email | Boolean | Send invitation emails (default: true). Set false for embedded signing. |
| send_sms | Boolean | Send via SMS (default: false) |
| order | String | preserved (sequential) or random (parallel) |
| completed_redirect_url | String | Redirect URL after completion |
| expire_at | String | Expiration date (ISO 8601) |
| message | Object | Custom email subject and body |
{
"id": 42,
"submitters": [{
"id": 101,
"slug": "abc123",
"email": "signer@example.com",
"embed_src": "https://app.zignature.io/s/abc123",
"role": "First Party",
"status": "sent"
}]
}Simplified endpoint for sending signature requests via email. Pass submitter email addresses directly.
[{
"id": 102,
"submission_id": 43,
"email": "jane@company.com",
"status": "sent",
"slug": "def456",
"embed_src": "https://app.zignature.io/s/def456"
}]| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The submission ID (in URL path) |
Archives the submission. Archived submissions can be restored from the dashboard. Returns the archived submission object.
{
"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.
| Parameter | Type | Description |
|---|---|---|
| q | String | Search templates by name |
| folder | String | Filter by folder name |
| archived | Boolean | Return archived templates only |
| external_id | String | Filter by external ID |
| limit | Integer | Results per page (default: 10, max: 100) |
| after | Integer | Cursor ID — returns templates with ID greater than this value |
| before | Integer | Cursor ID — returns templates with ID less than this value |
{
"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
}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The 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.
{
"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/..."
}]
}Update template properties including name, folder, external ID, roles, and field configurations.
| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The template ID (in URL path) |
| name | String | Updated template name |
| folder_name | String | Move template to this folder |
| external_id | String | Your application-specific unique key |
| roles | Array | Update submitter role names |
| fields | Array | Update field definitions |
{
"id": 1000,
"name": "Updated Agreement",
"updated_at": "2026-02-20T09:00:00Z",
"folder_name": "Contracts",
"external_id": "ext-123"
}Creates a full duplicate of the template including all documents, fields, and configuration.
| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The template ID to clone (in URL path) |
| name | String | Name for the cloned template |
| folder_name | String | Folder for the cloned template |
| external_id | String | External ID for the cloned template |
{
"id": 1001,
"name": "Service Agreement (Copy)",
"created_at": "2026-02-20T09:00:00Z",
"folder_name": "Contracts",
"fields": [...],
"submitters": [{"name": "First Party"}]
}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.
| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The template ID (in URL path) |
| submittersrequired | Array | List of submitters with email, name, role, phone |
| send_email | Boolean | Send invitation emails (default: true) |
| order | String | preserved or random |
[{
"id": 103,
"submission_id": 44,
"email": "signer@example.com",
"role": "First Party",
"status": "sent",
"slug": "ghi789",
"embed_src": "https://app.zignature.io/s/ghi789"
}]Retrieve all submissions created from a specific template. Supports pagination.
| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The template ID (in URL path) |
| limit | Integer | Results per page (default: 10, max: 100) |
| after | Integer | Cursor ID for pagination |
| before | Integer | Cursor ID for pagination |
{
"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
}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The template ID (in URL path) |
Archives the template. Archived templates can be restored from the dashboard. Returns the archived template object.
{
"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.
| Parameter | Type | Description |
|---|---|---|
| submission_id | Integer | Filter by submission |
| q | String | Search by name, email, or phone |
| completed_after | String | Filter submitters completed after this date (ISO 8601) |
| completed_before | String | Filter submitters completed before this date (ISO 8601) |
| external_id | String | Filter by external ID |
| limit | Integer | Results per page (default: 10, max: 100) |
| after | Integer | Cursor ID — returns submitters with ID greater than this value |
| before | Integer | Cursor ID — returns submitters with ID less than this value |
{
"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
}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The 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.
{
"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": {}
}| Parameter | Type | Description |
|---|---|---|
| idrequired | Integer | The submitter ID (in URL path) |
| name | String | Submitter full name |
| String | Updated email address | |
| phone | String | Updated phone number (E.164 format) |
| external_id | String | Your application-specific unique key |
| values | Object | Pre-filled field values |
| metadata | Object | Custom key-value metadata |
| send_email | Boolean | Re-send invitation email after update |
| send_sms | Boolean | Re-send invitation via SMS after update |
| completed | Boolean | Mark submitter as completed (auto-sign) |
{
"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.
Merge multiple PDF files into a single PDF document. Accepts base64-encoded PDF files and returns a single merged PDF.
| Parameter | Type | Description |
|---|---|---|
| filesrequired | Array | Array of base64-encoded PDF files to merge (minimum 2) |
{
"data": "JVBERi0xLjQKMS..."
}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.
| Parameter | Type | Description |
|---|---|---|
| filerequired | String | Base64-encoded PDF file content |
{
"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."]
}]
}Send a template to multiple recipients in a single API call. Each recipient gets their own submission.
| Parameter | Type | Description |
|---|---|---|
| template_idrequired | Integer | Template to send |
| submittersrequired | Array | Array of submitter arrays, one per recipient |
[
{"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"}]}
]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.
| Parameter | Type | Description |
|---|---|---|
| filerequired | File | The file to upload (multipart/form-data) |
| name | String | Optional display name for the file |
{
"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.
Retrieve form completion events. Returns submitter data with documents and attachments. Paginated by completion timestamp.
| Parameter | Type | Description |
|---|---|---|
| typepath | String | Event type filter: completed |
| after | Integer | Unix timestamp — return events after this time |
| before | Integer | Unix timestamp — return events before this time |
| limit | Integer | Number of events to return (default: 10) |
{
"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
}
}Retrieve submission completion events. Only returns submissions where all submitters have completed. Paginated by completion timestamp.
| Parameter | Type | Description |
|---|---|---|
| typepath | String | Event type filter: completed |
| after | Integer | Unix timestamp — return events after this time |
| before | Integer | Unix timestamp — return events before this time |
| limit | Integer | Number of events to return (default: 10) |
{
"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.
Fetches CRM record data including fields, values, and related objects. Supports Salesforce, HubSpot, Pipedrive, and Zoho CRM.
| Parameter | Type | Description |
|---|---|---|
| providerrequired | String | CRM provider: salesforce, hubspot, pipedrive, zoho_crm |
| record_idrequired | String | The CRM record ID |
| object_type | String | CRM object type (default: Contact) |
Uses AI heuristics to map CRM record fields to template fields with confidence scores. Supports line items and related records.
| Parameter | Type | Description |
|---|---|---|
| template_idrequired | Integer | Template ID to map fields for |
| crm_fieldsrequired | Object | CRM field key-value pairs |
| line_items | Array | Product/line item data |
| related_records | Object | Related record data (Account, Contact) |
Creates a submission from a template and sends to recipients. Supports CRM field values, line items, and writeback for edited values.
| Parameter | Type | Description |
|---|---|---|
| template_idrequired | Integer | Template to send |
| recipientsrequired | Array | List of signers (email, name) |
| field_values | Object | Pre-filled field values |
| crm_context | Object | CRM context (provider, record_id, object_type) |
Returns all documents associated with a CRM record including signer status, progress, and CRM context.
Returns the complete audit trail for a document including sent, viewed, signed, declined, and reassigned events.
Reassigns a pending signer to a different person. Marks original as declined/reassigned, sends invitation to new signer.
| Parameter | Type | Description |
|---|---|---|
| submitter_idrequired | Integer | Submitter ID to reassign |
| emailrequired | String | New signer email |
| name | String | New signer name |
| reason | String | Reason for reassignment |
Returns field schema for a CRM object type. Supports custom objects across all 4 CRM providers.
Returns a download URL for the signed document PDF.
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.
Retrieves the current deal desk review for a CRM record including status, risk score, drift analysis, approval chain, and activity timeline.
| Parameter | Type | Description |
|---|---|---|
| providerrequired | String | CRM provider |
| record_idrequired | String | CRM record ID |
| object_type | String | CRM object type |
{
"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"
}]
}Approves the current pending approval level. Advances to next level or completes the review if all levels approved.
| Parameter | Type | Description |
|---|---|---|
| comment | String | Optional approval comment |
Rejects the current pending approval level. Comment is required.
| Parameter | Type | Description |
|---|---|---|
| commentrequired | String | Rejection reason |
Sends a deal review back to the requester for changes. Comment is required.
| Parameter | Type | Description |
|---|---|---|
| commentrequired | String | Explanation of what needs revision |
Webhooks
Receive real-time HTTP POST notifications when events occur. Configure webhook URLs and secrets in Settings → Webhooks.
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.
| Detail | Value |
|---|---|
| Base URL | https://app.zignature.io/api/scim/v2 |
| Auth header | Authorization: Bearer YOUR_SCIM_TOKEN |
| Content-Type | application/scim+json |
Discovery Endpoints
| Endpoint | Description |
|---|---|
| GET /ServiceProviderConfig | Returns supported SCIM features (Patch, Bulk, Filter) |
| GET /ResourceTypes | Lists supported resource types: User and Group |
| GET /Schemas | Full JSON schemas for User and Group resources |
Users
Returns a paginated list of provisioned users. Supports SCIM filtering with filter parameter (e.g. userName eq "user@example.com").
| Parameter | Type | Description |
|---|---|---|
| filter | string | SCIM filter expression (e.g. userName eq "user@example.com") |
| startIndex | integer | 1-based pagination offset (default: 1) |
| count | integer | Number of results per page (default: 100) |
{
"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
}]
}Retrieve a single user by their UUID.
{
"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"
}
}Provision a new user in the account. If a previously archived user matches the email, they will be reactivated.
| Parameter | Type | Description |
|---|---|---|
| userName required | string | User’s email address |
| name.givenName | string | First name |
| name.familyName | string | Last name |
| emails | array | Array of email objects with value and primary fields |
{
"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
}Full replacement of a user resource. Setting active: false archives the user.
| Parameter | Type | Description |
|---|---|---|
| userName required | string | User’s email address |
| name.givenName | string | First name |
| name.familyName | string | Last name |
| active | boolean | Set to false to deactivate/archive |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"userName": "jane@example.com",
"active": true
}Partial update using SCIM Patch operations. Supported ops: add, replace.
| Parameter | Type | Description |
|---|---|---|
| Operations required | array | Array of patch operations with op, path, and value |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"userName": "jane@example.com",
"active": false
}Archive (soft-delete) a user. The user can be reactivated by creating a new user with the same email.
Groups
Returns a paginated list of groups (teams). Supports SCIM filtering with filter parameter.
| Parameter | Type | Description |
|---|---|---|
| filter | string | SCIM filter expression (e.g. displayName eq "Engineering") |
| startIndex | integer | 1-based pagination offset (default: 1) |
| count | integer | Number of results per page (default: 100) |
{
"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" }
]
}]
}Retrieve a single group (team) by UUID, including its member list.
{
"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"
}
}Create a new group (team) and optionally assign members by their user UUIDs.
| Parameter | Type | Description |
|---|---|---|
| displayName required | string | Name of the group/team |
| members | array | Array of objects with value (user UUID) |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"id": "d4e5f6a7-b8c9-0123-defa-234567890123",
"displayName": "Sales",
"members": []
}Full replacement of a group resource. Replaces the group name and entire member list.
| Parameter | Type | Description |
|---|---|---|
| displayName required | string | Group name |
| members | array | Complete member list (replaces existing) |
{
"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" }
]
}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"]).
| Parameter | Type | Description |
|---|---|---|
| Operations required | array | Array of patch operations with op, path, and value |
{
"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" }
]
}Archive (soft-delete) a group and remove all member associations.
SDKs & Libraries
Use the Zignature API with your preferred language. All code examples use standard HTTP libraries — no SDK installation required.
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.
POST https://app.zignature.io/mcp
JSON-RPC 2.0 · MCP version 2025-03-26
Streamable HTTP (single endpoint)
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.
| Header | Value | Description |
|---|---|---|
| X-Auth-Token required | string | Your Zignature API token. Found in Settings → API. |
| Content-Type required | string | Must 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)
| Tool | Description | Key Parameters |
|---|---|---|
| list_templates | List templates with search and folder filtering | query, folder |
| get_template | Get template details, fields, and roles | template_id |
| create_template | Create a new template with roles | name |
| update_template | Update name or move to folder | template_id |
| archive_template | Archive a template | template_id |
| restore_template | Restore an archived template | template_id |
| clone_template | Clone a template with all fields | template_id |
| suggest_template | Find templates by description | description |
Folders (3 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_folders | List all template folders | — |
| create_folder | Create a new folder | name |
| rename_folder | Rename an existing folder | folder_id, name |
Documents & Signing (9 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| send_document | Send document for signature | template_id, submitters |
| bulk_send_document | Send to up to 100 recipients | template_id, recipients |
| list_documents | List submissions with status filters | status, query |
| get_document_status | Detailed signer progress | submission_id |
| void_document | Cancel a pending document | submission_id |
| download_document | Get signed PDF download URLs | submission_id |
| get_audit_trail | Full event timeline with IPs | submission_id |
| send_reminder | Remind pending signers | submission_id |
| archive_document | Archive a submission | submission_id |
Users & Teams (7 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_users | List account users | status, role |
| invite_user | Invite a new user | email |
| update_user | Update user name or role | user_id |
| deactivate_user | Deactivate a user | user_id |
| list_teams | List all teams | — |
| create_team | Create a new team | name |
| manage_team_members | Add or remove team members | team_id, action, user_id |
Webhooks (5 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_webhooks | List webhook endpoints | — |
| create_webhook | Create a webhook | url |
| update_webhook | Update webhook URL | webhook_id, url |
| delete_webhook | Delete a webhook | webhook_id |
| test_webhook | Send test event | webhook_id |
Account, Branding & Billing (4 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| get_account | Account details, branding, subscription | — |
| update_account | Update name, timezone, locale | name, timezone |
| update_branding | Change brand color | primary_color |
| get_billing | Plan, usage, subscription status | — |
Contracts / CLM (8 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_contracts | List contracts with filters | status, counterparty |
| get_contract | Full contract details with parties and versions | contract_id |
| create_contract | Create a draft contract | title |
| update_contract | Update contract details | contract_id |
| transition_contract | Change contract status | contract_id, new_status |
| delete_contract | Delete a contract | contract_id |
| get_contract_dashboard | Pipeline stats and trends | — |
| promote_submission_to_contract | Create contract from signed doc | submission_id |
Deal Desk (6 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| get_deal_desk_dashboard | Pending reviews, approval rates, pipeline | — |
| list_deal_desk_reviews | List reviews with filters | status, risk_level |
| get_deal_desk_review | Full review with approvals | review_id |
| action_deal_desk_review | Approve, reject, or send back | review_id, action |
| list_deal_desk_policies | List approval policies | — |
| get_deal_desk_analytics | Approval rates and trends | period |
Clause Library (4 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_clauses | List clauses with category/search | category, query |
| create_clause | Add a clause to the library | title, content |
| update_clause | Update an existing clause | clause_id |
| delete_clause | Remove a clause | clause_id |
Other (3 tools)
| Tool | Description | Key Parameters |
|---|---|---|
| list_notifications | Recent user notifications | unread_only |
| get_submission_events | Detailed event log | submission_id |
| search_contacts | Search past recipients | query |
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
- Go to chatgpt.com/gpts/editor and create a new GPT.
- Click Configure → Create new action.
- Click Import from URL and paste:
https://app.zignature.io/openapi/chatgpt - Under Authentication, select API Key, set Header to
X-Auth-Token, and paste your API token. - 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