← Developer Hub
LP CRM
VDR
Transactions
Investors
CFO
Quickstart
Deal CRM Module
Manage the deal pipeline — create deals, track stages, connect to VDR rooms and transactions.
Data Models
Model Description Key Fields
Deal A tracked investment opportunity in the pipeline id, name, stage, counterparty, asset_class, fund_account_id, organization_id
PipelineStage Org-configurable pipeline stage (e.g. Sourcing, DD, Closing) id, key, label, color, position, is_terminal
Activity Immutable audit log of deal events id, deal_id, type, note, created_at
Cross-Module Links
Field on Deal Links to How to navigate
fund_account_idCFO → FundAccount GET /api/v1/fundos/cfo/accounts/{fund_account_id}
(no direct field) VDR → DealRoom Find Transaction where deal_id=X and linked_room_id IS NOT NULL
Note: A Deal does not have a direct room_id. The connection goes through Transaction.linked_room_id. Use GET /api/v1/fundos/transactions?deal_id=X to find the room.
Quickstart (3 steps)
Step 1 — Authenticate
export FUNDOS_API_KEY=vdr_your_key_here
Step 2 — Dry-run a deal (ephemeral=true, zero DB writes)
curl -X POST https://kela.com/api/v1/fundos/crm/deals?ephemeral=true \
-H "Authorization: Bearer $FUNDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Series B", "stage": "sourcing", "asset_class": "equity"}'
Step 3 — Create the deal for real
curl -X POST https://kela.com/api/v1/fundos/crm/deals \
-H "Authorization: Bearer $FUNDOS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Series B", "stage": "sourcing", "asset_class": "equity"}'
# → {"success": true, "data": {"id": 42, "name": "Acme Series B", "stage": "sourcing"}}
Webhook Events
Event Trigger Payload
deal.created
New deal is persisted
{"deal_id", "name", "stage"}
deal.stage_changed
Deal moves to a new stage
{"deal_id", "name", "old_stage", "new_stage"}
deal.closed
Deal moves to a terminal stage (is_terminal=true)
{"deal_id", "name", "stage"}
Endpoints
Method Path Description Required Params
GET /api/v1/fundos/crm/deals List all deals (filterable by ?stage=, ?search=) —
GET /api/v1/fundos/crm/deals/{id} Get one deal with full detail deal_id
POST /api/v1/fundos/crm/deals Create a deal. Add ?ephemeral=true for a dry run. name, stage
PATCH /api/v1/fundos/crm/deals/{id} Update deal fields deal_id
GET /api/v1/fundos/crm/pipeline List pipeline stages for the org —
GET /api/v1/fundos/crm/transactions?deal_id={id} Find transactions linked to a deal (use for room_id) deal_id
Error Codes
Code HTTP Hint
deal_not_found404 Verify deal_id against GET /api/v1/fundos/crm/deals
invalid_stage400 Stage key must come from GET /api/v1/fundos/crm/pipeline
deal_name_required400 Include a 'name' field in your request body
→ Build your first FundOS app in 15 minutes | Module contract JSON | Changelog