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
ndaNon-Disclosure Agreement
businessGeneral Business Contract
employmentEmployment Agreement
serviceService Agreement
customCustom Contract
sales-agreementSales Agreement
consignment-agreementConsignment Agreement
revenue-shareRevenue 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
partiesarrayArray of parties (minimum 2). Each party must have role, legalName, and email.
contractTypestringOne of the supported contract types (see above)
contentstringContract content as plain text (max 50 KB). Use section headers and line breaks for formatting.

Optional Fields

Field Type Description
senderNamestringDisplay name shown in signing emails (defaults to your account name)
metadataobjectArbitrary string key-value pairs for your own tracking

Party Object

Field Type Description
rolestringThe party's role (e.g. buyer, seller, discloser, recipient)
legalNamestringFull legal name of the party
emailstringEmail 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_signatureContract created and signing emails sent. Awaiting signatures from all parties.
partially_signedAt least one party has signed, but not all. Check signingProgress and parties[].hasSigned for details.
signedAll parties have signed the contract.
expiredThe contract was not fully signed within 14 days of creation and has automatically expired.
cancelledThe 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.

Tip: Draftory renders your content preserving line breaks and section headers. Use numbered sections (e.g. 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"