Signing API
Everything in this section can also be done from code, with the same API key as the rest of the API, or from an AI assistant connected through MCP.
Send a document
POST /api/v1/sign_requests creates a request and sends it. There are three ways to give the document:
From a signing template, with one signer for each role, in the template's order:
{
"signing_template_id": "eae427f4279c4bc6a0d043ffe",
"signers": [{ "name": "Ana Silva", "email": "ana@example.com" }]
}From a file, with a signature page added for each signer:
{
"title": "Service agreement",
"file": { "url": "https://example.com/agreement.pdf" },
"signers": [
{ "name": "Ana Silva", "email": "ana@example.com" },
{ "name": "Ben Okafor", "email": "ben@example.com" }
],
"in_order": true
}From a file, with fields placed by you. x, y, width and height are fractions of the page, measured from its top left corner. page starts at 1, and signer is the signer's position in the list, starting at 0.
{
"file": { "name": "agreement.pdf", "content_base64": "JVBERi0x..." },
"signers": [{ "name": "Ana Silva", "email": "ana@example.com" }],
"fields": [
{ "signer": 0, "type": "signature", "page": 2, "x": 0.1, "y": 0.78, "width": 0.3, "height": 0.06 },
{ "signer": 0, "type": "date_signed", "page": 2, "x": 0.5, "y": 0.8, "width": 0.18, "height": 0.03 }
]
}The file can be a PDF or a Word file (.docx), up to 25 MB, given as an https url or as content_base64.
| Option | Default | |
|---|---|---|
title | the file name | The document's name in emails and in the app |
message | none | Included in the email |
in_order | false | Email signers one after another. Files only; a template keeps its own order |
expires_in_days | 30 | 1 to 365 |
send | true | false saves a draft to finish in the app |
append_certificate | true, or the template's setting | Put the certificate of completion on the signed PDF's last page |
Field types: signature, initials, date_signed, name, text, checkbox.
Check a request
GET /api/v1/sign_requests/{id} returns the request with each signer's status. When status is completed, signed_file_url is a link to the signed PDF and certificate_file_url a link to the certificate of completion on its own. Both work for an hour; ask again for fresh ones.
{
"object": "sign_request",
"id": "a8f509d586dc4979ab64c0123",
"status": "completed",
"signers": [
{ "id": "…", "name": "Ana Silva", "email": "ana@example.com", "order": 1, "status": "signed", "signed_at": "2026-10-29T07:12:03.000Z" }
],
"signed_file_url": "https://…",
"certificate_file_url": "https://…",
"append_certificate": true,
"signed_sha256": "…"
}Other endpoints
| Endpoint | Does |
|---|---|
GET /api/v1/sign_requests | Lists requests, newest first. ?status=completed filters them |
POST /api/v1/sign_requests/{id}/remind | Emails one signer their link again. Body: { "signer_id": "…" } |
POST /api/v1/sign_requests/{id}/void | Cancels a sent request and tells the signers. Body: { "reason": "…" } (optional) |
GET /api/v1/signing_templates | Lists signing templates with their roles |
From an AI assistant
Over MCP, the same actions are the tools list_signing_templates, send_for_signature, get_sign_request, list_sign_requests and cancel_sign_request.
Last updated on