Contents

Authentication POST /api/v1/sign GET /api/v1/envelopes/:id GET /api/v1/envelopes GET /api/v1/usage Webhooks Error Handling

Authentication

All API requests require a Bearer token in the Authorization header.

Header
Authorization: Bearer sk_live_your_api_key_here

Get your API key from the Dashboard. Keys start with sk_live_.

Tip: Store your API key in an environment variable, not in source code.

Create Signing Envelope

POST /api/v1/sign

Send a document for e-signature. Returns signing URLs for each signer. This is the only endpoint you need.

Request Body

ParameterTypeDescription
document_url required string URL to the document (PDF, DOCX, or image). Must be publicly accessible.
signers required array Array of signer objects. Each must have email and optionally name and role. Max 20 signers.
brand optional object White-label config: { logo_url, company_name, reply_to }
webhook_url optional string URL to receive webhook events when signing completes.

Example Request

JavaScript
const res = await fetch('https://sipsign.polsia.app/api/v1/sign', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk_live_YOUR_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    document_url: 'https://example.com/contract.pdf',
    signers: [
      { email: 'alice@company.com', name: 'Alice Chen' },
      { email: 'bob@vendor.io', name: 'Bob Smith' }
    ],
    brand: {
      company_name: 'Acme Corp',
      logo_url: 'https://acme.com/logo.png'
    },
    webhook_url: 'https://yourapp.com/webhooks/signed'
  })
});

Example Response

200 Created
{
  "envelope_id": "env_a1b2c3d4e5f6...",
  "status": "sent",
  "signing_urls": [
    {
      "email": "alice@company.com",
      "name": "Alice Chen",
      "url": "https://docuseal.com/s/abc123",
      "status": "pending"
    },
    {
      "email": "bob@vendor.io",
      "name": "Bob Smith",
      "url": "https://docuseal.com/s/def456",
      "status": "pending"
    }
  ],
  "webhook": {
    "url": "https://yourapp.com/webhooks/signed",
    "events": ["envelope.completed", "signer.signed"]
  },
  "cost": "$0.10",
  "created_at": "2026-03-24T16:00:00.000Z"
}

Get Envelope

GET /api/v1/envelopes/:envelope_id

Retrieve the status and details of a signing envelope.

Example Response

200 OK
{
  "envelope_id": "env_a1b2c3d4e5f6...",
  "status": "completed",
  "document_url": "https://example.com/contract.pdf",
  "signers": [
    { "email": "alice@company.com", "name": "Alice Chen" }
  ],
  "signing_urls": [...],
  "completed_document_url": "https://...",
  "created_at": "2026-03-24T16:00:00.000Z",
  "completed_at": "2026-03-24T17:30:00.000Z"
}

Envelope Statuses

StatusDescription
pendingEnvelope created but not yet sent to signers
sentSigning emails delivered, waiting for signatures
completedAll signers have signed
expiredSigning links expired (30 days default)
voidedEnvelope was cancelled

List Envelopes

GET /api/v1/envelopes

List all envelopes for your API key, with optional filtering.

Query Parameters

ParameterTypeDescription
status optional string Filter by status: pending, sent, completed, expired, voided
limit optional integer Number of results (default: 20, max: 100)
offset optional integer Pagination offset (default: 0)

Usage Stats

GET /api/v1/usage

Get usage statistics for your API key.

200 OK
{
  "total": { "envelopes": 142, "cost_usd": "14.20" },
  "this_month": { "envelopes": 23, "cost_usd": "2.30" },
  "today": { "envelopes": 3 }
}

Webhooks

When you include a webhook_url in your signing request, SipSign will POST to that URL when the envelope status changes.

Webhook Payload

POST to your webhook_url
{
  "event": "envelope.completed",
  "envelope_id": "env_a1b2c3d4e5f6...",
  "status": "completed",
  "document_url": "https://example.com/contract.pdf",
  "completed_at": "2026-03-24T17:30:00.000Z"
}

Events

EventDescription
envelope.completedAll signers have completed signing
signer.signedAn individual signer has signed
Important: Your webhook endpoint must respond with a 2xx status code within 10 seconds, or delivery will be retried.

Error Handling

SipSign returns structured error responses with consistent formatting.

Error Response
{
  "error": {
    "type": "validation_error",
    "message": "document_url is required"
  }
}

Error Types

TypeHTTPDescription
authentication_error401Missing or invalid API key
forbidden403API key revoked or insufficient permissions
validation_error400Invalid request parameters
not_found404Resource not found
signing_error500DocuSeal signing engine error
server_error500Internal server error

Rate Limits & Pricing

Rate limit: 100 requests per minute per API key.

Pricing: $0.10 per envelope. No subscriptions, no minimums. You're billed per envelope created.

Demo mode: When the server runs without a DocuSeal API key, it returns simulated signing URLs. Great for testing your integration. Check the demo_mode field in the response.