API Reference

Programmatically create, send, and manage contracts for e-signatures.

Base URL:https://apisign.io/api

API Documentation


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/json on POST and PUT requests.
  • Each endpoint accepts only the HTTP method shown in these docs.
  • IDs are cuid strings (for example clx1a2b3c0000abcd1234efgh). Contract endpoints that take a contract_id in the body reject other formats with 400.
  • /contract/find and /template/find return every record in one response, with no pagination or filter parameters. /contract/webhook-deliveries, /webhook/logs and /organization/audit-logs page with page (default 1) and limit (default 50). /contract/audit-logs returns the 50 most recent events.

Endpoints

All endpoints below require an API key unless marked public.

MethodPathPurpose
POST/contract/createCreate a draft contract
GET/contract/getGet one contract with its signers
GET/contract/findList all contracts
PUT/contract/updateUpdate a draft contract
POST/contract/sendSend or resend a contract (charged)
POST/contract/cancelCancel a draft or sent contract
POST/contract/deleteDelete a draft contract
GET/contract/logsActivity log for a contract
GET/contract/audit-logsAudit trail for a contract
GET/contract/webhook-deliveriesWebhook deliveries for a contract
GET/contract/emailsEmails sent about a contract, with delivery status
POST/contract/convertConvert a .docx file to markdown
GET/contract/verifyVerify a signed contract's digital seal (public)
POST/template/createCreate a template
GET/template/getGet one template
GET/template/findList active templates
POST/template/updateUpdate a template
POST/template/archiveArchive a template
POST/template/uploadCreate a template from a .docx file
POST/webhook/createCreate a webhook
GET/webhook/listList webhooks
GET/webhook/getGet a webhook and its recent deliveries
POST/webhook/updateUpdate a webhook
POST/webhook/deleteDelete a webhook
POST/webhook/rotate-secretRotate a webhook's signing secret
POST/webhook/testSend a test event to a webhook
GET/webhook/logsDelivery history for a webhook
GET/organization/getGet your organization
GET/organization/audit-logsAudit trail for your organization
POST/apikey/createCreate an API key
GET/apikey/listList API keys
POST/apikey/deleteDelete an API key
GET/health/checkLiveness check (public)
GET/health/dbDatabase connectivity check (public)
GET/openapiThis 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

StatusDescription
200Success
400Bad Request - invalid parameters, or the action isn't allowed in the contract's current status
401Unauthorized - missing, invalid, expired, or deleted API key
402Payment Required - balance too low to send a contract (/contract/send only)
404Not Found - resource doesn't exist or belongs to another organization
500Internal 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.