FundOS API Reference
Every FundOS module is callable standalone via Bearer-authenticated REST. Inline data, Kela-hosted rows, or MCP BYOD sources — your choice per call.
Authentication
Every endpoint requires a Bearer token — either a JWT (24-hour, from
POST /api/v1/auth/login) or a long-lived API key
(prefix vdr_, generated in Admin → API Keys).
curl -H "Authorization: Bearer vdr_your_api_key" \
-H "Content-Type: application/json" \
https://my-vdr.vercel.app/api/v1/fundos/crm/deals
X-RateLimit-Remaining and X-RateLimit-Reset headers.
Conventions
- Three data modes: Kela-hosted (default), Headless (inline data in payload), BYOD (MCP connection reference).
?ephemeral=true: any POST endpoint that normally persists a row will instead validate and return the response shape withpersisted: false.- Org-scoped: every call runs in the caller's organisation context — no cross-tenant access.
- BYOD source schema:
{"type": "mcp", "connection_id": N, "path": "..."}or{"type": "inline", "documents": [{"name": "...", "text": "..."}]}.
Sample agent flows
Worked examples — what an AI agent (Claude, ChatGPT, Cursor, your own custom agent) does when it's connected to Kela via MCP. Every flow ends with a human-approval gate; nothing auto-executes.
Find expiring KYC records and draft outreach
It's the start of the quarter. Compliance wants to clear the KYC backlog before the auditor arrives. Find every LP whose KYC review expires in the next 60 days and draft a refresh-request email per LP.
Trigger: Asked Claude (with the Kela MCP server connected)
-
fundos_list_kyc_records— List KYC records due in <=60 days -
fundos_get_lp— Pull the LP detail for each match -
fundos_list_documents— Find their last KYC packet for context -
draft email per LP— Compose refresh-request email referencing the prior KYC packet date + new docs required -
HUMAN APPROVAL— Drafts queue for Compliance Officer approval
Generate K-1s for the current tax year
It's January. Time to generate K-1s for the calendar tax year that just closed. CFO wants drafts ready for the tax preparer's review before sending to LPs.
Trigger: Asked Claude to run K-1 generation for tax year 2025
-
fundos_list_fund_accounts— Pick the fund account(s) in scope -
fundos_list_lps— Enumerate LPs with capital activity in the year -
fundos_compute_pnl— Compute LP-level taxable items per fund (LTCG, STCG, ordinary income, deductions) -
k1_generate_per_lp (write)— Draft K-1 PDFs and Schedule K-1 line items -
HUMAN APPROVAL— CFO reviews each K-1 before sending to LP per-LP data room
Daily covenant scan + breach memo
Every morning, the risk team needs to know if any portfolio company tripped a debt covenant overnight. If breach: draft the lender-notice memo so the GP can review and send.
Trigger: Scheduled — Agent F (Risk Covenant Watcher) runs at 6 a.m. UTC daily
-
fundos_list_covenants— Enumerate all monitored covenants -
fundos_check_covenant per covenant— Compute current vs threshold against the latest financials -
classify breach / watch / ok— By severity and time-to-cure -
draft_lender_notice (write)— For each breach: compose the notice with the covenant, the value, the cure period -
HUMAN APPROVAL— GP reviews proposed notices in the action queue before any send
Issue a capital call for one LP
GP needs to call $2M from one LP for a closing this week. ILPA-compliant notice should hit the LP's per-LP data room and trigger a 5-step reminder ladder.
Trigger: Asked Claude to issue a $2M call to Meridian Pension for the Q3 close
-
fundos_list_lps + fundos_get_lp— Resolve the LP by name → pull commitment + funded-to-date -
fundos_create_capital_call (ephemeral=true)— Validate amount vs unfunded; surface ILPA call type -
HUMAN APPROVAL— GP confirms LP + amount + ilpa_call_type -
fundos_create_capital_call (ephemeral=false)— Persist the call; ILPA Excel notice generated into LP's per-LP room -
schedule_reminder_ladder (Agent E)— Auto-schedule T-14 / T-7 / T-3 / T-1 / overdue reminders
Inbound pitch deck → deal in the right stage
A founder sends a 25-page pitch deck. You want it triaged into the CRM at the right stage with a 1-page screening memo, ranked against your fund's recent portfolio.
Trigger: Forward the pitch email to your fund's inbound address (e.g. fund-inbox@in.kela.com)
-
inbound_email triage (Agent B)— Parse sender, attachment, body; classify as PITCH / WARM / NOISE -
fundos_vdr_analyze— Extract entities, red flags, MRR/burn/team signals -
compose screening memo— 1-page memo + score against fund's mandate -
fundos_create_deal (ephemeral=true)— Propose Deal row at the right stage (Screening or Diligence) -
HUMAN APPROVAL— Partner reviews proposal in CRM queue; accept → Deal persists
Want to try one? claude mcp add kela https://kela.com/mcp
then ask Claude to run any of these flows on your data. Or
book a walkthrough.
CRM & Pipeline
/api/v1/fundos/crm/deals
?stage=<key>
/api/v1/fundos/crm/pipeline
/api/v1/fundos/crm/deals
{
"asset_class": "private_credit",
"counterparty": "ACME Capital",
"currency": "USD",
"irr_target": 0.12,
"name": "Fund II \u2014 ACME Credit",
"stage": "dd",
"target_size": 25000000
}
/api/v1/fundos/crm/deals/{id}
/api/v1/fundos/crm/deals/{id}
/api/v1/fundos/crm/deals/{id}/stage
{
"stage": "closing"
}
/api/v1/fundos/crm/deals/{id}/activity
{
"summary": "Called sponsor about term sheet.",
"type": "note"
}
/api/v1/fundos/crm/deals/{id}/contacts
{
"email": "jane@example.com",
"name": "Jane Doe",
"role": "Sponsor CFO"
}
VDR + DD Agent
/api/v1/fundos/odd/generate
{
"ephemeral": true,
"source": {
"connection_id": 5,
"path": "/Funds/FundII/DD",
"type": "mcp"
},
"topics": [
"key_data",
"fund_terms"
]
}
/api/v1/fundos/vdr/analyze
{
"ephemeral": true,
"source": {
"documents": [
{
"name": "ppm.pdf",
"text": "\u2026"
}
],
"type": "inline"
}
}
Transaction Manager
/api/v1/fundos/transactions
/api/v1/fundos/transactions/{id}
/api/v1/fundos/transactions/draft
{
"asset_class": "private_credit",
"deal_id": 123,
"linked_room_id": 45,
"name": "FundII \u2014 ACME Credit closing",
"parties": [
{
"name": "ACME Capital",
"role": "Lender"
}
],
"seed_default_tasks": true,
"target_close_date": "2026-06-15"
}
/api/v1/fundos/transactions/{id}/status
{
"status": "signed"
}
/api/v1/fundos/transactions/{id}/tasks
{
"category": "legal",
"title": "Final IC approval"
}
/api/v1/fundos/transactions/{id}/tasks/{task_id}
{
"status": "complete"
}
Pricer + Pool Analytics
/api/v1/fundos/pricer/run
{
"amortisation": "bullet",
"benchmark_pct": 0.04,
"ceiling_pct": 0.12,
"coupon_pct": 0.08,
"deal_id": 123,
"fees_upfront_pct": 0.01,
"floor_pct": 0.07,
"principal": 10000000,
"spread_bps": 400,
"term_months": 60,
"tranches": [
{
"balance": 7000000,
"coupon_pct": 0.06,
"name": "Senior A",
"priority": 1
}
]
}
DSRI Risk Intelligence
/api/v1/fundos/risk/covenants
/api/v1/fundos/risk/check
{
"covenant_id": 7,
"current_value": 1.05
}
/api/v1/fundos/risk/alerts
CIM / Report Builder
/api/v1/fundos/cim/templates
/api/v1/fundos/cim/reports
/api/v1/fundos/cim/reports/{id}
/api/v1/fundos/cim/generate
{
"deal_id": 42,
"source": {
"connection_id": 5,
"path": "/Funds/Fund II",
"type": "mcp"
},
"template_key": "standard",
"title": "Fund II \u2014 IC Memo"
}
Investor Portal
/api/v1/fundos/investors/lp
/api/v1/fundos/investors/lp
{
"committed_capital": 10000000,
"entity_type": "family_office",
"jurisdiction": "DE",
"kyc_status": "pending",
"name": "Cascade Family Office",
"primary_contact_email": "ir@cascade.example"
}
/api/v1/fundos/investors/lp/{id}
/api/v1/fundos/investors/lp/{id}/capital-calls
{
"amount": 500000,
"due_date": "2026-05-15",
"notice_date": "2026-04-20",
"reference": "CC-2026-Q2-01",
"status": "issued"
}
/api/v1/fundos/investors/capital-calls
CFO Center
/api/v1/fundos/cfo/accounts
/api/v1/fundos/cfo/accounts
{
"committed_total": 100000000,
"currency": "USD",
"entity_type": "fund",
"fiscal_year_end": "12-31",
"gl_provider": "manual",
"name": "Fund II \u2014 Main"
}
/api/v1/fundos/cfo/accounts/{id}/entries
{
"category": "expense",
"credit": 45000,
"date": "2026-04-15",
"debit": 0,
"description": "Legal fees \u2014 Fund II closing",
"reference": "JE-2026-Q2-07"
}
/api/v1/fundos/cfo/report
{
"end": "2026-12-31",
"fund_account_id": 1,
"start": "2026-01-01"
}
/api/v1/fundos/cfo/waterfall
{
"carry_pct": 0.2,
"committed": 100000000,
"distributable": 140000000,
"hurdle_pct": 0.08
}
Agent Runtime & Tool Registry
/api/v1/tools
/api/v1/tools/gemini-declarations
/api/v1/tools/{name}
/api/v1/tools/{name}/call
{
"lp_investor_id": 12,
"title": "Send Q3 letter"
}
/fundos/agent/
/fundos/agent/runs/{run_id}
/fundos/agent/runs/{run_id}/stream
/fundos/agent/runs/{run_id}/events.json
/fundos/agent/actions/{action_id}/approve
/fundos/agent/actions/{action_id}/reject
{
"reason": "Wrong stage"
}
FundOS Copilot
/fundos/copilot/ask
{
"context": {
"deal_id": 42,
"scope_label": "deal Acme"
},
"history": [
{
"role": "user",
"text": "..."
},
{
"role": "assistant",
"text": "..."
}
],
"question": "What is the target net IRR?"
}
VentureInsights Integration
/webhooks/vi/{event_type}
/webhooks/vi/_health
/webhooks/vi/cron/reconcile
/admin/integrations/ventureinsights
/admin/integrations/ventureinsights/test
/admin/integrations/ventureinsights/rotate-webhook-secret
/admin/integrations/ventureinsights/import/companies
/admin/integrations/ventureinsights/import/funds
Compliance OS
/api/v1/fundos/compliance/kyc
/api/v1/fundos/compliance/filings
/api/v1/fundos/compliance/trade/check
/api/v1/fundos/compliance/obligations
/fundos/compliance/kyc/<record_id>/screen
/fundos/compliance/agent/scan
Outbound Webhooks (Kela → subscribers)
/developer/connected-apps
/developer/connected-apps
{
"events": [
"odd.profile.updated",
"answer_bank.updated",
"room.red_flag.added"
],
"name": "VentureInsights reverse",
"url": "https://stage-api.8vdx.io/webhooks/kela"
}
Event catalogue
| Event | Trigger | Payload sample |
|---|---|---|
odd.profile.updated |
FundProfile save (fund_name / vintage / fees / strategy / team / etc.) |
|
answer_bank.updated |
sync_fund_profile() touches rows |
|
room.red_flag.added |
Intelligence red-flag scanner inserts a RedFlag row |
|
MCP Connector Catalogue
These connectors are consumed by FundOS via the Model Context Protocol. In BYOD mode, your data never leaves your own MCP server — Kela reads in-memory and persists only outputs. Configure in Settings → MCP Connections.
| Connector | Kind | Modes | Used by | Notes |
|---|---|---|---|---|
| SharePoint | documents | BYOD | VDR, ODD, CIM | OAuth to your tenant; docs stay in SharePoint, Kela reads in-memory. |
| Egnyte | documents | BYOD | VDR, ODD, CIM | — |
| Google Drive | documents | BYOD | VDR, ODD, CIM | — |
| Dropbox | documents | BYOD | VDR, ODD, CIM | — |
| Salesforce | crm | BYOD | CRM | — |
| HubSpot | crm | BYOD | CRM | — |
| Affinity | crm | BYOD | CRM | — |
| DocuSign | e-sign | BYOD | Transactions | — |
| QuickBooks | accounting | BYOD | CFO | — |
| Xero | accounting | BYOD | CFO | — |
| Sage Intacct | accounting | BYOD | CFO | — |
| Bloomberg | market data | BYOD | Pricer, Risk | — |
| VentureInsights | private-markets data | BYOD | CRM, Investors, CIM, Risk | Funds, companies, LPs, deals. VI consumes Kela's MCP server in reverse. |
MCP Setup Quick Start
- Go to Settings → MCP Connections and click Add connection.
- Enter the server URL (HTTPS, SSE, or stdio command) and pick the modules that should use this source.
- Toggle BYOD mode if source documents should never be stored in Kela — outputs only.
- Kela will run a health check. Healthy connections appear as
sourceoptions inside each module's UI and API. - In API calls, reference the connection via
{"type": "mcp", "connection_id": N, "path": "..."}.