Everything you need to send documents for e-signature. Base URL: https://sipsign.polsia.app
All API requests require a Bearer token in the Authorization header.
Authorization: Bearer sk_live_your_api_key_here
Get your API key from the Dashboard. Keys start with sk_live_.
Send a document for e-signature. Returns signing URLs for each signer. This is the only endpoint you need.
| Parameter | Type | Description |
|---|---|---|
| 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. |
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' }) });
{
"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"
}
Retrieve the status and details of a signing envelope.
{
"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"
}
| Status | Description |
|---|---|
pending | Envelope created but not yet sent to signers |
sent | Signing emails delivered, waiting for signatures |
completed | All signers have signed |
expired | Signing links expired (30 days default) |
voided | Envelope was cancelled |
List all envelopes for your API key, with optional filtering.
| Parameter | Type | Description |
|---|---|---|
| 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) |
Get usage statistics for your API key.
{
"total": { "envelopes": 142, "cost_usd": "14.20" },
"this_month": { "envelopes": 23, "cost_usd": "2.30" },
"today": { "envelopes": 3 }
}
When you include a webhook_url in your signing request, SipSign will POST to that URL when the envelope status changes.
{
"event": "envelope.completed",
"envelope_id": "env_a1b2c3d4e5f6...",
"status": "completed",
"document_url": "https://example.com/contract.pdf",
"completed_at": "2026-03-24T17:30:00.000Z"
}
| Event | Description |
|---|---|
envelope.completed | All signers have completed signing |
signer.signed | An individual signer has signed |
SipSign returns structured error responses with consistent formatting.
{
"error": {
"type": "validation_error",
"message": "document_url is required"
}
}
| Type | HTTP | Description |
|---|---|---|
authentication_error | 401 | Missing or invalid API key |
forbidden | 403 | API key revoked or insufficient permissions |
validation_error | 400 | Invalid request parameters |
not_found | 404 | Resource not found |
signing_error | 500 | DocuSeal signing engine error |
server_error | 500 | Internal server error |
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 field in the response.