Reporting standard

JSON and XLSX format for portfolio holdings, transactions, prices and results

Edition 1.6.4 (9 April 2026)

Contact: support@trackrecords.app

The standard is the file (or API payload) TrackRecords uses to load a book, recalculate TWR/MWR, run contribution and attribution, and apply limits and risk. Field names are English. You can send JSON (preferred in production) or XLSX (convenient while testing).

A file may contain any combination of sections. Holdings plus results are enough to inspect composition and the manager’s own figures. Transactions and prices are required to recalculate return and contribution.

SectionPurpose
metaPortfolio identity, base currency, report period
portfolioHoldings on a date (structure, quantity, dirty price, value)
instrumentsNon-listed assets: deposits, receivables, repo, loans, property
transactionsCash, security and debt movements: not trades only
pricesValuation prices under the client accounting policy
resultsManager-reported income, TWR/MWR, fees, NAV
navNAV and external flows, used for TWR/MWR at portfolio level

Encoding: UTF-8. Large files may be uploaded as ZIP.

meta

ColumnDescriptionType
portfolio_name*Display namestring
descriptionCommentstring
ownerAsset owner / clientstring
managerManager, broker or fundstring
portfolio_idMandate, account or other idstring
portfolio_type2 snapshot, 3 transaction-basedint32
currency*Base currency, ISO 4217string
reported_date*Report date, yyyy-mm-dddate
start_date*Period start, yyyy-mm-dddate
created_atFile createddate

* Required

portfolio (holdings on a date)

Holdings support structure, risk and stress. They do not by themselves produce a time-weighted return.

ColumnDescriptionType
stated_at*Holdings datedate
partition_idLot / parcel idstring
account_numberBroker or bank account (required for cash)string
asset_class*Class name from the catalogue belowstring
asset_class_id*Class idint32
code_type*ISIN, INSTRUMENT or CASHstring
code*Identifier for that typestring
asset_nameNamestring
quantity*Quantitydecimal
price_dirty*Unit dirty price (negative for payables)decimal
price_dirty_currency*Price currency, ISO 4217string
currency_rate*price_dirty_currency / portfolio currencydecimal
value_in_portfolio_currency*price_dirty × currency_rate × quantitydecimal
price_type0 hold-to-maturity, 1 fair value (default)int32
pifFund name for look-throughstring

Identity: value_in_portfolio_currency = quantity × price_dirty × currency_rate (rule 11, rounded to 2 dp).

Asset classes

Categoryasset_classid
EquityEquities10
EquityMortgage certificates22
EquityFunds26
EquityETF42
EquityREIT43
EquityADR/GDR49
BondsCorporate bonds1
BondsCovered / mortgage bonds2
BondsRegional bonds3
BondsMunicipal bonds31
BondsForeign sovereign bonds4
BondsSovereign bonds5
BondsEurobonds6
BondsBonds7
BondsStructured bonds9
Cash and depositsDeposits11
Cash and depositsCash at broker12
Cash and depositsCash at bank13
Cash and depositsCash in clearing margin23
Cash and depositsSubordinated deposits38
RepoRepo receivables19
RepoRepo payables20
Receivables / payablesOther receivables17
Receivables / payablesReceivables18
Receivables / payablesPayables28
Receivables / payablesOther payables30
PropertyResidential property15
PropertyCommercial property16
PropertyLand25
DerivativesFutures34
DerivativesOptions39
DerivativesInterest-rate swap40
DerivativesFX swap41
ExpensesAdministrative and other expenses36
ExpensesManager remuneration37
OtherIndices35
OtherLoans14
OtherMFO securities21
OtherOther assets24
FXCurrency pairs44
FXCryptocurrency45
RatesRates and indicators46
RatesMacro indicators47
CommoditiesExchange-traded commodities48

Listed equities, bonds and funds are resolved from the TrackRecords reference database by ISIN (or another public code). Everything else belongs in instruments.

instruments

ColumnDescriptionType
stated_at*Record datedate
asset_classClass namestring
asset_class_id*Class idint32
instrument_code*Unique code (account number for cash)string
asset_nameNamestring
inn*Issuer tax id or a unique numeric codestring
currency*ISO 4217string
start_dateInterest startdate
maturity_dateMaturitydate
nominalFace in instrument currencydecimal
yield_or_dividend_rateRate, % p.a.decimal
yield_or_dividend_freq0 at maturity, 1 annual, 2 semi, 4 quarterly, 12 monthlyint32
collateralCollateral in instrument currencydecimal

Deposits and repo must fill start_date, maturity_date, nominal, yield_or_dividend_rate, yield_or_dividend_freq.

results

Optional. Lets you compare the manager’s own income, TWR/MWR and fees with TrackRecords.

ColumnDescriptionType
period_idRow numberint32
period_namee.g. YTD, 2024string
partition_idLot idstring
start_date / end_datePerioddate
income_currencyISO 4217string
income_gross / income_netIncome before / after feesdecimal
mwr_gross / mwr_netMoney-weighted return, simple %decimal
twr_gross / twr_netTime-weighted return, simple %decimal
start_nav / end_navNAVdecimal
inflows / outflowsExternal flowsdecimal
avg_nav / aicAverage NAV / invested capitaldecimal
management_fees / success_fees / other_feesFeesdecimal

TWR and MWR at portfolio level. Prefer a point on every day of the period. Minimum: start, end, and every external-flow date.

ColumnDescriptionType
partition_idLot idstring
date*yyyy-mm-dddate
nav*NAV in currencydecimal
net_flows*External inflows minus outflowsdecimal
currency*ISO 4217string

transactions

One table for cash, securities and debt. A transaction is any change in those balances: not only a trade.

Sign convention: securities, money and debt are balance changes. Minus = outflow / disposal. Plus = inflow. A share sale has negative securities and positive money.

FieldDescriptionRequired
partition_idLot id
account_numberAccount (required for cash movements)if money ≠ 0
transaction_currency*ISO 4217if money or debt ≠ 0
currency_rateFX rate on the transaction
date_transaction*Trade / event datetimeyes
date_settlementSettlement datetime
transaction_id*Unique idyes
connected_transaction_idLinked id (repo legs)
code_type*ISIN / INSTRUMENT / CASHyes
code*Instrument or ISO currency for cashyes
transaction_type*See catalogueyes
securities*Security quantity change
money*Cash change
debt*Receivable / payable change
commentText
exchange_idVenue id from the TrackRecords catalogue
fee_categoryFor fee: depositary, brokerage, exchange, bank, management, success
otherExtra JSON
price_type0 HTM, 1 fair value

Uniqueness inside a portfolio: code_type + transaction_type + transaction_id + account_number + fee_category + partition_id.

transaction_type

idnameMeaning
1tradeBuy/sell securities or futures. Direction is the sign of securities / money
2dividendDividends / fund distributions
3interestDeposit and repo interest
4couponBond coupons
5maturityBond redemption proceeds
6amortisationPartial principal repayment
7depositDeposit open/close
8marginVariation margin
9forexFX with actual cash delivery
10transfer_internalTransfer between accounts in the same book
11transfer_externalExternal transfer (also used for opening balances)
12feeBank, broker, exchange, depositary, manager
13otherUnclassified
14repo_l1Repo first leg
15repo_l2Repo second leg
16debtAccrue / write off receivables or payables
17cash_interestInterest on cash balances
18splitShare split (securities = new minus old quantity)
19consolidationReverse split

How to book common events

Buy securities. Positive securities, negative money. Do not send a trade price: it is money / securities. Accrued interest sits in the dirty cash amount or in a separate row.

Opening balances without a full history: transfer_external with quantities and cash; prices go in prices.

Receivables / payables. Type debt. Accrue with a positive debt for receivables (negative for payables), reverse on settlement. Keep the debt on the same code as the asset if you need instrument-level income.

Repo. Two legs, repo_l1 / repo_l2, linked by connected_transaction_id. Treat repo as cash plus interest, not as a security transfer: code_type = INSTRUMENT. securities is +1 / -1. Terms live on instruments. Reverse repo: first leg cash in, securities = 1.

Deposit. deposit with code_type = INSTRUMENT. Open: negative money, securities = 1. Close: opposite. Interest is interest.

FX. Two forex cash rows (code_type = CASH). TrackRecords infers the rate from the two money amounts.

Fees. Prefer a dedicated instrument in class “Manager remuneration”, then fee (and debt if you accrue first). fee_category distinguishes management, success, brokerage, and so on.

Dividends. Accrue debt from ex-date, then reverse debt and book dividend money on pay date so NAV includes the receivable before cash arrives.

prices

Prices under the client accounting policy, used to value the book on any date in the period.

Required when you send transactions and want TrackRecords to recalculate return. Dirty price currency should match the asset currency in the nearest holdings row.

Validation (selected rules)

#Check
1Currencies are ISO 4217
2–4securities / money / debt required for the matching transaction_type
5For trade, money and securities have opposite signs (unless a side is zero)
9Cash rows use forex, transfer_internal, transfer_external, cash_interest or fee
11Holdings value identity
16–17Cash and security balances must not go negative
21Payables: price_dirty and value ≤ 0
23–25Holdings at start + transactions = holdings at end (securities, money, debt)
27nav matches portfolio NAV on the same date
28Prices exist for non-cash, non-user-instrument codes
34–35No duplicate transaction or price keys
36Holdings price_dirty matches prices.price_dirty for the same code and date (debt classes excluded)

A Windows validator (TR-Validator) can check a JSON or XLSX file offline. Ask support@trackrecords.app for the current build.

Load the same payload through the snapshot API or the transaction API.