Easy Sign API

Automate signature requests and verify documents with a single API call. Perfect for AI agents, scripts, and integrations.

Quick Start

1

Create an API Key

Go to Settings → API Keys and create a new key.

2

Prepare Your Document

Have a PDF ready (URL or base64 encoded). Max 2MB, 10 pages.

3

Send a Request

Call the API endpoint to create and send a signature request.

Authentication

All API requests require an API key passed in the Authorization header:

Authorization: Bearer es_live_your_api_key_here

Send Signature Request

POST/api/agent/sign-request

Create and send a signature request in a single call.

Request Example (cURL)

Request
curl -X POST https://easy-sign.ca/api/agent/sign-request \
  -H "Authorization: Bearer es_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": {
      "email": "me@example.com",
      "name": "John Doe"
    },
    "recipient": {
      "email": "client@example.com",
      "name": "Jane Smith"
    },
    "document": {
      "url": "https://example.com/contract.pdf"
    },
    "fields": [
      {
        "type": "signature",
        "page": 1,
        "preset": "signature_bottom_right"
      },
      {
        "type": "date",
        "page": 1,
        "preset": "date_after_signature"
      }
    ],
    "envelope_name": "Contract Agreement"
  }'

Request Parameters

ParameterTypeDescription
sender.emailstringSender's email address (required)
sender.namestringSender's name (optional)
recipient.emailstringRecipient's email address (required)
recipient.namestringRecipient's name (optional)
document.urlstringPublic URL to PDF document
document.base64stringBase64 encoded PDF content
document.file_namestringFile name (optional, auto-detected)
fieldsarrayArray of signature fields (required)
envelope_namestringCustom name for the envelope (optional)

Field Configuration

Each field requires a type, page number, and position (using preset or custom coordinates).

Field Types

  • signature - Signature field
  • signature_date - Signature with date
  • date - Date only

Position Presets

  • signature_bottom_right
  • signature_bottom_left
  • signature_bottom_center
  • date_after_signature
  • signature_footer

For custom positioning, use the position object:

{
  "type": "signature",
  "page": 1,
  "position": {
    "x": 60,      // X position (0-100%)
    "y": 85,      // Y position (0-100%)
    "width": 25,  // Width (1-50%)
    "height": 8   // Height (1-20%)
  }
}

Success Response

Response
{
  "success": true,
  "envelope_id": "550e8400-e29b-41d4-a716-446655440000",
  "signing_url": "https://easy-sign.ca/sign/550e8400...?token=abc123",
  "expires_at": "2026-02-06T12:00:00.000Z",
  "recipient_email": "client@example.com"
}

Error Response

Response
{
  "success": false,
  "error": {
    "code": "INVALID_EMAIL",
    "message": "Valid sender email is required"
  }
}

Verify Document

POST/api/verify

Verify the authenticity and integrity of signed documents. No authentication required (public API).

Verification Types

  • transaction_only - Verify Transaction ID exists in our records
  • full - Upload PDF for complete integrity check (SHA-256 hash comparison)

Request Example (JSON)

Request
curl -X POST https://easy-sign.ca/api/verify \
  -H "Content-Type: application/json" \
  -d '{ "transactionId": "ES-20241206-ABC12345" }'

Request Example (with File Verification)

Request
curl -X POST https://easy-sign.ca/api/verify \
  -F "file=@signed-document.pdf" \
  -F "transactionId=ES-20241206-ABC12345"

Request Parameters

ParameterTypeDescription
transactionIdstringTransaction ID (format: ES-YYYYMMDD-XXXXXXXX). Found on signed documents.
fileFileOptional: Upload the signed PDF for full integrity verification

Success Response (Full Verification)

Response
{
  "verified": true,
  "transactionId": "ES-20241206-ABC12345",
  "status": "valid",
  "verificationType": "full",
  "message": "Document verified successfully. File integrity confirmed - no modifications detected.",
  "details": {
    "envelopeName": "Contract Agreement",
    "status": "completed",
    "createdAt": "2024-12-06T10:00:00Z",
    "completedAt": "2024-12-06T11:30:00Z",
    "recipientCount": 1,
    "signedCount": 1,
    "documentCount": 1
  }
}

Status Values

StatusDescription
validDocument is fully signed and verified. Integrity check passed (if file was uploaded).
pendingDocument exists but signing is not yet complete.
not_foundTransaction ID does not exist in our records.
tamperedFile has been modified. Hash does not match the original signed document.

Tampered Document Response

Response
{
  "verified": false,
  "transactionId": "ES-20241206-ABC12345",
  "status": "tampered",
  "verificationType": "full",
  "message": "Document has been modified. The uploaded file does not match the original signed document."
}

AI Skills Integration

Configure AI agents like Claude Code, MCP tools, or custom AI assistants to send signature requests on your behalf. Perfect for automating document workflows through natural language commands.

Claude Code Skill

Save the following as .claude/commands/easy-sign.md in your project or home directory:

.claude/commands/easy-sign.md
---
name: send-signature-request
description: Send a document for electronic signature via Easy Sign API
---

# Send Signature Request

Use this skill when the user wants to send a PDF document for electronic signature.

## Prerequisites
- Easy Sign API key stored in $EASY_SIGN_API_KEY
- PDF document (URL or local file path)

## Usage
Call the Easy Sign API to send a signature request:

```bash
curl -X POST https://easy-sign.ca/api/agent/sign-request \
  -H "Authorization: Bearer $EASY_SIGN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": { "email": "SENDER_EMAIL", "name": "SENDER_NAME" },
    "recipient": { "email": "RECIPIENT_EMAIL", "name": "RECIPIENT_NAME" },
    "document": { "url": "DOCUMENT_URL" },
    "fields": [
      { "type": "signature", "page": 1, "preset": "signature_bottom_right" },
      { "type": "date", "page": 1, "preset": "date_after_signature" }
    ],
    "envelope_name": "Document Name"
  }'
```

## Response Handling
On success, return the `signing_url` to the user.
The recipient will receive an email notification.
Link expires in 7 days.

MCP Tool Definition

Use this JSON schema to define an MCP tool for Easy Sign integration:

MCP Tool Schema
{
  "name": "easy_sign_send_signature_request",
  "description": "Send a PDF document for electronic signature. The recipient receives an email with a signing link valid for 7 days.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "sender_email": { "type": "string", "description": "Email address of the sender" },
      "sender_name": { "type": "string", "description": "Name of the sender (optional)" },
      "recipient_email": { "type": "string", "description": "Email address of the signer" },
      "recipient_name": { "type": "string", "description": "Name of the signer (optional)" },
      "document_url": { "type": "string", "description": "Public URL to PDF (max 2MB, 10 pages)" },
      "signature_preset": {
        "type": "string",
        "enum": ["signature_bottom_right", "signature_bottom_left", "signature_bottom_center", "signature_footer"],
        "default": "signature_bottom_right",
        "description": "Position preset for signature field"
      },
      "envelope_name": { "type": "string", "description": "Custom name for the envelope" }
    },
    "required": ["sender_email", "recipient_email", "document_url"]
  }
}

Environment Setup

Store your API key securely in an environment variable:

Terminal
# Add to your shell profile (~/.bashrc, ~/.zshrc, etc.)
export EASY_SIGN_API_KEY="es_live_your_api_key_here"

Example Workflow

Here's how a conversation with an AI agent might look:

User

Send the contract at https://example.com/contract.pdf to john@example.com for signature. I'm jane@company.com.

AI Agent

I'll send that document for signature using Easy Sign...

Signature request sent successfully!

John (john@example.com) will receive an email with a link to sign the document. The link expires in 7 days.

Best Practices

  • Confirm document and recipient details before sending
  • Store API keys in environment variables, never hardcode
  • Handle errors gracefully with clear feedback to users
  • Use meaningful envelope names for easy tracking

Error Codes

Sign Request API

CodeHTTPDescription
INVALID_API_KEY401API key is invalid or revoked
KEY_EXPIRED401API key has expired
RATE_LIMITED429Too many requests (10/minute)
INVALID_EMAIL400Email format is invalid
SAME_EMAIL400Sender and recipient are the same
DOCUMENT_TOO_LARGE400Document exceeds 2MB
DOCUMENT_TOO_MANY_PAGES400Document exceeds 10 pages
INVALID_PDF400Invalid or corrupted PDF
DOCUMENT_URL_FAILED400Failed to download from URL
NO_FIELDS400No signature fields provided
INVALID_FIELD_POSITION400Field position is invalid

Verify API

StatusHTTPDescription
not_found400 / 404Invalid format or Transaction ID not found
tampered200Document integrity check failed (file modified)

Limits

2 MB

Max file size

10

Max pages per document

1

Recipient per request

10/min

Rate limit per API key

7 days

Signing link validity

5

API keys per user

Need Help?

Have questions or need assistance? We're here to help.