Investor Portal Module

Issue and track capital calls against LP investors — create call records, log payments, and receive webhooks when LP cash moves.

Human approval required: fundos_create_capital_call requires explicit human approval. Always draft first; never auto-issue without GP sign-off.

Data Models

ModelDescriptionKey Fields
CapitalCallA capital call issued to an LP investorid, lp_investor_id, organization_id, amount, notice_date, due_date, status, paid_at
DistributionA cash distribution to an LP investorid, lp_investor_id, amount, distribution_date, status

Status Lifecycle

draft → issued → partial → paid
                         ↓
                      overdue → cancelled

Cross-Module Links

DirectionHow to navigate
CapitalCall → LP CRMCapitalCall.lp_investor_id → LPInvestor.id → GET /api/v1/fundos/lp-crm/investors/{lp_id}
CapitalCall → CFOWhen a call is paid, CFO posts a JournalEntry. Query JournalEntry where description contains call_id.

Quickstart (3 steps)

Step 1 — Authenticate and find an LP

export FUNDOS_API_KEY=vdr_your_key_here

# List LPs
curl https://kela.com/api/v1/fundos/lp-crm/investors \
  -H "Authorization: Bearer $FUNDOS_API_KEY"
# → note the LP id (e.g. 7)

Step 2 — Create a capital call (requires GP approval)

# Create draft call
curl -X POST https://kela.com/fundos/investors/7/calls \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 500000, "notice_date": "2026-06-12", "due_date": "2026-07-12"}'

# → {"success": true, "data": {"id": 4, "status": "draft", "amount": 500000}}

Step 3 — Mark the call as paid

curl -X POST https://kela.com/fundos/investors/7/calls/4/status \
  -H "Authorization: Bearer $FUNDOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status": "paid"}'

# → triggers capital_call.paid webhook

Webhook Events

EventTriggerPayload
capital_call.issued New CapitalCall created (status: draft) {"call_id", "lp_id", "amount", "due_date"}
capital_call.paid Call status set to 'paid' {"call_id", "lp_id", "amount", "paid_date"}

Endpoints

MethodPathDescriptionRequired Params
GET/api/v1/fundos/investors/{lp_id}/callsList capital calls for an LPlp_id
POST/fundos/investors/{lp_id}/callsCreate a capital callamount, notice_date
POST/fundos/investors/{lp_id}/calls/{id}/statusUpdate call statusstatus
GET/api/v1/fundos/investorsList all LPs with capital summary
GET/api/v1/fundos/investors/{lp_id}Get LP detail with commitment + call ledgerlp_id

Error Codes

CodeHTTPHint
call_not_found404Verify call_id against GET /api/v1/fundos/investors/{lp_id}/calls
invalid_call_status400Status must be: draft, issued, paid, partial, overdue, cancelled
call_amount_required400Include a positive 'amount' field (USD decimal)
lp_not_found404Verify lp_id against GET /api/v1/fundos/lp-crm/investors

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