{
"file": "File (PDF only, max 50MB)",
"title": "string (optional, defaults to filename)",
"description": "string (optional)"
}API Documentation
Complete reference for the AuthenlySign REST API. Integrate document signing into your applications.
Authentication
All API requests require authentication using an API key. Include your API key in the Authorization header:
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.authenlysign.com/v1/documentsKeep your API key secure
Never expose your API key in client-side code. Use environment variables and server-side requests.
Generate API keys in your Dashboard Settings. API access requires Medium Team plan or higher.
Base URL
Production
https://api.authenlysign.com/v1Sandbox (Testing)
https://sandbox-api.authenlysign.com/v1Rate Limits
Standard
1,000
requests/hour
Large Team
5,000
requests/hour
Enterprise
Unlimited
custom limits available
Rate limit headers are included in all responses: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
Document Signing Flow
The complete end-to-end document signing workflow consists of these steps:
Upload Document
Upload a PDF document using POST /api/documents/upload. The document is created in "draft" status.
curl -X POST /api/documents/upload \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@contract.pdf" \
-F "title=Service Agreement"Send for Signing
Send the document to signers using POST /api/documents/:id/send-for-signing. Email invitations are sent automatically.
curl -X POST /api/documents/doc_abc123/send-for-signing \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"signers": [{"email": "signer@example.com", "name": "John Doe"}], "expirationDays": 30}'Monitor Status
Poll GET /api/documents/:id/status or configure webhooks to track signing progress in real-time.
// Response includes completion percentage and signer details
{
"signedCount": 1,
"totalSigners": 2,
"completionPercentage": 50,
"status": "in-progress",
"signers": [
{"email": "signer1@example.com", "status": "signed", "signed_at": "2026-06-02T11:00:00Z"},
{"email": "signer2@example.com", "status": "pending-signature", "signed_at": null}
]
}Receive Completion Webhook
When all signers complete, you receive a document.completed webhook event.
{
"id": "evt_abc123",
"type": "document.completed",
"created": 1717329600,
"data": {
"object": {
"documentId": "doc_abc123",
"document": {"id": "doc_abc123", "title": "Service Agreement", "status": "completed"}
}
}
}Download Signed Document
Retrieve the signed PDF using GET /api/documents/:id/download.
curl /api/documents/doc_abc123/download \
-H "Authorization: Bearer YOUR_API_KEY"
// Response
{"success": true, "downloadUrl": "https://storage.authenlysign.app/signed/...", "filename": "Service Agreement.pdf"}Verify Signatures (Optional)
Cryptographically verify all signatures using GET /api/documents/:id/verify.
// Response
{
"documentId": "doc_abc123",
"isValid": true,
"signatures": [
{"signerEmail": "signer@example.com", "signedAt": "2026-06-02T11:05:00Z", "isValid": true}
],
"verifiedAt": "2026-06-03T10:00:00Z"
}Document uploaded, not yet sent to signers
Sent to signers, awaiting signatures
All signers have signed successfully
Expiration date passed before completion
API Endpoints
Documents
/api/documents/uploadAuth Required/api/documents/paginatedAuth Requiredpage- number (default: 1)pageSize- number (default: 20, max: 100)status- string (draft | in-progress | completed | archived)search- string (filter by title)sortBy- string (created_at | updated_at | title | status)sortOrder- string (asc | desc, default: desc)cursor- string (for cursor-based pagination)/api/documents/:id/statusAuth Requiredid- Document ID (required)/api/documents/:id/send-for-signingAuth Requiredid- Document ID (required)/api/documents/:id/signid- Document ID (required)/api/documents/:idAuth Requiredid- Document ID (required)/api/documents/:idAuth Requiredid- Document ID (required)/api/documents/:id/downloadAuth Requiredid- Document ID (required)/api/documents/:id/verifyAuth Requiredid- Document ID (required)/api/documents/:id/remindAuth Requiredid- Document ID (required)/api/documents/paginatedAuth Required{
"action": "'archive' | 'delete' | 'restore' (required)",
"documentIds": "string[] (required, max 100)"
}Signing Flow
/api/signing/in-personAuth Required{
"documentId": "string (required)",
"signerEmail": "string (required)",
"signerName": "string (optional)"
}/api/signing/in-person/capture{
"sessionId": "string (required)",
"signatureData": "string (base64-encoded signature)"
}/api/signing/in-person/verify{
"sessionId": "string (required)",
"verificationCode": "string (optional, if access code required)"
}API Keys
/api/settings/api-keysAuth Required{
"apiKeys": [
{
"id": "key_001",
"name": "Production Key",
"created_at": "2026-06-01T10:00:00Z",
"last_used_at": "2026-06-02T15:30:00Z",
"expires_at": null
}
]
}/api/settings/api-keysAuth Required{
"name": "string (required)",
"expiresInDays": "number (optional, null for no expiration)"
}/api/settings/api-keys?id=:keyIdAuth Requiredid- API Key ID (required)/api/settings/api-keys/:keyId/rotateAuth RequiredkeyId- API Key ID (required)Webhooks
/api/integrations/webhooks/:integrationIdAuth RequiredintegrationId- Integration ID (required)/api/integrations/webhooks/:integrationIdAuth RequiredintegrationId- Integration ID (required)Health & Status
/api/health{
"status": "healthy",
"timestamp": "2026-06-02T10:00:00Z"
}/api/health/signing{
"status": "healthy",
"pki": "operational",
"certificates": "valid"
}/api/health/database{
"status": "healthy",
"latency_ms": 12
}Webhooks
Webhooks allow you to receive real-time notifications when events occur in AuthenlySign. Configure webhook endpoints in your dashboard or via the API.
Webhook Payload Structure
{
"id": "evt_abc123",
"event": "document.completed",
"created_at": "2025-12-02T10:00:00Z",
"data": {
"document_id": "doc_xyz789",
"title": "Service Agreement",
"status": "completed",
"completed_at": "2025-12-02T10:00:00Z",
"signers": [
{ "email": "client@example.com", "signed_at": "2025-12-02T10:00:00Z" }
]
}
}Available Events
document.sentDocument was sent for signing to recipientsdocument.viewedA signer viewed the documentdocument.signedA signer completed their signaturedocument.completedAll signers have signed, document is completedocument.voidedDocument was voided/cancelled by ownerdocument.expiredDocument expired before all signatures were collectedrecipient.startedA recipient started the signing processrecipient.completedA recipient completed all their required actionsrecipient.declinedA recipient declined to sign the documentpackage.sentA multi-document package was sent for signingpackage.completedAll documents in a package are fully signedpackage.expiredA signing package expired before completionpackage.cancelledA signing package was cancelledfield.completedA form field was completed by a signerVerify webhook signatures to ensure requests are from AuthenlySign:
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(`sha256=${expectedSignature}`)
);
}SDKs & Libraries
Install: npm install @authenlysign/sdk
import AuthenlySign from '@authenlysign/sdk';
const client = new AuthenlySign({
apiKey: process.env.AUTHENLYSIGN_API_KEY
});
// Upload a document
const formData = new FormData();
formData.append('file', pdfFile);
formData.append('title', 'Service Agreement');
const { document } = await client.documents.upload(formData);
// Send for signing
await client.documents.sendForSigning(document.id, {
signers: [
{ email: 'client@company.com', name: 'Client Name' }
],
emailSubject: 'Please sign this agreement',
expirationDays: 30
});
// Check document status
const status = await client.documents.getStatus(document.id);
console.log('Completion:', status.completionPercentage + '%');
// Download signed document when complete
if (status.status === 'completed') {
const { downloadUrl } = await client.documents.download(document.id);
console.log('Download:', downloadUrl);
}Error Codes
The API returns standard HTTP status codes and JSON error objects:
{
"error": {
"code": "validation_error",
"message": "Invalid email address format",
"field": "signers[0].email",
"status": 422
}
}