Welcome to the Document-Signer documentation. This guide will help you get started with our digital document signing platform and show you how to make the most of its features.
Document-Signer is a comprehensive digital signature solution that enables businesses of all sizes to securely sign and manage documents online. Our platform provides:
This documentation is designed for both end-users and developers looking to integrate our signature capabilities into their own applications.
Get up and running with Document-Signer in just a few minutes by following these steps:
Sign up for a Document-Signer account. New users can try our platform free for 14 days without entering payment information.
From your dashboard, click "Upload Document" and select a file from your computer. We support PDF, Word, Excel, and image files.
Use our document editor to drag and drop signature fields, text fields, checkboxes, and other form elements onto your document.
Enter the email addresses of people who need to sign the document and assign fields to specific signers.
Click "Send" to deliver the document to your recipients. You'll receive notifications as the document is viewed and signed.
Before you start sending documents for signature, take a few minutes to configure your account settings:
Complete your profile information and upload your profile picture. This information will be visible to your document recipients.
Create and save your default signature. You can draw your signature, type it, or upload an image of your signature.
Professional and Enterprise plans allow you to customize the signing experience with your company logo, colors, and email templates.
Add team members to your account and set appropriate permission levels to control who can send documents and access sensitive information.
Learn how to prepare and send documents for electronic signature:
Document-Signer supports the following file formats:
Drag and drop form fields onto your document to collect information and signatures:
You can set a specific signing order when your document requires multiple signatures. This ensures signers complete the document in the correct sequence.
Define how long recipients have to sign your document. You can set expiration dates from 1 to 90 days after sending.
Templates save time by allowing you to reuse document layouts and fields for recurring document types:
To use a template:
Templates can be shared with team members to ensure consistent document formats across your organization.
Document-Signer offers multiple signature options to meet various legal and usability requirements:
Our standard electronic signature allows signers to:
Digital signatures use certificate-based digital IDs for enhanced security and verification. These signatures include:
The simplest signature type, where signers click a button to indicate their agreement. Useful for basic acknowledgments and agreements.
Monitor the status of your documents and keep stakeholders informed throughout the signing process:
Your dashboard provides a real-time overview of all your documents with status indicators:
Automatic notifications are sent for key document events:
Configure automatic reminders for recipients who haven't signed. You can set:
The Document-Signer API allows you to integrate our digital signing capabilities into your own applications and workflows:
Our RESTful API enables you to:
https://api.Document-Signer.com/v1
All API responses are returned in JSON format and include a status code indicating success or failure.
API requests are subject to rate limiting based on your subscription plan:
Secure your API requests using API keys and OAuth 2.0:
Generate API keys from your account dashboard under "Developer Settings." Always keep your API keys secure and never expose them in client-side code.
Include your API key in the request header:
Authorization: Bearer YOUR_API_KEY
For applications acting on behalf of users, implement OAuth 2.0 authentication:
Step 1: Redirect users to the authorization endpoint:
https://api.Document-Signer.com/oauth/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REDIRECT_URI
Step 2: Exchange the authorization code for an access token:
POST https://api.Document-Signer.com/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTHORIZATION_CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=YOUR_REDIRECT_URI
Step 3: Use the access token in your API requests:
Authorization: Bearer ACCESS_TOKEN
Access tokens expire after 24 hours. Use the refresh token to obtain a new access token without requiring user re-authentication.
The Documents API allows you to programmatically create, send, and manage documents for signature:
POST /documents
Content-Type: application/json
{
"name": "Contract Agreement",
"file_url": "https://example.com/path/to/document.pdf",
"recipients": [
{
"email": "[email protected]",
"name": "John Doe",
"role": "signer",
"order": 1
},
{
"email": "[email protected]",
"name": "Jane Smith",
"role": "cc",
"order": 2
}
],
"fields": [
{
"type": "signature",
"page": 1,
"x": 100,
"y": 200,
"width": 200,
"height": 50,
"recipient_index": 0
},
{
"type": "date",
"page": 1,
"x": 100,
"y": 300,
"width": 200,
"height": 50,
"recipient_index": 0
}
],
"expires_in_days": 30,
"message": "Please sign this contract at your earliest convenience."
}
GET /documents/{document_id}
POST /documents/{document_id}/reminders
Content-Type: application/json
{
"recipient_email": "[email protected]",
"message": "Please sign the document as soon as possible."
}
GET /documents/{document_id}/download
GET /documents/{document_id}/audit_trail
The Templates API allows you to programmatically create and manage reusable document templates:
POST /templates
Content-Type: application/json
{
"name": "NDA Template",
"file_url": "https://example.com/path/to/nda.pdf",
"fields": [
{
"type": "signature",
"page": 1,
"x": 100,
"y": 200,
"width": 200,
"height": 50,
"role": "signer"
},
{
"type": "date",
"page": 1,
"x": 100,
"y": 300,
"width": 200,
"height": 50,
"role": "signer"
}
]
}
GET /templates
GET /templates/{template_id}
POST /templates/{template_id}/documents
Content-Type: application/json
{
"name": "NDA for Client XYZ",
"recipients": [
{
"email": "[email protected]",
"name": "Client Name",
"role": "signer"
},
{
"email": "[email protected]",
"name": "Manager Name",
"role": "cc"
}
],
"message": "Please sign this NDA before we proceed with the project.",
"expires_in_days": 14
}
Webhooks allow your application to receive real-time notifications about document events:
document.created
- Document has been createddocument.sent
- Document has been sent to recipientsdocument.viewed
- Recipient has viewed the documentdocument.signed
- Recipient has signed the documentdocument.completed
- All recipients have signed the documentdocument.declined
- Recipient has declined to signdocument.expired
- Document has expiredPOST /webhooks
Content-Type: application/json
{
"url": "https://your-server.com/webhook-endpoint",
"events": ["document.signed", "document.completed"],
"secret": "your_webhook_secret"
}
{
"event": "document.signed",
"timestamp": "2023-08-15T14:32:10Z",
"data": {
"document_id": "doc_123456789",
"document_name": "Contract Agreement",
"signer": {
"email": "[email protected]",
"name": "John Doe"
},
"signed_at": "2023-08-15T14:30:45Z",
"ip_address": "192.168.1.1"
}
}
For security, verify the webhook signature in the X-Document-Signer-Signature
header:
// Node.js example
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
const calculatedSignature = hmac.update(payload).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(calculatedSignature, 'hex'),
Buffer.from(signature, 'hex')
);
}
This example demonstrates how to create and send a document for signature using Node.js:
const axios = require('axios');
// API configuration
const API_KEY = 'YOUR_API_KEY';
const API_BASE_URL = 'https://api.Document-Signer.com/v1';
// Set up axios instance with authentication
const apiClient = axios.create({
baseURL: API_BASE_URL,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
}
});
// Function to send a document for signature
async function sendDocumentForSignature() {
try {
const document = {
name: 'Employment Contract',
file_url: 'https://your-server.com/documents/contract.pdf',
recipients: [
{
email: '[email protected]',
name: 'New Employee',
role: 'signer',
order: 1
},
{
email: '[email protected]',
name: 'HR Manager',
role: 'signer',
order: 2
}
],
fields: [
{
type: 'signature',
page: 3,
x: 100,
y: 200,
width: 200,
height: 50,
recipient_index: 0
},
{
type: 'signature',
page: 3,
x: 100,
y: 300,
width: 200,
height: 50,
recipient_index: 1
}
],
message: 'Please sign your employment contract.',
expires_in_days: 7
};
const response = await apiClient.post('/documents', document);
console.log('Document created successfully:', response.data);
return response.data;
} catch (error) {
console.error('Error creating document:', error.response ? error.response.data : error.message);
throw error;
}
}
// Check document status
async function checkDocumentStatus(documentId) {
try {
const response = await apiClient.get(`/documents/${documentId}`);
console.log('Document status:', response.data);
return response.data;
} catch (error) {
console.error('Error checking document status:', error.response ? error.response.data : error.message);
throw error;
}
}
// Usage
sendDocumentForSignature()
.then(document => checkDocumentStatus(document.id))
.catch(error => console.error('Operation failed:', error));
This example demonstrates how to create and send a document for signature using Python:
import requests
import json
# API configuration
API_KEY = 'YOUR_API_KEY'
API_BASE_URL = 'https://api.Document-Signer.com/v1'
# Set up headers with authentication
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
}
# Function to send a document for signature
def send_document_for_signature():
document = {
'name': 'Employment Contract',
'file_url': 'https://your-server.com/documents/contract.pdf',
'recipients': [
{
'email': '[email protected]',
'name': 'New Employee',
'role': 'signer',
'order': 1
},
{
'email': '[email protected]',
'name': 'HR Manager',
'role': 'signer',
'order': 2
}
],
'fields': [
{
'type': 'signature',
'page': 3,
'x': 100,
'y': 200,
'width': 200,
'height': 50,
'recipient_index': 0
},
{
'type': 'signature',
'page': 3,
'x': 100,
'y': 300,
'width': 200,
'height': 50,
'recipient_index': 1
}
],
'message': 'Please sign your employment contract.',
'expires_in_days': 7
}
try:
response = requests.post(
f'{API_BASE_URL}/documents',
headers=headers,
data=json.dumps(document)
)
response.raise_for_status()
print('Document created successfully:', response.json())
return response.json()
except requests.exceptions.RequestException as e:
print(f'Error creating document: {e}')
if hasattr(e, 'response') and e.response:
print(e.response.text)
raise
# Function to check document status
def check_document_status(document_id):
try:
response = requests.get(
f'{API_BASE_URL}/documents/{document_id}',
headers=headers
)
response.raise_for_status()
print('Document status:', response.json())
return response.json()
except requests.exceptions.RequestException as e:
print(f'Error checking document status: {e}')
if hasattr(e, 'response') and e.response:
print(e.response.text)
raise
# Usage
if __name__ == '__main__':
try:
document = send_document_for_signature()
check_document_status(document['id'])
except Exception as e:
print(f'Operation failed: {e}')
This example demonstrates how to create and send a document for signature using PHP:
<?php
// API configuration
$API_KEY = 'YOUR_API_KEY';
$API_BASE_URL = 'https://api.Document-Signer.com/v1';
// Function to send a document for signature
function sendDocumentForSignature() {
global $API_KEY, $API_BASE_URL;
$document = [
'name' => 'Employment Contract',
'file_url' => 'https://your-server.com/documents/contract.pdf',
'recipients' => [
[
'email' => '[email protected]',
'name' => 'New Employee',
'role' => 'signer',
'order' => 1
],
[
'email' => '[email protected]',
'name' => 'HR Manager',
'role' => 'signer',
'order' => 2
]
],
'fields' => [
[
'type' => 'signature',
'page' => 3,
'x' => 100,
'y' => 200,
'width' => 200,
'height' => 50,
'recipient_index' => 0
],
[
'type' => 'signature',
'page' => 3,
'x' => 100,
'y' => 300,
'width' => 200,
'height' => 50,
'recipient_index' => 1
]
],
'message' => 'Please sign your employment contract.',
'expires_in_days' => 7
];
$ch = curl_init($API_BASE_URL . '/documents');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($document));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $API_KEY,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 200 && $httpCode < 300) {
$responseData = json_decode($response, true);
echo "Document created successfully:\n";
print_r($responseData);
return $responseData;
} else {
echo "Error creating document. HTTP Code: $httpCode\n";
echo "Response: $response\n";
return null;
}
}
// Function to check document status
function checkDocumentStatus($documentId) {
global $API_KEY, $API_BASE_URL;
$ch = curl_init($API_BASE_URL . '/documents/' . $documentId);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $API_KEY,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 200 && $httpCode < 300) {
$responseData = json_decode($response, true);
echo "Document status:\n";
print_r($responseData);
return $responseData;
} else {
echo "Error checking document status. HTTP Code: $httpCode\n";
echo "Response: $response\n";
return null;
}
}
// Usage
$document = sendDocumentForSignature();
if ($document && isset($document['id'])) {
checkDocumentStatus($document['id']);
}
?>
This example demonstrates how to create and send a document for signature using Java:
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import org.json.JSONArray;
import org.json.JSONObject;
public class Document-SignerApiExample {
private static final String API_KEY = "YOUR_API_KEY";
private static final String API_BASE_URL = "https://api.Document-Signer.com/v1";
private static final HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
public static void main(String[] args) {
try {
JSONObject document = sendDocumentForSignature();
if (document != null && document.has("id")) {
String documentId = document.getString("id");
checkDocumentStatus(documentId);
}
} catch (Exception e) {
System.out.println("Operation failed: " + e.getMessage());
e.printStackTrace();
}
}
private static JSONObject sendDocumentForSignature() throws IOException, InterruptedException {
// Create document JSON
JSONObject document = new JSONObject();
document.put("name", "Employment Contract");
document.put("file_url", "https://your-server.com/documents/contract.pdf");
document.put("message", "Please sign your employment contract.");
document.put("expires_in_days", 7);
// Add recipients
JSONArray recipients = new JSONArray();
JSONObject recipient1 = new JSONObject();
recipient1.put("email", "[email protected]");
recipient1.put("name", "New Employee");
recipient1.put("role", "signer");
recipient1.put("order", 1);
recipients.put(recipient1);
JSONObject recipient2 = new JSONObject();
recipient2.put("email", "[email protected]");
recipient2.put("name", "HR Manager");
recipient2.put("role", "signer");
recipient2.put("order", 2);
recipients.put(recipient2);
document.put("recipients", recipients);
// Add signature fields
JSONArray fields = new JSONArray();
JSONObject field1 = new JSONObject();
field1.put("type", "signature");
field1.put("page", 3);
field1.put("x", 100);
field1.put("y", 200);
field1.put("width", 200);
field1.put("height", 50);
field1.put("recipient_index", 0);
fields.put(field1);
JSONObject field2 = new JSONObject();
field2.put("type", "signature");
field2.put("page", 3);
field2.put("x", 100);
field2.put("y", 300);
field2.put("width", 200);
field2.put("height", 50);
field2.put("recipient_index", 1);
fields.put(field2);
document.put("fields", fields);
// Create HTTP request
HttpRequest request = HttpRequest.newBuilder()
.POST(HttpRequest.BodyPublishers.ofString(document.toString()))
.uri(URI.create(API_BASE_URL + "/documents"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + API_KEY)
.build();
// Send request and get response
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 200 && response.statusCode() < 300) {
JSONObject responseJson = new JSONObject(response.body());
System.out.println("Document created successfully:");
System.out.println(responseJson.toString(2));
return responseJson;
} else {
System.out.println("Error creating document. HTTP Code: " + response.statusCode());
System.out.println("Response: " + response.body());
return null;
}
}
private static JSONObject checkDocumentStatus(String documentId) throws IOException, InterruptedException {
// Create HTTP request
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create(API_BASE_URL + "/documents/" + documentId))
.header("Authorization", "Bearer " + API_KEY)
.build();
// Send request and get response
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 200 && response.statusCode() < 300) {
JSONObject responseJson = new JSONObject(response.body());
System.out.println("Document status:");
System.out.println(responseJson.toString(2));
return responseJson;
} else {
System.out.println("Error checking document status. HTTP Code: " + response.statusCode());
System.out.println("Response: " + response.body());
return null;
}
}
}