API Reference
Programmatically create, send, and manage contracts for e-signatures.
https://apisign.io/apiAPI Documentation
Authentication
API keys and security best practices.
Contracts
Create, send, and manage contracts for signing.
Templates
Manage reusable contract templates with variables.
Webhooks
Receive real-time notifications for contract events.
MCP Server
Connect AI agents like Claude Desktop and Cursor.
Quick Start
1. Get Your API Key
Generate an API key from your dashboard under Account → MCP & API Keys.
2. Make Your First Request
curl -X GET https://apisign.io/api/contract/find \
-H "x-api-key: your_api_key_here"
3. Create a Contract
Contracts are created as drafts. A contract without a template needs content and fields, and must contain at least one signature field completed by the signer.
curl -X POST https://apisign.io/api/contract/create \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Service Agreement",
"content": "# Agreement\n\nThis agreement is between...\n\n**Signature:** {{signature}}",
"fields": [
{ "name": "signature", "type": "signature", "completedBy": "signer" }
],
"signers": [
{
"email": "john@example.com",
"name": "John Smith",
"signing_order": 1
}
]
}'
4. Send It
Sending emails each signer a signing link and charges your balance ($0.25 per send at the default price). Add "test_mode": true when creating the contract to send for free; see Test mode.
curl -X POST https://apisign.io/api/contract/send \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "contract_id": "CONTRACT_ID_FROM_STEP_3" }'
Conventions
- Request bodies are JSON. Send
Content-Type: application/jsononPOSTandPUTrequests. - Each endpoint accepts only the HTTP method shown in these docs.
- IDs are cuid strings (for example
clx1a2b3c0000abcd1234efgh). Contract endpoints that take acontract_idin the body reject other formats with400. /contract/findand/template/findreturn every record in one response, with no pagination or filter parameters./contract/webhook-deliveries,/webhook/logsand/organization/audit-logspage withpage(default1) andlimit(default50)./contract/audit-logsreturns the 50 most recent events.
Endpoints
All endpoints below require an API key unless marked public.
| Method | Path | Purpose |
|---|---|---|
POST | /contract/create | Create a draft contract |
GET | /contract/get | Get one contract with its signers |
GET | /contract/find | List all contracts |
PUT | /contract/update | Update a draft contract |
POST | /contract/send | Send or resend a contract (charged) |
POST | /contract/cancel | Cancel a draft or sent contract |
POST | /contract/delete | Delete a draft contract |
GET | /contract/logs | Activity log for a contract |
GET | /contract/audit-logs | Audit trail for a contract |
GET | /contract/webhook-deliveries | Webhook deliveries for a contract |
GET | /contract/emails | Emails sent about a contract, with delivery status |
POST | /contract/convert | Convert a .docx file to markdown |
GET | /contract/verify | Verify a signed contract's digital seal (public) |
POST | /template/create | Create a template |
GET | /template/get | Get one template |
GET | /template/find | List active templates |
POST | /template/update | Update a template |
POST | /template/archive | Archive a template |
POST | /template/upload | Create a template from a .docx file |
POST | /webhook/create | Create a webhook |
GET | /webhook/list | List webhooks |
GET | /webhook/get | Get a webhook and its recent deliveries |
POST | /webhook/update | Update a webhook |
POST | /webhook/delete | Delete a webhook |
POST | /webhook/rotate-secret | Rotate a webhook's signing secret |
POST | /webhook/test | Send a test event to a webhook |
GET | /webhook/logs | Delivery history for a webhook |
GET | /organization/get | Get your organization |
GET | /organization/audit-logs | Audit trail for your organization |
POST | /apikey/create | Create an API key |
GET | /apikey/list | List API keys |
POST | /apikey/delete | Delete an API key |
GET | /health/check | Liveness check (public) |
GET | /health/db | Database connectivity check (public) |
GET | /openapi | This API's OpenAPI 3 spec (public) |
Webhook endpoints are documented on the Webhooks page and API key endpoints on the Authentication page.
Organization
GET /organization/get returns { "organization": { ... } }: the organization record, including billing and branding settings, with a members array (each member includes user with id, name, email, image).
GET /organization/audit-logs returns your organization's audit events, newest first. Query parameters: page (default 1) and limit (default 50).
{
"auditLogs": [
{
"id": "clx...",
"eventType": "contract_sent",
"createdAt": "2026-01-10T10:00:00.000Z",
"contract": { "id": "clx...", "name": "Service Agreement" },
"signer": null,
"user": null,
"ipAddress": "203.0.113.4",
"country": null,
"city": null,
"deviceType": "desktop",
"browser": "Chrome",
"os": "macOS",
"metadata": {}
}
],
"pagination": { "page": 1, "limit": 50, "totalCount": 1, "totalPages": 1, "hasMore": false }
}
Health
GET /health/check returns { "status": "ok" }. GET /health/db returns status, database, timestamp and version, plus databaseError when the database query fails. Both return 200 either way; read status.
Error Responses
Errors return a JSON body with an error string:
{
"error": "Contract not found"
}
Request validation failures (400) add a details array naming each invalid field:
{
"error": "Invalid request data",
"details": [
{
"field": "signers.0.email",
"message": "Invalid email address"
}
]
}
Template endpoints use "error": "Validation failed" for the same case.
HTTP Status Codes
| Status | Description |
|---|---|
200 | Success |
400 | Bad Request - invalid parameters, or the action isn't allowed in the contract's current status |
401 | Unauthorized - missing, invalid, expired, or deleted API key |
402 | Payment Required - balance too low to send a contract (/contract/send only) |
404 | Not Found - resource doesn't exist or belongs to another organization |
500 | Internal Server Error - also returned when the request body is not valid JSON |
Rate Limits
API key requests are not rate limited, and responses carry no rate-limit headers.