Contracts Guide
Everything you need to know about creating and managing multi-party contracts via the API.
Contract Types
Draftory supports the following contract types. Pass the contractType value when creating a contract.
| Type | Description |
|---|---|
nda | Non-Disclosure Agreement |
business | General Business Contract |
employment | Employment Agreement |
service | Service Agreement |
custom | Custom Contract |
sales-agreement | Sales Agreement |
consignment-agreement | Consignment Agreement |
revenue-share | Revenue Share Agreement |
Creating a Contract
Send a POST request to /contracts to create a new multi-party contract. Draftory automatically sends signing emails to all parties.
Required Fields
| Field | Type | Description |
|---|---|---|
parties | array | Array of parties (minimum 2). Each party must have role, legalName, and email. |
contractType | string | One of the supported contract types (see above) |
content | string | Contract content as plain text (max 50 KB). Use section headers and line breaks for formatting. |
Optional Fields
| Field | Type | Description |
|---|---|---|
senderName | string | Display name shown in signing emails (defaults to your account name) |
metadata | object | Arbitrary string key-value pairs for your own tracking |
Party Object
| Field | Type | Description |
|---|---|---|
role | string | The party's role (e.g. buyer, seller, discloser, recipient) |
legalName | string | Full legal name of the party |
email | string | Email address — signing link is sent here |
Example Request
curl -X POST https://api.draftory.ca/api/external/v2/contracts \
-H "x-api-key: dft_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"parties": [
{ "role": "seller", "legalName": "Acme Corp", "email": "acme@example.com" },
{ "role": "buyer", "legalName": "Jane Smith", "email": "jane@example.com" }
],
"contractType": "nda",
"content": "MUTUAL NON-DISCLOSURE AGREEMENT\n\n1. PARTIES\nSeller: Acme Corp (acme@example.com)\nBuyer: Jane Smith (jane@example.com)\n\n2. TERMS\nBoth parties agree not to disclose confidential information.\nThis agreement remains in effect for 2 years.\n\n3. GOVERNING LAW\nProvince of Ontario, Canada.",
"senderName": "Acme Corp",
"metadata": {
"internalRef": "DEAL-2026-042",
"department": "partnerships"
}
}'
const res = await fetch("https://api.draftory.ca/api/external/v2/contracts", {
method: "POST",
headers: {
"x-api-key": "dft_live_your_key",
"Content-Type": "application/json"
},
body: JSON.stringify({
parties: [
{ role: "seller", legalName: "Acme Corp", email: "acme@example.com" },
{ role: "buyer", legalName: "Jane Smith", email: "jane@example.com" }
],
contractType: "nda",
content: "MUTUAL NON-DISCLOSURE AGREEMENT\n\n1. PARTIES\nSeller: Acme Corp\nBuyer: Jane Smith\n\n2. TERMS\nBoth parties agree not to disclose confidential information.",
senderName: "Acme Corp",
metadata: {
internalRef: "DEAL-2026-042",
department: "partnerships"
}
})
});
const contract = await res.json();
console.log(contract);
import requests
res = requests.post(
"https://api.draftory.ca/api/external/v2/contracts",
headers={
"x-api-key": "dft_live_your_key",
"Content-Type": "application/json"
},
json={
"parties": [
{"role": "seller", "legalName": "Acme Corp", "email": "acme@example.com"},
{"role": "buyer", "legalName": "Jane Smith", "email": "jane@example.com"}
],
"contractType": "nda",
"content": "MUTUAL NON-DISCLOSURE AGREEMENT\n\n1. PARTIES\nSeller: Acme Corp\nBuyer: Jane Smith\n\n2. TERMS\nBoth parties agree not to disclose confidential information.",
"senderName": "Acme Corp",
"metadata": {
"internalRef": "DEAL-2026-042",
"department": "partnerships"
}
}
)
print(res.json())
Response 201 Created
{
"success": true,
"contract": {
"id": "contract-1711234567890-AbCdEfGh",
"contractNumber": "EXT-20260321-ABCDEFGH",
"shareToken": "abc123token",
"shareUrl": "https://draftory.ca/contract/abc123token",
"status": "pending_signature",
"contractType": "nda",
"parties": [
{ "role": "seller", "legalName": "Acme Corp", "email": "acme@example.com" },
{ "role": "buyer", "legalName": "Jane Smith", "email": "jane@example.com" }
],
"signingProgress": {
"signed": 0,
"total": 2,
"pending": 2,
"percentage": 0
},
"createdAt": "2026-03-21T12:00:00.000Z",
"expiresAt": "2026-04-04T12:00:00.000Z"
}
}
Contract Lifecycle
Every contract moves through a series of statuses from creation to completion:
pending_signature → partially_signed → signed
→ expired (after 14 days)
→ cancelled (manual)
| Status | Description |
|---|---|
pending_signature | Contract created and signing emails sent. Awaiting signatures from all parties. |
partially_signed | At least one party has signed, but not all. Check signingProgress and parties[].hasSigned for details. |
signed | All parties have signed the contract. |
expired | The contract was not fully signed within 14 days of creation and has automatically expired. |
cancelled | The contract was manually cancelled before all parties signed. |
Getting Contract Details
Send a GET request to /contracts/{id} to retrieve the full details of a contract, including per-party signing status and a signatures array.
curl https://api.draftory.ca/api/external/v2/contracts/contract-1711234567890-AbCdEfGh \
-H "x-api-key: dft_live_your_key"
const contractId = "contract-1711234567890-AbCdEfGh";
const res = await fetch(
`https://api.draftory.ca/api/external/v2/contracts/${contractId}`,
{ headers: { "x-api-key": "dft_live_your_key" } }
);
const data = await res.json();
console.log(data);
import requests
contract_id = "contract-1711234567890-AbCdEfGh"
res = requests.get(
f"https://api.draftory.ca/api/external/v2/contracts/{contract_id}",
headers={"x-api-key": "dft_live_your_key"}
)
print(res.json())
Response 200 OK
{
"success": true,
"contract": {
"id": "contract-1711234567890-AbCdEfGh",
"status": "partially_signed",
"parties": [
{ "role": "seller", "legalName": "Acme Corp", "email": "acme@example.com", "hasSigned": true },
{ "role": "buyer", "legalName": "Jane Smith", "email": "jane@example.com", "hasSigned": false }
],
"signingProgress": {
"signed": 1,
"total": 2,
"pending": 1,
"percentage": 50
},
"signatures": [
{
"signerEmail": "acme@example.com",
"signerName": "Acme Corp",
"signerRole": "seller",
"signedAt": "2026-03-21T14:30:00.000Z"
}
]
}
}
Share URLs
When you create a contract, the response includes a shareUrl field. All parties use this same URL to view and sign the contract.
When a party opens the share URL, they are prompted to verify their email address by entering a one-time code sent to their email on file. Once verified, they can review the full contract and provide their signature.
Share URLs expire along with the contract — 14 days after creation by default.
Content Structure
The content field accepts a plain text string up to 50 KB in size. Use section headers (numbered + ALL CAPS) and blank-line spacing for formatting.
1. PARTIES, 2. TERMS) for clear structure.
Here is an example content string for an NDA:
"MUTUAL NON-DISCLOSURE AGREEMENT\n\n1. PARTIES\nDiscloser: Acme Corp (acme@example.com)\nRecipient: Jane Smith (jane@example.com)\n\n2. TERMS\nBoth parties agree not to disclose confidential information.\nThis agreement remains in effect for 2 years.\n\n3. GOVERNING LAW\nThis agreement shall be governed by the laws of the Province of Ontario, Canada."
And an example for a service agreement:
"WEB DEVELOPMENT SERVICE AGREEMENT\n\n1. PARTIES\nProvider: DevStudio Inc (dev@example.com)\nClient: Acme Corp (acme@example.com)\n\n2. SCOPE\nDesign and development of a marketing website.\n\nDeliverables:\n- Wireframes\n- UI Design\n- Frontend build\n- CMS integration\n\n3. PAYMENT\n50% upfront, 50% on delivery.\n\n4. TIMELINE\nStart: May 1, 2026\nEnd: July 31, 2026"