Valuat User-facing API Reference

This manual documents the user-facing GET endpoints

Scope. This manual documents only the user-facing GET endpoints. Internal microservice routes, webhooks, write operations (POST/PUT/DELETE), documents/reports, and integration routes are intentionally excluded. Auxiliary */filters endpoints (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 data object 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

GET /funds/mainPage

List all vehicles to populate the portfolio "Vehicles" table.

2

GET /funds/{fundId}

Load the full record of a fund when opening it.

3

GET /companies

List investment entities — companies (

tags=company

) or funds (

tags=fund

) — for the portfolio tabs.

4

GET /companies/{companyId}

Load the detail card for a company/fund.

5

GET /companies/{companyId}/contacts

Display contact persons linked to a company.

6

GET /lps/mainPage

List all LPs of the management company.

7

GET /lps/{lpId}

Load the detail card for an LP.

8

GET /lps/{lpId}/contacts

Display the contact persons for an LP.

9

GET /lps/{lpId}/contracts

Display an LP's subscription contracts across all vehicles.

10

GET /funds/{fundId}/lps

List the LP accounts of a fund with their capital account KPIs (commitment, ownership, NAV…).

11

GET /funds/{fundId}/investments

List the fund's portfolio holdings with per-asset KPIs (invested, value, MOIC, IRR).

12

GET /funds/{fundId}/investments/transactions

List the portfolio cash-flow transactions (investments, distributions, escrow…).

13

GET /funds/{fundId}/investments/valuations

List the valuation events recorded on the fund's holdings.

14

GET /funds/{fundId}/investments/{investmentId}/operations/{operationId}

Open the detail of a single transaction or valuation (when clicking on those tabs).

15

GET /funds/{fundId}/operations-packages

List capital calls / distributions grouped into packages.

16

GET /funds/{fundId}/operations-packages/{packageId}

Open the detail of an operations package with its operations.

17

GET /funds/{fundId}/operations-packages/snapshot

Show the per-LP cash-flow snapshot for each package (Cashflow Details tab).

18

GET /funds/{fundId}/amounts-balances/trees

Retrieve the chart of accounts hierarchy to render the trial balance.

19

GET /funds/{fundId}/amounts-balances

Retrieve the month-by-month posted balances (trial balance values).

20

GET /funds/{fundId}/accounting/balances

List the financial statements of a fund (Balance Sheet, P&L, Cash Flows…).

21

GET /funds/{fundId}/accounting/balances/{balanceTreeId}

Load a full statement tree (Balance Sheet / P&L) with computed values.

22

GET /management-company/amounts-balances/trees

Retrieve the consolidated chart of accounts at management-company level.

23

GET /management-company/amounts-balances

Retrieve the consolidated accounting balances at management-company level.

24

GET /funds/{fundId}/kpis/states/grouped

Retrieve the KPI matrix grouped by vehicle/LP/share class/portfolio for Fund State tables.

25

GET /companies/{companyId}/captable/versions

Retrieve the latest version (or the full history) of the cap table.

26

GET /companies/{companyId}/captable/info

Check whether a cap table exists and read its configuration.

27

GET /companies/{companyId}/captable/summary/table

Render the cap table: ownership by shareholder and share class.

28

GET /companies/{companyId}/comtables

List the look-through portfolio snapshots of a fund-type asset.

29

GET /companies/{companyId}/comtables/{comtableId}

Load a look-through snapshot with its underlying holdings.

30

GET /companies/{companyId}/investment-kpis/dashboard

List the tracked indicators of a company (Performance dashboard) with their value and variations.

31

GET /companies/{companyId}/investment-kpis/{kpiId}/dashboard

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

200

OK

400

Bad request / filters could not be validated

401

No active session for the current user

403

Authenticated but no permissions on the resource

404

Element not found

422

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

{

%7B

}

%7D

"

%22

:

%3A

,

%2C

+

(in

sort=+name

)

%2B

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

size

integer

Items on this page

page

integer

Current page (1-based)

pages

integer

Total number of pages

total

integer

Total matching records

items

array

The page of records

1.5 Common Query Parameters

Parameter

Type

Description

page

integer

Page index (1-based)

size

integer

Page size (e.g.

25

)

sort

string

Sort key prefixed with

+

(asc) or

-

(desc), e.g.

+name

,

-date

,

-kpis.FLP-0001

search

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.

{"date": 1782172799}

date

integer (unix epoch, seconds)

End-of-day timestamp for the working date, for time-aware reads

date semantics. 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

tags

(

company

/

fund

)

GET /companies

Selects Companies vs Funds

subscription_level

(

0

/

1

/

2

)

GET /funds/{fundId}/lps

Selects the view (Data Room / Onboarding / LP)

type

(

balance_sheets

/

profits_losses

/…)

GET /funds/{fundId}/accounting/balances

Selects the financial statement

version

(or

date

)

GET /companies/{companyId}/captable/summary/table

Selects the cap table version

periodicity

(

monthly

/

quarterly

/

annual

)

GET …/investment-kpis/{kpiId}/dashboard

Granularity of the series

startDate

/

endDate

GET …/amounts-balances

(fund and management company)

Constrain the period

date

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: searchcore {"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/email/…). 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" } }
}
]
}

fund is a nested object; lp is the investor's ID; the subscription form detail lives in form.


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: searchcore {"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": { }
}
]
}

kpis is an array of {id, name, format, value} (not a map). The share class and distributor are not top-level: they live in contract.form (share_class, distributor_name). The wrapper adds a subtotal with 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 kpis but in investmentDetails, an array of {id, name, format, value} (the irr value comes as a percentage). company is 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 investment object (not a flat asset) plus elementType/elementId of the affected element. type/subtype describe the transaction (investment/primary, distribution, …); cashflowIn/cashflowOut/netCashflow and amount/currency are 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", amount carrying the valued amount, and no cashflow fields. References the holding via investment + elementType/elementId (not asset).

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/state carry 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[].typeadd_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; cashflow is 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/elementId point to the element affected by each operation (fund, lp, portfolio…). data and dynamicFields are 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 / operationDistribution are the amounts for that operation for the LP; operationDrawdownPerc is in percentage. preOpShares / postOpShares / acquiredSoldShares are the share movement, and subscriptionValue / redemptionValue are 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.

/amounts-balances

,

/amounts-balances/trees

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.

/accounting/balances

,

/accounting/balances/{balanceTreeId}

  • Trial balance → combine /amounts-balances/trees (chart of accounts hierarchy: codes, names, levels) with /amounts-balances (amount per account per YYYY-MM). Walk the tree and look up each node's value by its code in 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 computed value) 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": [] } ] }
]
}
]
}
]

rootNodes is the list of root node IDs; the full hierarchy is in tree. Each node: {id, tree, code, name, format, level, type, parentId, children, dynamicFields} (format in 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: searchcore {"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: searchcore {"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} (format in uppercase, e.g. BASE).

GET /management-company/amounts-balances

Period amounts and balances at management-company level.

Query: searchcore {"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 the elementType/elementId layers 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: Vehiclefund, LPlp, Share classesshareClass, Portfolioportfolio, Trial Balances → accounts from abcs.

  • fund / lp / shareClass / portfolio: arrays of rows { id, name, kpis: { … }, … }. portfolio rows add logo; fund rows add their own abcs block.
  • kpis: dictionary kpiCode → { id, name, format } for labelling and formatting each column.
  • abcs: dictionary accountCode → { 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-00091.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 version field; order is determined by date/draft. shares, debts, and options are 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 captable and includes shareClasses and companyShareholders.

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: searchcore {"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
}
}

ownership and fullyDiluted are in percentage (25, 33.33), not as a fraction. shareClasses is a list of class IDs (including "unassigned"). Each byShareClass entry and the totals object 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",
...
}
}
]
}

tables lists the snapshots; each with id, name, date, investedCompanies (the underlying company/fund, nested object), and state (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
}
]
}
]

headers carry name, code, type (TEXT, NUMBER, SELECT, IMG…), position and, for selects, options. The keys of each row match those code values (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 as null and the series (monthlyCalculatedSeries, detailSeries, series.*) come back empty.

Item field

Notes

category

financial

|

business

unit

Value format:

integer

,

currency

,

percentage

, …

positive

"Good" direction of the indicator:

up

|

down

aggregate

How it is aggregated per period:

acc

(cumulative) |

eop

(end of period) …

type

input

(manually entered) |

formula

(computed by formula)

periodicity

monthly

|

quarterly

|

annual

dashboard.periodKey

/

.anchorTimestamp

Period of the value (

YYYY-MM

) and its end-of-day timestamp

dashboard.calculated

/

.forecast

Actual and forecast value for the period

dashboard.monthlyCalculatedSeries

Sparkline mini-series:

object

{"YYYY-MM": value, …}

(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).

Last updated: 6/24/26, 9:05 AM