Official multi-language SDKs for document generation, digital signatures, and AI-powered workflows
Have an AI coding agent (Claude Code, Cursor, Copilot, Codex, Gemini CLI, OpenCode) install the right TurboDocx SDK for your language, configure your env, write working route handlers, and wire them into your app:
npx skills add TurboDocx/quickstartThen run /turbodocx-sdk inside your agent — or one of the focused shortcuts:
| Shortcut | What it scaffolds |
|---|---|
/turbodocx-sdk turbosign |
Send documents for e-signature, check status, download signed PDF |
/turbodocx-sdk deliverable |
Generate documents from templates with variable substitution |
/turbodocx-sdk turbopartner |
Provision and manage customer organizations (partner accounts) |
/turbodocx-sdk turbowebhooks |
Subscribe to signature.document.completed events + verify HMAC |
The skill auto-detects your framework (Express, NestJS, Next.js, FastAPI, Django, Spring Boot, Laravel, Gin, …) and follows your existing project conventions. Source: github.com/TurboDocx/quickstart.
|
Battle-tested infrastructure processing thousands of documents daily. Enterprise-grade reliability with 99.9% uptime SLA. Average API response time under 200ms. Optimized for high-throughput document workflows. End-to-end encryption. Your documents never stored longer than necessary. |
Built from the ground up for AI agents and automation. Perfect for n8n, Zapier, Make, and custom integrations. Legally binding digital signatures with full audit trails. DocuSign alternative at a fraction of the cost. Comprehensive SDKs, detailed documentation, and responsive support. Ship faster with less friction. |
Install the TurboDocx SDKs in a single prompt using the TurboDocx Quickstart Agent Skill — works with Claude Code, GitHub Copilot, Cursor, OpenCode, and other AI coding agents.
npx skills add TurboDocx/quickstartTwo skills are included:
| Skill | What it does |
|---|---|
turbodocx-sdk |
Scaffolds document generation in your project — picks the right SDK for your language, installs it, and writes a working code example |
turbodocx-html-to-docx |
Installs and configures @turbodocx/html-to-docx (open-source HTML → DOCX converter) |
Prefer manual install? Jump straight to Available SDKs below.
| Language | Package | Install | Registry |
|---|---|---|---|
| @turbodocx/sdk | npm install @turbodocx/sdk |
||
| turbodocx-sdk | pip install turbodocx-sdk |
||
| turbodocx/sdk | composer require turbodocx/sdk |
||
| turbodocx-sdk | go get github.com/TurboDocx/SDK/packages/go-sdk |
||
| com.turbodocx:turbodocx-sdk | implementation 'com.turbodocx:turbodocx-sdk:0.1.4' |
||
| turbodocx-sdk | gem install turbodocx-sdk |
| Language | Status |
|---|---|
| 🚧 In Progress | |
| 🚧 In Progress |
Get up and running in under 2 minutes:
Sign up at turbodocx.com and grab your API key from the dashboard.
JavaScript / TypeScript
npm install @turbodocx/sdk
# or
yarn add @turbodocx/sdk
# or
pnpm add @turbodocx/sdkPython
pip install turbodocx-sdk
# or
poetry add turbodocx-sdkGo
go get github.com/turbodocx/sdkPHP
composer require turbodocx/sdkJava
<dependency>
<groupId>com.turbodocx</groupId>
<artifactId>turbodocx-sdk</artifactId>
<version>0.1.4</version>
</dependency>import { TurboSign } from '@turbodocx/sdk';
// Configure once
TurboSign.configure({ apiKey: process.env.TURBODOCX_API_KEY });
// Send for signature
const { documentId, recipients } = await TurboSign.sendSignature({
fileLink: 'https://example.com/contract.pdf',
recipients: [
{ name: 'John Doe', email: 'john@example.com', order: 1 }
],
fields: [
{ type: 'signature', page: 1, x: 100, y: 500, width: 200, height: 50, recipientOrder: 1 }
]
});
// The created recipients come back on the send result (id, name, email).
// Signing links are emailed to them — they are not returned here.
console.log(`✅ Document sent to ${recipients[0].name} <${recipients[0].email}>`);Send documents for legally-binding eSignatures with full audit trails.
| Method | Description |
|---|---|
createSignatureReviewLink() |
Upload document for preview without sending emails |
sendSignature() |
Upload and immediately send signature requests |
getStatus() |
Check the document-level status |
getRecipients() |
Per-signer status, email history, and who sent the document |
download() |
Download the completed signed document |
void() |
Cancel/void a signature request |
resend() |
Resend signature request emails |
getAuditTrail() |
Get the complete audit trail |
Generate documents from templates with dynamic data.
Specify exact positions for signature fields using page coordinates:
const result = await TurboSign.sendSignature({
fileLink: 'https://example.com/contract.pdf',
recipients: [
{ name: 'Alice Smith', email: 'alice@example.com', order: 1 },
{ name: 'Bob Johnson', email: 'bob@example.com', order: 2 }
],
fields: [
// Alice's signature and date on page 1
{ type: 'signature', page: 1, x: 100, y: 650, width: 200, height: 50, recipientOrder: 1 },
{ type: 'date', page: 1, x: 320, y: 650, width: 100, height: 30, recipientOrder: 1 },
// Bob's signature and date on page 1
{ type: 'signature', page: 1, x: 100, y: 720, width: 200, height: 50, recipientOrder: 2 },
{ type: 'date', page: 1, x: 320, y: 720, width: 100, height: 30, recipientOrder: 2 },
// Initials on page 2
{ type: 'initials', page: 2, x: 500, y: 750, width: 60, height: 30, recipientOrder: 1 },
{ type: 'initials', page: 2, x: 500, y: 780, width: 60, height: 30, recipientOrder: 2 }
],
documentName: 'Service Agreement',
senderName: 'Acme Corp',
senderEmail: 'contracts@acme.com'
});Use text anchors in your PDF to automatically position signature fields:
const result = await TurboSign.sendSignature({
fileLink: 'https://example.com/contract-with-placeholders.pdf',
recipients: [
{ name: 'Alice Smith', email: 'alice@example.com', order: 1 },
{ name: 'Bob Johnson', email: 'bob@example.com', order: 2 }
],
fields: [
// Fields anchored to text markers in the PDF
{ type: 'signature', anchor: '{SIGNATURE_ALICE}', width: 200, height: 50, recipientOrder: 1 },
{ type: 'date', anchor: '{DATE_ALICE}', width: 100, height: 30, recipientOrder: 1 },
{ type: 'signature', anchor: '{SIGNATURE_BOB}', width: 200, height: 50, recipientOrder: 2 },
{ type: 'date', anchor: '{DATE_BOB}', width: 100, height: 30, recipientOrder: 2 },
// Text fields for additional info
{ type: 'text', anchor: '{TITLE_ALICE}', width: 150, height: 25, recipientOrder: 1 },
{ type: 'text', anchor: '{TITLE_BOB}', width: 150, height: 25, recipientOrder: 2 }
]
});Tip: Template-based fields are ideal when your PDF layout may change. Add text markers like
{SIGNATURE_1}to your document, and the signature fields will automatically align to them.
import { TurboSign } from '@turbodocx/sdk';
TurboSign.configure({ apiKey: process.env.TURBODOCX_API_KEY });
// 1. Send document for signature
const { documentId } = await TurboSign.sendSignature({
fileLink: 'https://example.com/contract.pdf',
recipients: [
{ name: 'Alice', email: 'alice@example.com', order: 1 },
{ name: 'Bob', email: 'bob@example.com', order: 2 }
],
fields: [
{ type: 'signature', page: 1, x: 100, y: 500, width: 200, height: 50, recipientOrder: 1 },
{ type: 'signature', page: 1, x: 100, y: 600, width: 200, height: 50, recipientOrder: 2 }
]
});
console.log(`Document ID: ${documentId}`);
// 2. Check status
const status = await TurboSign.getStatus(documentId);
console.log(`Status: ${status.status}`); // 'under_review', 'completed', 'voided', 'expired', ...
console.log(`Expires: ${status.expiresAt ?? 'never'}`); // ISO deadline, or undefined when expiration is off
// getStatus returns the document-level status (and the expiration deadline). For per-signer detail:
const { recipients, summary } = await TurboSign.getRecipients(documentId);
console.log(`${summary.completed}/${summary.total} signed, waiting on ${summary.waitingOn}`);
for (const recipient of recipients) {
// 'pending' | 'viewed' | 'completed' | 'voided' | 'expired'
console.log(` ${recipient.name}: ${recipient.effectiveStatus}`);
}
// 3. Download when complete
if (status.status === 'completed') {
const signedPdf = await TurboSign.download(documentId);
// Save to file, upload to S3, etc.
}
// 4. Void if needed
await TurboSign.void(documentId, 'Contract terms changed');
// 5. Resend to specific recipients
await TurboSign.resend(documentId, ['recipient-uuid']);| Type | Description |
|---|---|
signature |
Signature field (draw or type) |
initials |
Initials field |
text |
Free-form text input |
date |
Date stamp |
checkbox |
Checkbox / agreement — also the controlling field for conditional (IF/THEN) logic |
full_name |
Full name |
first_name |
First name |
last_name |
Last name |
email |
Email address |
title |
Job title |
company |
Company name |
Any field accepts an optional metadata object for conditional logic. Set metadata.fieldKey on a
controlling checkbox, then set metadata.conditional (controllingFieldKey, operator:
is_checked | is_not_checked, action: show | unlock) on a dependent field that references
that key. show hides the dependent field until the condition is met; unlock keeps it visible
but read-only until met. See each SDK's README "Conditional (IF/THEN) Fields" section for the
language-specific form.
| SDK | Minimum Version |
|---|---|
| JavaScript/TypeScript | Node.js 16+ |
| Python | Python 3.9+ |
| PHP | PHP 8.1+ |
| Go | Go 1.21+ |
| Java | Java 11+ |
We love contributions! Whether it's bug fixes, new features, or documentation improvements.
# Clone the repo
git clone https://github.com/TurboDocx/SDK.git
# Navigate to your SDK
cd SDK/packages/<sdk-name>
# Follow SDK-specific setup in its READMESee CONTRIBUTING.md for detailed guidelines.
We're looking for community maintainers for each SDK. Interested? Open an issue or reach out on Discord.
|
Documentation |
Discord |
GitHub Issues |
MIT License — see LICENSE for details.

