Valuat User-facing API Reference
Scope. This manual documents only the user-facing
GETendpoints. Internal microservice routes, webhooks, write operations (POST/PUT/DELETE), documents/reports, and integration routes are intentionally excluded. Auxiliary*/filtersendpoints (which only populate UI dropdowns) are not documented.Everything below is mock data. All identifiers, names, emails, and figures are fictional and serve only to illustrate the shape of responses. They do not correspond to any real entity on the platform. The free-form
dataobject is omitted from the examples — see §1.7.
Endpoint Index
Quick reference for each user-facing GET documented here and the use case that triggers it. Full detail (request example + response shape) is in the numbered sections below.
# | Endpoint | Use case — when you would call it |
|---|---|---|
1 |
| List all vehicles to populate the portfolio "Vehicles" table. |
2 |
| Load the full record of a fund when opening it. |
3 |
| List investment entities — companies (
) or funds (
) — for the portfolio tabs. |
4 |
| Load the detail card for a company/fund. |
5 |
| Display contact persons linked to a company. |
6 |
| List all LPs of the management company. |
7 |
| Load the detail card for an LP. |
8 |
| Display the contact persons for an LP. |
9 |
| Display an LP's subscription contracts across all vehicles. |
10 |
| List the LP accounts of a fund with their capital account KPIs (commitment, ownership, NAV…). |
11 |
| List the fund's portfolio holdings with per-asset KPIs (invested, value, MOIC, IRR). |
12 |
| List the portfolio cash-flow transactions (investments, distributions, escrow…). |
13 |
| List the valuation events recorded on the fund's holdings. |
14 |
| Open the detail of a single transaction or valuation (when clicking on those tabs). |
15 |
| List capital calls / distributions grouped into packages. |
16 |
| Open the detail of an operations package with its operations. |
17 |
| Show the per-LP cash-flow snapshot for each package (Cashflow Details tab). |
18 |
| Retrieve the chart of accounts hierarchy to render the trial balance. |
19 |
| Retrieve the month-by-month posted balances (trial balance values). |
20 |
| List the financial statements of a fund (Balance Sheet, P&L, Cash Flows…). |
21 |
| Load a full statement tree (Balance Sheet / P&L) with computed values. |
22 |
| Retrieve the consolidated chart of accounts at management-company level. |
23 |
| Retrieve the consolidated accounting balances at management-company level. |
24 |
| Retrieve the KPI matrix grouped by vehicle/LP/share class/portfolio for Fund State tables. |
25 |
| Retrieve the latest version (or the full history) of the cap table. |
26 |
| Check whether a cap table exists and read its configuration. |
27 |
| Render the cap table: ownership by shareholder and share class. |
28 |
| List the look-through portfolio snapshots of a fund-type asset. |
29 |
| Load a look-through snapshot with its underlying holdings. |
30 |
| List the tracked indicators of a company (Performance dashboard) with their value and variations. |
31 |
| Load the value and variations of a specific indicator when opening its detail view. |
1. Conventions
1.1 Base URL
https://{api-host}/api/public
All paths are relative to that base. Every endpoint uses HTTPS and returns application/json.
1.2 Authentication and Request Headers
All endpoints require a valid user session. Each request carries an authorization token issued by the central identity provider. A missing/invalid session returns 401; an authenticated user without permissions on the resource returns 403.
Standard headers (used by all endpoints in this manual):
Authorization: Bearer <session-token>
Accept: application/json
Code | Meaning |
|---|---|
| OK |
| Bad request / filters could not be validated |
| No active session for the current user |
| Authenticated but no permissions on the resource |
| Element not found |
| Unprocessable content |
1.3 How Requests and Filters Are Sent
All endpoints in this manual are GET, so there is no request body. All inputs travel in the query string. The structured filter is a JSON object passed in the search parameter, URL-encoded.
Practical example — sending {"date": 1782172799} as a search filter:
GET /api/public/funds/fund_0001/operations-packages?search=%7B%22date%22%3A1782172799%7D&page=1&size=25 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
Encoding rules (standard percent-encoding):
Character | Encoded |
|---|---|
|
|
|
|
|
|
|
|
|
|
(in
) |
|
So search={"subscription_level": 2} is sent as search=%7B%22subscription_level%22%3A2%7D, and sort=+name as sort=%2Bname.
Throughout the document each endpoint includes a Request block. For readability the decoded filter is shown inline; over the wire it goes percent-encoded as above. Since all requests are GET, the body is always empty.
1.4 List Wrapper and Pagination
List endpoints (those ending in mainPage, plural collection names, etc.) return a uniform wrapper:
{ "size": 25, "page": 1, "pages": 3, "total": 58, "items": [] }
Field | Type | Description |
|---|---|---|
| integer | Items on this page |
| integer | Current page (1-based) |
| integer | Total number of pages |
| integer | Total matching records |
| array | The page of records |
1.5 Common Query Parameters
Parameter | Type | Description |
|---|---|---|
| integer | Page index (1-based) |
| integer | Page size (e.g.
) |
| string | Sort key prefixed with
(asc) or
(desc), e.g.
,
,
|
| string (URL-encoded JSON) | Structured filter. May be omitted or empty (
); only required when it carries a core filter (see §1.5.1). Typically carries the date, e.g.
|
| integer (unix epoch, seconds) | End-of-day timestamp for the working date, for time-aware reads |
datesemantics. Most reads are as of a specific date: the app passes the selected date as a unix timestamp (end of day). KPIs, states, balances, and valuations are calculated as of that date.
1.5.1 Core Filters (Required)
Almost all filters within search are optional (they serve to refine results). Only the ones below change what the endpoint returns and are therefore the only mandatory ones. They are indicated in the Query block of each endpoint:
Filter | Where required | Purpose |
|---|---|---|
(
/
) |
| Selects Companies vs Funds |
(
/
/
) |
| Selects the view (Data Room / Onboarding / LP) |
(
/
/…) |
| Selects the financial statement |
(or
) |
| Selects the cap table version |
(
/
/
) |
| Granularity of the series |
/
|
(fund and management company) | Constrain the period |
| time-aware endpoints | Calculation date (see §1.5) |
1.6 Path Markers
{fundId}, {lpId}, {companyId}, {balanceTreeId}, {comtableId}, {packageId}, {kpiId} are opaque document IDs. The mock IDs used here (fund_0001, company_0001, lp_0001, …) are illustrative only. {date} in frontend routes is an ISO date (YYYY-MM-DD).
1.7 The data Object and Dynamic Fields
Several resources (Fund, Lp, Company, Contract, …) carry a free-form data object (and sometimes dynamicFields). Its content is omitted in all examples ("data": { … }).
The data response for each element varies according to each instance's configuration and depends on the definition made by the client team. It is not a fixed schema: the exact keys and values inside data change from one deployment to another depending on how that specific instance has been configured.
2. Portfolio — Vehicles (Funds)
Frontend location: /management-company/portfolios/vehicles/all
GET /funds/mainPage
Paginated list of vehicles (funds) managed by the management company.
Query: page, size, sort (e.g. +name)
Request
GET /api/public/funds/mainPage?page=1&size=25&sort=%2Bname HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
sort → +name · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 8,
"items": [
{
"id": "fund_0001",
"name": "Evergreen Ventures II, F.C.R.",
"numActiveInvestments": 7,
"numExists": 3,
"numWriteOffs": 0,
"contractsLevel2": 11,
"kpis": { "FPF-0011": 64873330.12, "FPF-0013": 68556441.23, "FPF-0009": 1.06, "FPF-0015": 37.94, ...}
}
]
}
GET /funds/{fundId}
Full record of a fund.
Request
GET /api/public/funds/fund_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No query, no body (GET).
{
"id": "fund_0001",
"name": "Evergreen Ventures II, F.C.R.",
"data": { }
}
3. Portfolio — Companies and Funds (Investment Entities)
Entities in which investments are made. The same endpoint is reused with a tags filter: company for the Companies tab, fund for the Funds tab.
Frontend location: /management-company/portfolios/companies/all · /management-company/portfolios/funds/all
GET /companies
Paginated list of investment entities.
Query: search — core {"tags": "company"} or {"tags": "fund"} · page, size, sort
Request
GET /api/public/companies?search=%7B%22tags%22%3A%22company%22%7D&page=1&size=25&sort=%2Bname HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"tags": "company"} · sort → +name · No body (GET).
{
"size": 25, "page": 1, "pages": 2, "total": 35,
"items": [
{ "id": "company_0001",
"name": "Northwind Robotics",
"tags": "company",
"data": { }
}
]
}
GET /companies/{companyId}
Detail record of an investment entity.
Request
GET /api/public/companies/company_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{ "id": "company_0001",
"name": "Northwind Robotics",
"tags": "company",
"data": { }
}
GET /companies/{companyId}/contacts
Contacts associated with a company (preview list).
Query: size
Request
GET /api/public/companies/company_0001/contacts?size=3 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"items": [
{ "id": "contact_0001",
"company": "company_0001",
"contact": { "firstname": "Dana", "lastname": "Reyes", "email": "dana.reyes@example.com" }
}
]
}
4. Investors (Limited Partners)
Frontend location: /management-company/investors/all
GET /lps/mainPage
Paginated list of all LPs across the management company.
Query: page, size, sort
Request
GET /api/public/lps/mainPage?page=1&size=25&sort=%2Bname HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
sort → +name · No body (GET).
{
"size": 25, "page": 1, "pages": 2, "total": 47,
"items": [
{
"id": "lp_0001",
"name": "Meridian Capital Partners",
"language": "en",
"contacts": ["contact_0001"],
"data": { },
"funds":[
{"id":"fund_001","name":"New Fund","subscription_level":2},
{"id":"fund_002","name":"New Fund 2","subscription_level":1}
]
}
]
}
GET /lps/{lpId}
Record of a single LP.
Request
GET /api/public/lps/lp_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"id": "lp_0001",
"name": "Meridian Capital Partners",
"language": "en",
"data": { }
}
GET /lps/{lpId}/contacts
Contact persons linked to the LP.
Query: size
Request
GET /api/public/lps/lp_0001/contacts?size=6 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"items": [
{
"id": "contact_0001",
"lp": "lp_0001",
"user": [
{
"id": "user_0001",
"firstName": "Robin",
"lastName": "Maris",
"email": "robin.maris@example.com"
},
{
"id": "user_0002",
"firstName": "Robin 2",
"lastName": "Maris 2",
"email": "robin2.maris2@example.com"
}
]
}
]
}
The contact's personal data is nested inside
user(firstName/lastName/sendEmail.
GET /lps/{lpId}/contracts
The LP's subscription contracts across its vehicles.
Subscription level = 0 → Data Room
Subscription level = 1 → Subscription Process
Subscription level = 2 → LP
Query: size
Request
GET /api/public/lps/lp_0001/contracts?size=6 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"items": [
{
"id": "contract_0001",
"fund": { "id": "fund_0001", "name": "Evergreen Ventures II, F.C.R." },
"lp": "lp_0001",
"amount": 1200000,
"subscriptionLevel": 2,
"form": { "commitment": 1200000, "share_class": { "id": "a", "value": "A" } }
}
]
}
fundis a nested object;lpis the investor's ID; the subscription form detail lives inform.
5. Fund — Investors, Onboarding, Contracts and Closings
Frontend location: /funds/{fundId}/investors/all/{date} (+ Onboarding / Data Room / LP Portal Updates tabs)
GET /funds/{fundId}/lps
LP accounts of the fund with their capital account KPIs (commitment, ownership, shares, drawn, distributions, NAV).
Query: search — core {"subscription_level": 2} · page, size, sort (e.g. -kpis.FLP-0001)
Request
GET /api/public/funds/fund_0001/lps?search=%7B%22subscription_level%22%3A2%7D&page=1&size=25&sort=-kpis.FLP-0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"subscription_level": 2} · sort → -kpis.FLP-0001 · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 11,
"subtotal": { },
"items": [
{
"id": "lp_0001",
"name": "Meridian Capital Partners",
"subscriptionLevel": 2,
"contacts": ["contact_0001"],
"language": "es",
"contract": {
"id": "contract_0001",
"form": {
"commitment": 1500000,
"share_class": { "id": "a", "value": "A" },
"distributor_name": { "id": "allfunds", "value": "Allfunds" }
}
},
"kpis": [
{ "id": "FLP-0001", "name": "Commitments", "format": "base", "value": 4000000 },
{ "id": "FLP-0002", "name": "Ownership", "format": "%", "value": 29.85 },
{ "id": "FLP-0064c", "name": "Contributions", "format": "base", "value": 6488537.85 },
...
],
"data": { }
}
]
}
kpisis an array of{id, name, format, value}(not a map). The share class and distributor are not top-level: they live incontract.form(share_class,distributor_name). The wrapper adds asubtotalwith the page totals.
6. Fund — Portfolio (Investments)
The vehicle's holdings. Three subtabs: Assets, Transactions, Valuations.
Frontend location: /funds/{fundId}/portfolios/investments/all/{date} · /funds/{fundId}/portfolios/transactions/{date} · /funds/{fundId}/portfolios/valuations/{date}
GET /funds/{fundId}/investments (Assets tab)
Paginated list of the fund's holdings (companies and stakes in other funds) with per-asset KPIs (invested, total value, profit, MOIC, IRR, status, type).
Query: page, size, sort (e.g. +company.name)
Request
GET /api/public/funds/fund_0001/investments?page=1&size=25&sort=%2Bcompany.name HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
sort → +company.name · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 10,
"items": [
{
"id": "investment_0001",
"company": {
"id": "company_0001",
"name": "Northwind Robotics",
"tags": "company",
"data": { }
},
"fund": "fund_0001",
"initialInvestmentDate": 1656115200,
"divestmentDate": 0,
"operations": ["operation_0001"],
"investmentDetails": [
{ "id": "invested", "name": "Invested", "format": "currency", "value": 5460000.00 },
{ "id": "totalValue", "name": "Total Value", "format": "currency", "value": 6260000.00 },
{ "id": "moic", "name": "MOIC", "format": "multiple", "value": 1.15 },
{ "id": "irr", "name": "IRR", "format": "%", "value": 2.62 }
],
"data": { }
}
]
}
Per-asset KPIs are not in
kpisbut ininvestmentDetails, an array of{id, name, format, value}(theirrvaluecomes as a percentage).companyis the full nested object of the investee entity (summarised here).
GET /funds/{fundId}/investments/transactions (Transactions tab)
Portfolio cash-flow transactions (investments, distributions, escrow, etc.) across the fund's holdings, with inflow/outflow and net cashflow.
Query: search (carries date) · page, size, sort (e.g. -date)
Request
GET /api/public/funds/fund_0001/investments/transactions?search=%7B%22date%22%3A1782172799%7D&page=1&size=25&sort=-date HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · sort → -date · No body (GET).
{
"size": 25, "page": 1, "pages": 2, "total": 49,
"items": [
{
"id": "transaction_0001",
"name": "Investment",
"type": "investment",
"subtype": "primary",
"date": 1766966400,
"executionDate": 1766966400,
"fund": "fund_0001",
"investment": { "id": "investment_0001", "company": { "id": "company_0001", "name": "Northwind Robotics", "tags": "company" } },
"elementType": "company",
"elementId": "company_0001",
"cashflowIn": 0.00,
"cashflowOut": 150000.00,
"netCashflow": -150000.00,
"data": { }
}
]
}
Each row references the holding via the nested
investmentobject (not a flatasset) pluselementType/elementIdof the affected element.type/subtypedescribe the transaction (investment/primary,distribution, …);cashflowIn/cashflowOut/netCashflowandamount/currencyare the amounts.
GET /funds/{fundId}/investments/valuations (Valuations tab)
Valuation events recorded on the fund's holdings, with the valued amount and the associated supporting document marker.
Query: search (carries date) · page, size, sort (e.g. -date)
Request
GET /api/public/funds/fund_0001/investments/valuations?search=%7B%22date%22%3A1782172799%7D&page=1&size=25&sort=-date HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · sort → -date · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 8,
"items": [
{
"id": "valuation_0001",
"name": "NAV Q4 2025",
"type": "valuation",
"subtype": "nav",
"date": 1767139200,
"executionDate": 1767139200,
"amount": 98000.00,
"fund": "fund_0001",
"investment": { "id": "investment_0002", "company": { "id": "company_0002", "name": "Compass Growth Fund III, F.C.R.", "tags": "fund" } },
"elementType": "fund",
"elementId": "fund_0002",
"data": { }
}
]
}
Same shape as a transaction but with
type: "valuation",amountcarrying the valued amount, and no cashflow fields. References the holding viainvestment+elementType/elementId(notasset).
GET /funds/{fundId}/investments/{investmentId}/operations/{operationId} (transaction / valuation detail)
Detail of a single portfolio operation. This is what opens when clicking a row in the Transactions tab or the Valuations tab — the same operation record backs both (a valuation is an operation with type/valuationType populated). Returns the full operation plus portfolio KPI state snapshots before (preState) and at (state) the operation's date.
Request
GET /api/public/funds/fund_0001/investments/investment_0001/operations/operation_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"id": "operation_0001",
"name": "Investment",
"type": "investment",
"subtype": "primary",
"amount": 150000.00,
"currency": "EUR",
"fund": "fund_0001",
"investment": "investment_0001",
"elementType": "company",
"elementId": "company_0001",
"date": 1766966400,
"executionDate": 1766966400,
"preState": { },
"state": { },
"data": { }
}
preState/statecarry the portfolio KPI snapshot (omitted here — keys encoded by KPI). Can be obtained from the GET states endpoint.
7. Operations and Cash Flows
Frontend location: /funds/{fundId}/operations/all/{date} (Calls and Distributions tab) · /funds/{fundId}/operations/snapshot/{date} (Cashflow Details tab) · /funds/{fundId}/operations/{packageId}/details/{date} (package detail)
GET /funds/{fundId}/operations-packages
Capital calls, distributions, and other operations grouped into packages. Each package carries its list of operations (objects) and cashflow, the net cash flow of the package (Net Cashflow column in the Calls and Distributions table).
Query: search (carries date) · size, page
Request
GET /api/public/funds/fund_0001/operations-packages?search=%7B%22date%22%3A1782172799%7D&size=25&page=1 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 17,
"items": [
{
"id": "oppackage_0005",
"name": "Capital Call 5",
"fund": "fund_0001",
"date": 1781568000,
"executionDate": 1781568000,
"dueDate": 1781654400,
"cashflow": 10000000.00,
"operations": [
{ "id": "operation_0001", "type": "call", "subtype": "investment", "name": "CC5", "elementType": "fund", "elementId": "fund_0001", "amount": 10000000.00, "date": 1781568000, "data": { } }
]
}
]
}
operations[].type∈add_lp,call,distribution,temporary_distribution,update_portfolio,secondary_sale. The Drawdown / Permanent Distributions / New Commitments columns in the table are derived in the frontend from the package's operations;cashflowis the pre-calculated net.
GET /funds/{fundId}/operations-packages/{packageId} (package detail)
Detail of a single operations package — what opens at /funds/{fundId}/operations/{packageId}/details/{date} when clicking a row in Calls and Distributions. Returns the package with its full list of operations (each with its type, amount, affected element, and dynamic data).
Request
GET /api/public/funds/fund_0001/operations-packages/oppackage_0005 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"id": "oppackage_0005",
"name": "Capital Call 5",
"fund": "fund_0001",
"date": 1781568000,
"executionDate": 1781568000,
"dueDate": 1781654400,
"operations": [
{
"id": "operation_0001",
"type": "call",
"subtype": "investment",
"name": "CC5",
"fund": "fund_0001",
"package": "oppackage_0005",
"elementType": "fund",
"elementId": "fund_0001",
"amount": 10000000.00,
"date": 1781568000,
"dueDate": 1781654400,
"data": { }
}
]
}
elementType/elementIdpoint to the element affected by each operation (fund,lp,portfolio…).dataanddynamicFieldsare per instance configuration (see §1.7).
GET /funds/{fundId}/operations-packages/snapshot (Cashflow Details tab)
Cash-flow snapshot per LP: one row per (package, LP) pair with the amounts and share movement for that operation for that LP. Feeds the Cashflow Details tab (/funds/{fundId}/operations/snapshot/{date}). The FLP-* keys are the per-LP KPIs from the fund's catalogue.
Query: search (carries date) · size, page, sort (e.g. -date)
Request
GET /api/public/funds/fund_0001/operations-packages/snapshot?search=%7B%22date%22%3A1782172799%7D&size=25&page=1&sort=-date HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · sort → -date · No body (GET).
{
"size": 25, "page": 1, "pages": 1, "total": 60,
"items": [
{
"packageId": "oppackage_0005",
"packageName": "Capital Call 5",
"date": 1781568000,
"dueDate": 1781661600,
"lpId": "lp_0001",
"name": "Meridian Capital Partners",
"language": "es",
"shareClass": "a",
"distributorName": "Allfunds",
"FLP-0001": 1000000,
"operationDrawdown": 746212.97,
"operationDrawdownPerc": 74.62,
"operationDistribution": 0,
"totalDistribution": 210101.01,
"preOpShares": 718219.48,
"postOpShares": 1464674.13,
"acquiredSoldShares": 746454.65,
"subscriptionValue": 0.9997,
"redemptionValue": 0,
...
}
]
}
operationDrawdown/operationDistributionare the amounts for that operation for the LP;operationDrawdownPercis in percentage.preOpShares/postOpShares/acquiredSoldSharesare the share movement, andsubscriptionValue/redemptionValueare the applied NAV.
8. Financials / Accounting
Frontend location (fund): /funds/{fundId}/accounting/overview/{date}
Frontend location (management company): /management-company/accounting/amounts-and-balances/{date}
8.0 How Accounting Data Is Organized
Layer | What it is | Endpoints |
|---|---|---|
Trial balance (raw) | The trial balance: account codes and their month-by-month posted amounts. |
,
|
Financial statements (structured) | Curated statement trees — Balance Sheet, P&L, Cash Flows, NAV cascade — each a hierarchy of nodes whose values are computed from the trial balance and/or fund KPIs. |
,
|
- Trial balance → combine
/amounts-balances/trees(chart of accounts hierarchy: codes, names, levels) with/amounts-balances(amount per account perYYYY-MM). Walk the tree and look up each node's value by itscodein the amounts map. - Balance Sheet → the tree with
type = "balance_sheets". List it with/accounting/balances?search={"type":"balance_sheets"}, and get the full hierarchy (Assets / Liabilities → groups → accounts, each with a computedvalue) with/accounting/balances/{balanceTreeId}. - Profit & Loss → the tree with
type = "profits_losses"(same/accounting/balances+/{balanceTreeId}pattern as the Balance Sheet).
Statement types:
balance_sheets,profits_losses,cashflows,nav_cascade.
GET /funds/{fundId}/amounts-balances/trees
The chart of accounts tree(s). rootNodes is the list of root node IDs and the full hierarchy is in tree.
Request
GET /api/public/funds/fund_0001/amounts-balances/trees HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
[
{
"id": "abtree_0001",
"fund": "fund_0001",
"rootNodes": ["node_1"],
"dynamicFields": { },
"tree": [
{
"id": "node_1", "tree": "abtree_0001", "code": "1", "name": "Basic Financing", "format": "BASE", "level": 0, "type": null, "parentId": null,
"children": [
{ "id": "node_10", "tree": "abtree_0001", "code": "10", "name": "Capital", "format": "BASE", "level": 1, "type": null, "parentId": "node_1",
"children": [ { "id": "node_101", "tree": "abtree_0001", "code": "101", "name": "Registered Fund Capital", "format": "BASE", "level": 2, "type": null, "parentId": "node_10", "children": [] } ] }
]
}
]
}
]
rootNodesis the list of root node IDs; the full hierarchy is intree. Each node:{id, tree, code, name, format, level, type, parentId, children, dynamicFields}(formatin uppercase, e.g.BASE).
GET /funds/{fundId}/amounts-balances
The posted amounts and balances — the trial balance values, indexed as month → elementType → elementId → accountCode → amount.
Query: search — core {"startDate": <ts>, "endDate": <ts>} (startDate defaults to 0, endDate to now)
Request
GET /api/public/funds/fund_0001/amounts-balances?search=%7B%22endDate%22%3A1798761599%7D HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"endDate": 1798761599} · No body (GET).
{
"data": {
"2026-03": { "fund": { "fund_0001": { "101000000001": -4460000.00, "101000000002": -2230000.00, "240500000001": 8020000.00 } } },
"2026-06": { "fund": { "fund_0001": { "101000000001": -4460000.00, "240500000001": 8020000.00 } } }
}
}
GET /funds/{fundId}/accounting/balances
List of the fund's financial statement trees (summaries, without node values). Filter by type.
Query: search — core {"type": "balance_sheets"} (profits_losses / cashflows / nav_cascade) · sort (e.g. -date)
Request
GET /api/public/funds/fund_0001/accounting/balances?search=%7B%22type%22%3A%22balance_sheets%22%7D&sort=-date HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"type": "balance_sheets"} · sort → -date · No body (GET).
[
{ "id": "balancetree_0001", "name": "Balance Sheet 2026", "fund": "fund_0001", "date": 1782172799, "type": "balance_sheets", "isDraft": false },
{ "id": "balancetree_0002", "name": "P&L 2026", "fund": "fund_0001", "date": 1782172799, "type": "profits_losses", "isDraft": false }
]
GET /funds/{fundId}/accounting/balances/{balanceTreeId}
A single financial statement. rootNodes is the list of root node IDs and the full hierarchy is in tree. Each node carries its computed value (plus qtdValue / ytdValue), its format, level, and how it is derived (fieldType = kpi | abc, fieldId, operator).
Request
GET /api/public/funds/fund_0001/accounting/balances/balancetree_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"id": "balancetree_0001",
"rootNodes": ["bn_1"],
"name": "Balance Sheet 2026",
"fund": "fund_0001",
"date": 1782172799,
"type": "balance_sheets",
"isDraft": false,
"dynamicFields": { },
"tree": [
{
"id": "bn_1", "tree": "balancetree_0001", "code": "activo", "name": "ASSETS", "format": "BASE", "level": 0, "parentId": null,
"fieldType": null, "fieldId": null, "operator": "+", "value": 48250000.00, "qtdValue": 0, "ytdValue": 0, "dynamicFields": { },
"children": [
{ "id": "bn_11", "tree": "balancetree_0001", "code": "25_cuenta_25", "name": "Account 25", "format": "base", "level": 1, "parentId": "bn_1",
"fieldType": "abc", "fieldId": "25", "operator": "+", "value": 44210303.36, "qtdValue": 0, "ytdValue": 0, "dynamicFields": { }, "children": [] }
]
}
]
}
GET /management-company/amounts-balances/trees
Chart of accounts tree(s) at management-company level — same structure as the fund trees (except the tree item does not carry fund).
Request
GET /api/public/management-company/amounts-balances/trees HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
[
{
"id": "mctree_0001",
"rootNodes": ["mnode_1"],
"dynamicFields": { },
"tree": [
{
"id": "mnode_1", "tree": "mctree_0001", "code": "1", "name": "Account 1", "format": "BASE", "level": 0, "type": null, "parentId": null,
"children": [
{ "id": "mnode_10", "tree": "mctree_0001", "code": "10", "name": "Initial Capital", "format": "BASE", "level": 1, "type": null, "parentId": "mnode_1", "children": [] }
]
}
]
}
]
Same structure as the fund tree, except the tree item does not carry
fund. Each node is{id, tree, code, name, format, level, type, parentId, children, dynamicFields}(formatin uppercase, e.g.BASE).
GET /management-company/amounts-balances
Period amounts and balances at management-company level.
Query: search — core {"endDate": <ts>}
Request
GET /api/public/management-company/amounts-balances?search=%7B%22endDate%22%3A1798761599%7D HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"endDate": 1798761599} · No body (GET).
{
"data": {
"2026-03": { "1": -14439038.21, "2": 8024500.60, "6": 2169843.96, "623000000011": 223344 },
"2026-04": { "6": 223344, "623000000011": 223344 }
}
}
At management-company level the index is direct:
data → "YYYY-MM" → accountCode → amount(without theelementType/elementIdlayers of the fund version).
9. Fund State
Frontend location: /funds/{fundId}/states/fund/{date} (tabs: Vehicle, LP, Share classes, Portfolio, Trial Balances)
GET /funds/{fundId}/kpis/states/grouped
Fund KPI states grouped by dimension. The response is not a list wrapper: it is an object with one key per grouping (fund, lp, shareClass, portfolio) plus two dictionaries (kpis, abcs) that describe how to label/format the columns. Each frontend tab maps to a grouping: Vehicle → fund, LP → lp, Share classes → shareClass, Portfolio → portfolio, Trial Balances → accounts from abcs.
fund/lp/shareClass/portfolio: arrays of rows{ id, name, kpis: { … }, … }.portfoliorows addlogo;fundrows add their ownabcsblock.kpis: dictionarykpiCode → { id, name, format }for labelling and formatting each column.abcs: dictionaryaccountCode → { code, name, format }(chart of accounts for the Trial Balances tab).
Within kpis per row, values are in their native unit: amounts in euros, ratios as numbers (MOIC FPF-0009 ≈ 1.057) and IRR (FPF-0015) as a percentage (e.g. 37.94). Some auxiliary J-curve keys arrive as comma-separated value strings: FPF-0015dates (YYYY-MM-DD dates) and FPF-0015cashflows (amounts).
Query: search (carries date)
Request
GET /api/public/funds/fund_0001/kpis/states/grouped?search=%7B%22date%22%3A1782172799%7D HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · No body (GET).
{
"fund": [
{
"id": "fund_0001",
"name": "Evergreen Ventures II, F.C.R.",
"kpis": {
"FPF-0015dates": "2025-12-31,2026-03-31,2026-06-30",
"FPF-0015cashflows": "-440878.23,-294888.55,120000.00",
"FPF-0011": 64873330.12,
"FPF-0013": 68556441.23,
"FPF-0012": 64860382.02,
"FPF-0009": 1.0570,
"FPF-0008": 3683111.11,
"FPF-0015": 37.94,
"cnmv_report_cr1_1160": 0,
"cnmv_report_cr65": 0
},
"abcs": { "101000000001": -4460000.00, "240500000001": 8020000.00 }
}
],
"lp": [
{ "id": "lp_0001", "name": "Meridian Capital Partners", "kpis": { "FLP-0001": 4000000, "FLP-0003": 0.2985, "FLP-0064c": 6040000.00 } }
],
"shareClass": [
{ "id": "shareclass_a", "name": "A", "kpis": { "FSC-0001": 13400000, "FSC-0011": 64800000.00 } }
],
"portfolio": [
{ "id": "investment_0001", "name": "Northwind Robotics", "logo": "logo_0001", "kpis": { "PF-0011": 6260000.00, "PF-0013": 800000.00 } }
],
"kpis": {
"FPF-0011": { "id": "FPF-0011", "name": "Unrealized Value", "format": "currency" },
"FPF-0009": { "id": "FPF-0009", "name": "MOIC", "format": "multiple" },
"FPF-0015": { "id": "FPF-0015", "name": "IRR", "format": "percentage" }
},
"abcs": {
"1": { "code": "1", "name": "Basic Financing", "format": "base" },
"101": { "code": "101", "name": "Registered Fund Capital", "format": "base" }
}
}
10. Company Cap Table
The shareholding structure of a portfolio company: shareholders, share classes, ownership (incl. fully diluted), options, debt, and historical versions.
Frontend location: /assets/companies/{companyId}/investors/captable/{date} (+ Historical: …/investors/captable/historic/{date})
GET /companies/{companyId}/captable/versions
Cap table versions. With size=1 and sort=-date returns the latest version (to render the current cap table); the Historical view requests the full paginated list.
Query: page, size, sort (e.g. -date)
Request
GET /api/public/companies/company_0001/captable/versions?sort=-date&size=1 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
sort → -date · No body (GET).
{
"size": 1, "page": 1, "pages": 5, "total": 5,
"items": [
{
"id": "captableversion_0004",
"company": "company_0001",
"captable": "captable_0001",
"name": "Cap table - 14-06-2026",
"date": 1781913600
}
]
}
There is no numeric
versionfield; order is determined bydate/draft.shares,debts, andoptionsare arrays of IDs of those version elements.
GET /companies/{companyId}/captable/info
Cap table metadata for the company (whether a cap table exists, diluted valuation flag, name/description).
Request
GET /api/public/companies/company_0001/captable/info HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"captable": {
"id": "captable_0001",
"company": "company_0001",
"name": ""
},
"date": 1782259199,
"shareClasses": [
{ "id": "shareclass_a", "type": "common", "name": "A", "code": "a" }
],
"companyShareholders": [
{ "id": "shareholder_a", "shareholder": { "id": "general_shareholder_code", "name": "Alessandro" } }
]
}
The response wraps the cap table in
captableand includesshareClassesandcompanyShareholders.
GET /companies/{companyId}/captable/summary/table
The cap table itself: one row per shareholder with shares, options, debt, ownership, fully diluted ownership, invested amount, price per share, and the breakdown by share class. Plus a totals object.
Query: search — core {"version": "<versionId>"} (or {"date": <ts>})
Request
GET /api/public/companies/company_0001/captable/summary/table?search=%7B%22version%22%3A%22captableversion_0004%22%7D HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"version": "captableversion_0004"} · No body (GET).
{
"items": [
{
"id": "shareholderlink_0001",
"name": "Olivia Brand",
"shares": 1000000,
"options": { "amount": 1000000 },
"debt": { "amount": 1000000.00 },
"ownership": 25,
"fullyDiluted": 33.33,
"pps": 1.00,
"amount": 1000000.00,
"shareClasses": ["unassigned", "shareclass_seed"],
"byShareClass": [
{ "id": "shareclass_seed", "ownership": 0, "pps": 1.00, "amount": 1000000.00, "shares": 1000000 }
]
}
],
"total": 2,
"totals": {
"id": "total",
"name": "total",
"options": { "amount": 2000000 },
"debt": { "amount": 3500000.00 },
"fullyDiluted": 100,
"shares": 4000000,
"ownership": 100,
"pps": 1.00,
"amount": 4000000.00
}
}
ownershipandfullyDilutedare in percentage (25,33.33), not as a fraction.shareClassesis a list of class IDs (including"unassigned"). EachbyShareClassentry and thetotalsobject repeat the same set of metrics (ownership,fullyDiluted,votes,capital,options,debt,pps,amount,shares).
11. Fund-Type Asset — Underlying Portfolio
When a holding is itself a fund (fund-of-funds position), the asset exposes its underlying portfolio (look-through): the underlying companies/holdings of that fund, by reporting period.
Frontend location: /assets/funds/{companyId}/portfolio
GET /companies/{companyId}/comtables
Available snapshots of the underlying portfolio (reporting periods) for the fund-type asset. This is not a list wrapper: it returns tables (the snapshots) and struct (the column definition for the table).
Query: page, size, sort
Request
GET /api/public/companies/fund_asset_0001/comtables HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
{
"tables": [
{
"id": "comtable_0001",
"name": "T1",
"date": 1743379200,
"investedCompanies": {
"id": "fund_asset_0001",
"name": "Compass Growth Fund III, F.C.R.",
"data": { }
},
"state": {
"id": "fund_asset_0001",
"name": "Compass Growth Fund III, F.C.R.",
"value_1": "100",
"value_2": "100",
"value_3": "100",
"value_4": "100",
...
}
}
]
}
tableslists the snapshots; each withid,name,date,investedCompanies(the underlying company/fund, nested object), andstate(object with the snapshot's computed values:value_1,value_2, …).
GET /companies/{companyId}/comtables/{comtableId}
A single look-through snapshot. The response is an array of tables; each table defines its columns in headers and its data in rows (one row per underlying company/holding). Each row is a dynamic record whose keys are the code values from headers.
Request
GET /api/public/companies/fund_asset_0001/comtables/comtable_0001 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
No body (GET).
[
{
"name": "Underlying Portfolio",
"code": "portfolio",
"headers": [
{ "name": "Logo", "code": "logo", "type": "IMG", "format": "", "position": 0 },
{ "name": "Name", "code": "name", "type": "TEXT", "format": "", "position": 1, "isRequired": true },
{ "name": "Type", "code": "type", "type": "SELECT", "options": ["Active", "Divested", "Write Off"], "position": 2 },
{ "name": "Invested (Total)", "code": "invested_total", "type": "NUMBER", "position": 3 },
{ "name": "Invested (Current)", "code": "invested_current", "type": "NUMBER", "position": 4 },
{ "name": "MOIC", "code": "moic", "type": "NUMBER", "position": 8 },
{ "name": "IRR", "code": "irr", "type": "NUMBER", "position": 9 }
],
"rows": [
{
"id": "underlying_0001",
"logo": "logo_0001",
"name": "Helios Analytics",
"type": "Active",
"invested_total": 123000.00,
"invested_current": 123000.00,
"realized_value": 0.00,
"unrealized_value": 123000.00,
"total_value": 123000.00,
"moic": 1.00,
"irr": 0.05
}
]
}
]
headerscarryname,code,type(TEXT,NUMBER,SELECT,IMG…),positionand, for selects,options. The keys of eachrowmatch thosecodevalues (invested_total,moic,irr, …).
12. Company Financials — Tracked Indicators (Investment KPIs)
The tracked indicators (financial and business) monitored on a portfolio company — the Performance dashboard in the company context. Each indicator (KPI) shows its latest value and its MOM (month-over-month), QTD, YTD, and YOY variations, along with an aggregated summary block. Opening an indicator provides its detail and its historical series (actual vs. forecast), with monthly / quarterly / annual granularity.
Variations (
mom/qtd/ytd/yoy/vsForecast) are in percentage points (e.g.45.46= +45.46%; they can be negative). When a company has no values loaded,calculated/forecast/variations arrive asnulland the series (monthlyCalculatedSeries,detailSeries,series.*) come back empty.
Item field | Notes |
|---|---|
|
|
|
| Value format:
,
,
, … |
| "Good" direction of the indicator:
|
|
| How it is aggregated per period:
(cumulative) |
(end of period) … |
|
(manually entered) |
(computed by formula) |
|
|
|
|
/
| Period of the value (
) and its end-of-day timestamp |
/
| Actual and forecast value for the period |
| Sparkline mini-series: object
(period → value map) |
Frontend location: /assets/companies/{companyId}/financials/dashboard/{date} · detail: /assets/companies/{companyId}/financials/kpi/{kpiId}/details/{date}
GET /companies/{companyId}/investment-kpis/dashboard
Paginated list of the company's tracked indicators. Each item is the indicator definition for this company plus a dashboard object with the value computed as of the date and its variations. These are the Performance dashboard cards.
Query: search (carries date) · page, size (e.g. 9)
Request
GET /api/public/companies/company_0001/investment-kpis/dashboard?search=%7B%22date%22%3A1782172799%7D&page=1&size=9 HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799} · No body (GET).
{
"size": 9, "page": 1, "pages": 2, "total": 15,
"items": [
{
"id": "investmentkpi_0001",
"name": "ARR (Annual Recurring Revenue)",
"description": "Annual Recurring Revenue",
"category": "financial",
"unit": "currency",
"positive": "up",
"aggregate": "eop",
"type": "input",
"company": "company_0001",
"dashboard": {
"periodKey": "2026-06",
"anchorTimestamp": 1782863999,
"calculated": 13891754,
"forecast": 12960000,
"mom": -1.52,
"qtd": 45.46,
"ytd": 40.26,
"yoy": 101.08,
"vsForecast": 7.19,
"monthlyCalculatedSeries": {
"2026-06": 13891754,
"2026-05": 14106513,
"2026-04": 13609559
}
}
}
]
}
GET /companies/{companyId}/investment-kpis/{kpiId}/dashboard
Detail of a single indicator. Returns the same shape as a list item (definition + dashboard object), except the dashboard object carries detailSeries instead of monthlyCalculatedSeries. detailSeries is an array with the full historical series by period; each point with periodKey, date, anchorTimestamp, calculated, forecast, vsForecast, and mom (null for the oldest period).
Query: search — carries date and core periodicity (monthly | quarterly | annual)
Request
GET /api/public/companies/company_0001/investment-kpis/investmentkpi_0001/dashboard?search=%7B%22date%22%3A1782172799%2C%22periodicity%22%3A%22monthly%22%7D HTTP/1.1
Host: {api-host}
Authorization: Bearer <session-token>
Accept: application/json
search → {"date": 1782172799, "periodicity": "monthly"} · No body (GET).
{
"id": "investmentkpi_0001",
"name": "ARR (Annual Recurring Revenue)",
"description": "Annual Recurring Revenue",
"category": "financial",
"unit": "currency",
"positive": "up",
"aggregate": "eop",
"company": "company_0001",
"dashboard": {
"periodKey": "2026-06",
"anchorTimestamp": 1782863999,
"calculated": 13891754,
"forecast": 12960000,
"mom": -1.52,
"qtd": 45.46,
"ytd": 40.26,
"yoy": 101.08,
"vsForecast": 7.19,
"detailSeries": [
{ "periodKey": "2026-06", "date": 1782863999, "anchorTimestamp": 1782863999, "calculated": 13891754, "forecast": 12960000, "vsForecast": 7.19, "mom": -1.52 },
{ "periodKey": "2026-05", "date": 1780271999, "anchorTimestamp": 1780271999, "calculated": 14106513, "forecast": 12297661, "vsForecast": 14.71, "mom": 3.65 }
]
}
}
Generated from a live capture of authenticated GET /api/public/ traffic from the Valuat web application, cross-referenced with VCLand backend data models. All identifiers, names, and figures in this document are fictional mock data; the dynamic data object is omitted (see §1.7).