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

ModelDescriptionKey Fields
TransactionA closing coordination record for a dealid, name, deal_id, status, linked_room_id, organization_id, closing_date
TransactionTaskA closing task or condition precedentid, transaction_id, title, status, assignee_id, due_date, order

Status Lifecycle

draft → active → closing → closed
                         → terminated

Cross-Module Links

FieldLinks toHow to navigate
deal_idCRM → DealGET /api/v1/fundos/crm/deals/{deal_id}
linked_room_idVDR → DealRoomGET /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

EventTriggerPayload
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

MethodPathDescriptionRequired Params
GET/api/v1/fundos/transactionsList transactions (?deal_id=, ?status=)
GET/api/v1/fundos/transactions/{id}Get transaction detail + taskstransaction_id
POST/api/v1/fundos/transactionsCreate 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}/tasksList closing taskstransaction_id
PATCH/api/v1/fundos/transactions/{id}/tasks/{tid}Update task (status, assignee, due_date)transaction_id, task_id
POST/fundos/transactions/{id}/extract-cpsAI-extract conditions precedent from term sheet textterm_sheet_text

Error Codes

CodeHTTPHint
transaction_not_found404Verify transaction_id against GET /api/v1/fundos/transactions
task_not_found404Verify task_id against GET /api/v1/fundos/transactions/{id}/tasks
invalid_transaction_status400Status must be: draft, active, closing, closed, terminated
deal_not_found404Verify deal_id against GET /api/v1/fundos/crm/deals

→ Build your first FundOS app in 15 minutes  |  Module contract JSON  |  Changelog