Audience: Admins, Legal, PMs, Developers
Outcomes: Fully signed, enforceable contract; clean bundle
Request signatures (server)
curl -X POST $API_BASE/api/contracts/blockchain -b cookies.txt \ -H 'Content-Type: application/json' \ -d '{ "title":"Design SOW", "description":"LP redesign", "amount":150000, "currency":"USD", "buyerEmail":"[email protected]" }'
Response includes a signatureRequest
If wallet-backed, client prompts wallet; signature is posted back
Options
Signing order (e.g., seller → buyer)
Multi-signer per party; all must sign
Time-boxed signature windows with auto-expire
Activation & automation
Status → active
Events:
contract.fully_signed
,contract.activated
Optional: auto-create order from
paymentTerms
Notifications to both parties; SSE example:
const es = new EventSource('/api/events/stream', { withCredentials: true }); es.addEventListener('contract.fully_signed', e => { const data = JSON.parse(e.data); console.log('Contract signed:', data.contractId); });
Appendices & exhibits
Allowed: PDF, DOC/DOCX, images, archives; default 10 MB/file
AV + MIME validation
Version pinning: hash stored; exact file baked into bundle at signature
Download bundle from Contracts → Active → Download
Access & visibility
Member: edit own drafts; see assigned active contracts
Admin/Owner: see all org contracts; approve/manage
Cross-org: each party sees shared items only; private notes stay in-org
Exports: admin can export bundle; optional redaction for PII
Edge cases
Signed PDF missing appendix ⇒ add via addendum (not retroactive)
Legal hold ⇒ locks amendments/deletions
QA checklist
All assigned signers required; signing order observed
Bundle contains contract + signatures + pinned exhibits
Runbook: “Counterparty can’t see draft”
Ensure it’s shared for review; drafts are org-scoped until shared