Easy Sign API
Automate signature requests and verify documents with a single API call. Perfect for AI agents, scripts, and integrations.
Quick Start
Create an API Key
Go to Settings → API Keys and create a new key.
Prepare Your Document
Have a PDF ready (URL or base64 encoded). Max 2MB, 10 pages.
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
/api/agent/sign-requestCreate and send a signature request in a single call.
Request Example (cURL)
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
| Parameter | Type | Description |
|---|---|---|
| sender.email | string | Sender's email address (required) |
| sender.name | string | Sender's name (optional) |
| recipient.email | string | Recipient's email address (required) |
| recipient.name | string | Recipient's name (optional) |
| document.url | string | Public URL to PDF document |
| document.base64 | string | Base64 encoded PDF content |
| document.file_name | string | File name (optional, auto-detected) |
| fields | array | Array of signature fields (required) |
| envelope_name | string | Custom 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 fieldsignature_date- Signature with datedate- Date only
Position Presets
signature_bottom_rightsignature_bottom_leftsignature_bottom_centerdate_after_signaturesignature_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
{
"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
{
"success": false,
"error": {
"code": "INVALID_EMAIL",
"message": "Valid sender email is required"
}
}Verify Document
/api/verifyVerify the authenticity and integrity of signed documents. No authentication required (public API).
Verification Types
transaction_only- Verify Transaction ID exists in our recordsfull- Upload PDF for complete integrity check (SHA-256 hash comparison)
Request Example (JSON)
curl -X POST https://easy-sign.ca/api/verify \
-H "Content-Type: application/json" \
-d '{ "transactionId": "ES-20241206-ABC12345" }'Request Example (with File Verification)
curl -X POST https://easy-sign.ca/api/verify \ -F "file=@signed-document.pdf" \ -F "transactionId=ES-20241206-ABC12345"
Request Parameters
| Parameter | Type | Description |
|---|---|---|
| transactionId | string | Transaction ID (format: ES-YYYYMMDD-XXXXXXXX). Found on signed documents. |
| file | File | Optional: Upload the signed PDF for full integrity verification |
Success Response (Full Verification)
{
"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
| Status | Description |
|---|---|
| valid | Document is fully signed and verified. Integrity check passed (if file was uploaded). |
| pending | Document exists but signing is not yet complete. |
| not_found | Transaction ID does not exist in our records. |
| tampered | File has been modified. Hash does not match the original signed document. |
Tampered Document 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:
---
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:
{
"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:
# 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
| Code | HTTP | Description |
|---|---|---|
| INVALID_API_KEY | 401 | API key is invalid or revoked |
| KEY_EXPIRED | 401 | API key has expired |
| RATE_LIMITED | 429 | Too many requests (10/minute) |
| INVALID_EMAIL | 400 | Email format is invalid |
| SAME_EMAIL | 400 | Sender and recipient are the same |
| DOCUMENT_TOO_LARGE | 400 | Document exceeds 2MB |
| DOCUMENT_TOO_MANY_PAGES | 400 | Document exceeds 10 pages |
| INVALID_PDF | 400 | Invalid or corrupted PDF |
| DOCUMENT_URL_FAILED | 400 | Failed to download from URL |
| NO_FIELDS | 400 | No signature fields provided |
| INVALID_FIELD_POSITION | 400 | Field position is invalid |
Verify API
| Status | HTTP | Description |
|---|---|---|
| not_found | 400 / 404 | Invalid format or Transaction ID not found |
| tampered | 200 | Document 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