← Developer Hub
CRM
LP CRM
VDR
Investors
CFO
Quickstart
Transactions Module
Closing coordination — create transactions from deals, track closing tasks and conditions precedent, link VDR data rooms, and get notified when tasks complete.
Key role: Transaction is the canonical bridge between a Deal and a VDR room. A Deal has no direct room_id — the link goes through Transaction.linked_room_id.
Data Models
Model Description Key Fields
Transaction A closing coordination record for a deal id, name, deal_id, status, linked_room_id, organization_id, closing_date
TransactionTask A closing task or condition precedent id, transaction_id, title, status, assignee_id, due_date, order
Status Lifecycle
draft → active → closing → closed
→ terminated
Cross-Module Links
Field Links to How to navigate
deal_idCRM → Deal GET /api/v1/fundos/crm/deals/{deal_id}
linked_room_idVDR → DealRoom GET /api/v1/rooms/{linked_room_id}
Quickstart (3 steps)
Step 1 — Authenticate and find a deal
export FUNDOS_API_KEY=vdr_your_key_here
curl https://kela.com/api/v1/fundos/crm/deals \
-H "Authorization: Bearer $FUNDOS_API_KEY"
# → note a deal id (e.g. 42)
Step 2 — Create a transaction (dry run first)
# Dry run — validates body, zero DB writes
curl -X POST "https://kela.com/api/v1/fundos/transactions?ephemeral=true" \
-H "Authorization: Bearer $FUNDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Series B Closing", "deal_id": 42}'
# Create for real
curl -X POST https://kela.com/api/v1/fundos/transactions \
-H "Authorization: Bearer $FUNDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Series B Closing", "deal_id": 42}'
# → {"success": true, "data": {"id": 9, "name": "Acme Series B Closing", "status": "draft"}}
Step 3 — Complete a task and listen for webhooks
# Get tasks
curl https://kela.com/api/v1/fundos/transactions/9/tasks \
-H "Authorization: Bearer $FUNDOS_API_KEY"
# Complete a task (triggers transaction.task_completed webhook)
curl -X PATCH https://kela.com/api/v1/fundos/transactions/9/tasks/23 \
-H "Authorization: Bearer $FUNDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "complete"}'
Webhook Events
Event Trigger Payload
transaction.created
New Transaction persisted
{"transaction_id", "deal_id", "name"}
transaction.task_completed
A closing task status set to 'complete'
{"transaction_id", "task_id", "task_name"}
transaction.closed
Transaction status set to 'closed'
{"transaction_id", "deal_id", "name"}
Endpoints
Method Path Description Required Params
GET /api/v1/fundos/transactions List transactions (?deal_id=, ?status=) —
GET /api/v1/fundos/transactions/{id} Get transaction detail + tasks transaction_id
POST /api/v1/fundos/transactions Create transaction. Add ?ephemeral=true for dry run. name, deal_id
PATCH /api/v1/fundos/transactions/{id} Update transaction (status, closing_date, linked_room_id) transaction_id
GET /api/v1/fundos/transactions/{id}/tasks List closing tasks transaction_id
PATCH /api/v1/fundos/transactions/{id}/tasks/{tid} Update task (status, assignee, due_date) transaction_id, task_id
POST /fundos/transactions/{id}/extract-cps AI-extract conditions precedent from term sheet text term_sheet_text
Error Codes
Code HTTP Hint
transaction_not_found404 Verify transaction_id against GET /api/v1/fundos/transactions
task_not_found404 Verify task_id against GET /api/v1/fundos/transactions/{id}/tasks
invalid_transaction_status400 Status must be: draft, active, closing, closed, terminated
deal_not_found404 Verify deal_id against GET /api/v1/fundos/crm/deals
→ Build your first FundOS app in 15 minutes | Module contract JSON | Changelog