Prerequisites
Contracts enabled
Contracts must be enabled for your account. If you don’t see the Contracts section in the Dashboard, contact your account manager to enable it.
API key from Dashboard
Get your API key from the Cadana Dashboard. See Authentication.
Contract templates configured (template-based only)
If using template-based contracts, create your templates in the Dashboard under People > Contracts > Browse Templates before using the API. Not needed for uploaded contracts.
Onboarded workers
Workers must be onboarded as Persons — you’ll assign contracts using their
personId. See Onboard Workers.Option A: Template-Based Contracts
Use this flow when you want Cadana to handle electronic signatures. You select a contract template, Cadana generates the document, and both parties sign digitally.List Available Templates
Retrieve the templates available for your business. Each template is scoped to apersonType (employee or contractor) and country.
Response:
person.firstName) are auto-populated from the Person record when the contract is created.
Create a Contract
Create a contract from a template and assign it to a person. Thesender is the business representative who will sign first.
Response:
Get the Signing URL
Retrieve a URL that the next signer can use to view and sign the contract. The URL is valid for 336 hours (14 days). Response:| Field | Description |
|---|---|
url | The signing URL for viewing and signing the contract |
signer | Who needs to sign next: business or person |
app.cadanapay.com or your white-label domain, depending on your platform configuration.
The optional redirectUrl query parameter specifies where to send the signer after they complete signing.
Track Signature Status
List contracts to check their signature status. Optionally filter bypersonId.
Response:
signedAt (epoch timestamp, 0 if unsigned) and lastViewedAt so you can track engagement.
Contract Status Flow
| Status | Meaning |
|---|---|
awaiting business signature | Business representative needs to sign first |
awaiting person signature | Business signed, waiting for the worker |
completed | Both parties have signed |
revoked | Contract was cancelled before completion |
Contracts can only be revoked before both parties have signed. Once
completed, the contract is final.Retrieve a Contract
Fetch the full details of a single contract by its ID. To include a presigned download URL for the contract PDF, passincludeDownloadUrl=true:
Response:
The
downloadUrl and downloadUrlExpiresAt fields are only present when includeDownloadUrl=true. The download URL expires after 15 minutes.Option B: Upload a Signed Contract
Use this flow when you already have a signed contract PDF — for example, a contract signed offline or through a third-party e-signature tool.Step 1: Upload the File
Upload the PDF using the two-step file upload flow. See Working with Files for the full process. Response:putUrl within the expiry window (15 minutes):
Bash
Step 2: Create the Contract Record
Attach the uploaded file to the person’s record using thefileId from step 1.
Response:
completed since they’re already signed. They appear alongside template-based contracts when you list contracts for a person.
Webhook Events
Cadana emits contract webhook events so you can track the signing lifecycle in real time. Subscribe via the Dashboard or see Webhooks for setup.contract.created
Fired when a new contract is created (template-based or uploaded).JSON
contract.signed
Fired each time a signature is collected. TheisComplete field tells you whether all signatures are now in.
JSON
contract.status.updated
Fired on status transitions (e.g., revoked).JSON
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
401 Unauthorized | Invalid or missing API key | Check your API key in the Dashboard |
400 on create | Missing required fields | Ensure templateId, personId, and sender (with name and email) are provided |
| No templates returned | Templates not configured for your business | Create templates in the Dashboard under People > Contracts > Browse Templates |
| Signing URL expired | URL older than 336 hours | Generate a new signing URL with GET /v1/contracts/{id}/signingUrl |
Next Steps
Onboard Workers
Create Person records before issuing contracts
Pay Workers via Payroll
Pay workers after contracts are in place
Working with Files
Upload and download files (contracts, KYC documents, etc.)