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
| Model | Description | Key Fields |
| CapitalCall | A capital call issued to an LP investor | id, lp_investor_id, organization_id, amount, notice_date, due_date, status, paid_at |
| Distribution | A cash distribution to an LP investor | id, lp_investor_id, amount, distribution_date, status |
Status Lifecycle
draft → issued → partial → paid
↓
overdue → cancelled
Cross-Module Links
| Direction | How to navigate |
| CapitalCall → LP CRM | CapitalCall.lp_investor_id → LPInvestor.id → GET /api/v1/fundos/lp-crm/investors/{lp_id} |
| CapitalCall → CFO | When 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
| Event | Trigger | Payload |
| 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
| Method | Path | Description | Required Params |
| GET | /api/v1/fundos/investors/{lp_id}/calls | List capital calls for an LP | lp_id |
| POST | /fundos/investors/{lp_id}/calls | Create a capital call | amount, notice_date |
| POST | /fundos/investors/{lp_id}/calls/{id}/status | Update call status | status |
| GET | /api/v1/fundos/investors | List all LPs with capital summary | — |
| GET | /api/v1/fundos/investors/{lp_id} | Get LP detail with commitment + call ledger | lp_id |
Error Codes
| Code | HTTP | Hint |
call_not_found | 404 | Verify call_id against GET /api/v1/fundos/investors/{lp_id}/calls |
invalid_call_status | 400 | Status must be: draft, issued, paid, partial, overdue, cancelled |
call_amount_required | 400 | Include a positive 'amount' field (USD decimal) |
lp_not_found | 404 | Verify lp_id against GET /api/v1/fundos/lp-crm/investors |
→ Build your first FundOS app in 15 minutes | Module contract JSON | Changelog