Reporting standard

JSON and XLSX format for portfolio holdings, transactions, prices, NAV and manager results, with booking examples and validation rules

Edition 1.6.6 (18 August 2026)

Contact: mkv@trackrecords.si

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. It is aimed at asset managers, insurers, banks, funds, brokers and teams that already keep a back office and want the same data in the terminal.

Field names are English. You can send JSON (preferred in production) or XLSX (convenient while testing). The same payload can be posted through the snapshot API or the transaction API.

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 on any date in the period.

SectionPurpose
metaPortfolio identity, base currency, report period
portfolioHoldings on a date: structure, quantity, dirty price, value. Enough for composition, stress and risk. Not enough, by itself, for a time-weighted return
instrumentsNon-listed assets unique to this book: deposits, receivables, repo, loans, property. Listed equities, bonds and funds are resolved from the TrackRecords reference database by ISIN (or another public code)
transactionsCash, security and debt movements. Not trades only: coupons, fees, FX, transfers, opening balances. Used to rebuild the book on any date and to run contribution
pricesValuation prices under the client accounting policy, including accrued interest. Used with transactions to value the book on any date
resultsManager-reported income, TWR/MWR, fees, NAV. Optional. Lets you compare the manager’s own figures with TrackRecords
navNAV and external flows. Used for TWR/MWR at portfolio level and to show the effect of inflows and outflows

Typical combinations:

  • meta + portfolio + results: inspect holdings and the manager’s reported performance. You cannot recalculate return or run contribution.
  • meta + portfolio + instruments + transactions + prices: rebuild the book, recalculate TWR/MWR, contribution and attribution, and apply limits and risk.
  • Add nav if you also want portfolio-level TWR/MWR from an official NAV series.

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

JSON shape (any section may be omitted):

1
2
3
4
5
6
7
8
9
{
  "meta": { },
  "portfolio": [ ],
  "instruments": [ ],
  "transactions": [ ],
  "prices": [ ],
  "results": [ ],
  "nav": [ ]
}

In XLSX each section is a sheet with the same column names.

Version history

DateChange
18 August 2026Added rule 37
4 February 2026Validator setting: relative tolerance for rules 11, 27 and 36
27 January 2026Rule 36: exclude holdings in debt asset classes. Validator: checks and save run off the UI thread, live log, better progress bar
20 October 2025Added rule 36 (holdings price vs prices). Trim leading/trailing spaces on portfolio.code, prices.code, transactions.code, instruments.instrument_code
17 October 2025Validate exchange_id
8 September 2025Rule 27: round NAV to 2 dp. Trim spaces on asset_class
1 September 2025Rule 11: round value_in_portfolio_currency to 2 dp (Excel stores numbers as float64)
22 August 2025Added rules 11 and 27. Rule 28: prices required for portfolio codes on start_date and reported_date. Dirty-price currency in prices should match the nearest holdings row
29 May 2025Removed sub_portfolio / sub_portfolio_id. Added partition_id for lot accounting, including lot-level prices. Renamed transactions account_currency to transaction_currency. account_number required only for cash movements in transactions and for cash in holdings. transaction_currency required when money or debt ≠ 0
14 May 2025Optional price_type on transactions, prices and portfolio
25 March 2025results.sucess_fees renamed to success_fees. prices.boardid renamed to board_id. instruments.colleteral renamed to collateral
24 March 2025instruments.yield_or_divident_rate / _freq renamed to yield_or_dividend_rate / yield_or_dividend_freq. money, securities and debt are required on transactions
27 February 2025Asset-class catalogue and ids updated
26 February 2025Holdings: isin_or_code → code, amount → quantity, price → price_dirty. Added price_dirty_currency, currency_rate, value_in_portfolio_currency, account_number, account_currency. Optional sub_portfolio / sub_portfolio_id on nav, portfolio, prices, results, transactions
14 February 2025Transactions: transaction renamed to transaction_type

TR-Validator

A Windows desktop checker (TR-Validator) can open JSON or XLSX offline, list every table, export a table to Excel, and report validation errors. It does not need an internet connection.

Requirements: Windows 10 or later, 64-bit. Unpack the archive (including certificates) into one folder and run tr_validator.exe.

Ask mkv@trackrecords.si for the current build.

meta

Identifies the book, the reporting currency and the period. start_date is the start of the reporting window (usually the previous year-end). reported_date is the date the report is built for.

ColumnDescriptionExampleType
portfolio_name*Display nameStrategic mandatestring
descriptionCommentCore fixed incomestring
ownerAsset owner / clientPension Fund Ltdstring
managerManager, broker or fundTrackRecords AMstring
portfolio_idMandate, account or other idMA-01/2024string
portfolio_type2 snapshot, 3 transaction-based3int32
currency*Base currency, ISO 4217. Position values and NAV are shown in this currencyEURstring
reported_date*Report date, yyyy-mm-dd2025-12-31date
start_date*Period start, yyyy-mm-dd2024-12-31date
created_atFile created2026-01-15date

* Required

portfolio (holdings on a date)

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

Minimum dates: period start and period end. Period start is usually the previous year-end (2024-12-31), not 2025-01-01, because year-to-date performance is measured from that NAV. Monthly month-end snapshots in the period are recommended.

ColumnDescriptionExampleType
stated_at*Holdings date, yyyy-mm-dd2025-12-31date
partition_idLot / parcel id when you keep lots001string
account_numberBroker or bank account. Required for cash30601810000000001234string
asset_class*Class name from the catalogue belowCorporate bondsstring
asset_class_id*Class id1int32
code_type*ISIN, INSTRUMENT or CASHISINstring
code*Identifier for that typeXS0123456789string
asset_nameNameIssuer 4.25% 2029string
quantity*Quantity10decimal
price_dirty*Unit dirty price, including accrued interest for bonds. Negative for payables1017.80decimal
price_dirty_currency*Price currency, ISO 4217EURstring
currency_rate*price_dirty_currency / portfolio currency1.00decimal
value_in_portfolio_currency*price_dirty × currency_rate × quantity. Negative for payables10178.00decimal
price_type0 hold-to-maturity, 1 fair value (default if omitted)1int32
pifFund name when the asset sits inside a fund (look-through)Fund Cosmosstring

Identity (rule 11): value_in_portfolio_currency = quantity × price_dirty × currency_rate, rounded to 2 decimal places (Excel stores numbers as float64).

Cash rows (asset_class_id 12, 13, 23) must use code_type = CASH, a non-empty account_number, and code equal to the account currency (ISO 4217). Payables (asset_class_id 20, 28, 30) must have price_dirty ≤ 0 and value_in_portfolio_currency ≤ 0.

If you value lots separately, send a prices row for each partition_id.

Asset classes

Names and ids are a closed list. Leading and trailing spaces in asset_class are ignored.

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: non-traded lines that are in holdings at the start or end of the period, or that appear in transactions.

Receivables vs other receivables (and the same split for payables): either class is valid. Use Receivables / Payables by default. Use the “other” class only if you need a second bucket.

Manager remuneration (37) and Administrative and other expenses (36) are special classes. In portfolio they hold only the receivable or payable outstanding on the report date (the amount already in official NAV). Accruals and cash payments belong in transactions (debt / fee). See FAQ.

instruments

ColumnDescriptionExampleType
stated_at*Record / creation date2024-12-31date
asset_classClass nameDepositsstring
asset_class_id*Class id11int32
instrument_code*Unique code. For cash, the account numberDEP-2024-001string
asset_nameNameBank depositstring
inn*Issuer tax id, or any unique numeric code if you have no tax id1234567890string
currency*ISO 4217EURstring
start_dateInterest start2024-12-31date
maturity_dateMaturity2025-12-31date
nominalFace in instrument currency1000000.00decimal
yield_or_dividend_rateRate, % p.a.5.3decimal
yield_or_dividend_freq0 at maturity, 1 annual, 2 semi, 4 quarterly, 12 monthly0int32
collateralCollateral in instrument currency0decimal

* Required. Deposits and repo (asset_class_id 11, 38, 19, 20) must also fill start_date, maturity_date, nominal, yield_or_dividend_rate, yield_or_dividend_freq.

Do not repeat the same (stated_at, instrument_code) pair. Codes are trimmed of leading and trailing spaces.

results

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

ColumnDescriptionExampleType
period_idRow number1int32
period_namee.g. YTD, 2024, Since inceptionYTDstring
partition_idLot id1007253string
start_datePeriod start, yyyy-mm-dd2024-12-31date
end_datePeriod end, yyyy-mm-dd2025-12-31date
income_currencyISO 4217 for the figures on this rowEURstring
income_grossIncome before fees8162039.47decimal
income_netIncome after fees7857683.45decimal
mwr_gross / mwr_netMoney-weighted return, simple %15.5decimal
twr_gross / twr_netTime-weighted return, simple %15.4decimal
start_nav / end_navNAV in income_currency52000000.25decimal
inflows / outflowsExternal flows in income_currency1526235.23decimal
avg_navAverage NAV58000000.58decimal
aicAverage invested capital53000256.29decimal
management_feesManagement fees for the period152000.50decimal
success_feesPerformance fees for the period152355.52decimal
other_feesBroker, depositary, exchange, auditor and similar15265.25decimal

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

ColumnDescriptionExampleType
partition_idLot id1007253string
date*yyyy-mm-dd2025-12-31date
nav*NAV in currency60008000.29decimal
net_flows*External inflows minus outflows1526235.23decimal
currency*ISO 4217EURstring

On dates where nav and portfolio both exist, NAV must match the holdings total in the same currency (rule 27, rounded to 2 dp).

transactions

One table for cash, securities and debt. A transaction is any change in those balances: not only a trade. Think of it as a movement report for securities, cash and receivables/payables, each with a plus or minus.

The table is required if you want transaction-based performance and contribution.

Sign convention: securities, money and debt are balance changes, not the position after the event. Minus = outflow / disposal. Plus = inflow. A share sale has negative securities and positive money. Direction is carried by the sign, so there is no separate buy/sell field.

FieldDescriptionRequiredType
partition_idLot idstring
account_numberAccount. Required for cash movements (money ≠ 0)if money ≠ 0string
transaction_currency*ISO 4217if money or debt ≠ 0string
currency_rateFX rate on the transaction. Required and not 0 or 1 when transaction_currency differs from meta.currency; may be empty when they matchdecimal
date_transaction*Trade / event datetimeyesdatetime
date_settlementSettlement datetimedatetime
transaction_id*Unique idyesstring
connected_transaction_idLinked id (repo legs)string
code_type*ISIN / INSTRUMENT / CASHyesstring
code*Instrument, or ISO currency for cashyesstring
transaction_type*See catalogueyesstring
securities*Security quantity changedecimal
money*Cash changedecimal
debt*Receivable / payable changedecimal
commentTextstring
exchange_idVenue id from the TrackRecords catalogueint
fee_categoryFor fee: depositary, brokerage, exchange, bank, management, successstring
otherExtra JSONjsonb
price_type0 HTM, 1 fair valueint

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

One account_number has one currency when money ≠ 0. For multi-currency accounts use a composite code, for example 1010101010USD and 1010101010EUR. Cash code must be ISO 4217. Deposits and deposit interest use code_type = INSTRUMENT, not ISIN.

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 (cash to/from the bank under a deposit contract)
8marginVariation margin on a cash-settled future
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 quantity minus old. A 1000:100 split on 100 shares is securities = 900
19consolidationReverse split. securities = new minus old (negative). A 100:1000 consolidation on 1000 shares is securities = -900

Which legs are required:

  • securities must be non-zero for trade and transfers when code_type ≠ CASH.
  • money must be non-zero for coupon, dividend, interest, amortisation, deposit, margin, forex, fee, other, repo_l1, repo_l2.
  • debt must be non-zero for debt.
  • Cash rows (code_type = CASH) use only forex, transfer_internal, transfer_external, cash_interest or fee.

How to book common events

Buy and sell securities

Buy: 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, so you do not have to choose clean vs dirty as a trade-price type.

account_numbertransaction_currencydate_settlementtransaction_idcodecode_typetransaction_typemoneysecurities
30601810000000001234EUR2025-01-207188687288XS0123456789ISINtrade-16.4915

A sale swaps the signs.

Futures

Register the contract in instruments (for example code Si-12.25), book a trade, and send prices for that code.

account_numbertransaction_currencydate_settlementtransaction_idcodecode_typetransaction_typemoneysecurities
30601810000000001234EUR2025-01-207188687286Si-12.25INSTRUMENTtrade-100001

Opening balances

When you do not have a full history, seed positions with transfer_external. Cash is the account-currency amount. Securities are quantities only; valuation comes from prices. If lots have different prices, send a price per partition_id.

partition_idaccount_numbertransaction_currencydate_settlementtransaction_idcodecode_typetransaction_typemoneysecurities
001_130601810900000000171EUR2024-12-312XS0123456789ISINtransfer_external3500
30601810000000000453EUR2024-12-3172EURCASHtransfer_external1527843
30601840800000000296USD2024-12-3171USDCASHtransfer_external340.2

Receivables and payables

Type debt. Accrue with a positive debt for receivables (negative for payables), reverse on settlement.

Use code_type = INSTRUMENT for non-listed claims, and ISIN (or another public code) when the claim belongs to a listed security.

Accrue 1,000,000 of receivable, then write it off:

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typedebt
30601810900000000171EUR2025-06-302246_81203instr1_debtINSTRUMENTdebt1000000.0
30601810900000000171EUR2025-09-302246_81204instr1_debtINSTRUMENTdebt-1000000.0

A payable uses the opposite signs: first -1000000, then +1000000 to close.

Coupon already due but not yet paid, booked on the bond itself:

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typedebt
30601810900000000171EUR2025-05-032246_81205XS0123456789ISINdebt239950

Keep instrument-level claims on that instrument’s code. If you park accrued coupon or dividend on a generic instrument (accint_debits), portfolio NAV is still correct, but instrument income will miss that cash. Do not confuse this receivable with accrued interest inside prices.

If a payable is accrued and settled inside the same reporting year, still send both debt movements. See FAQ.

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 (not the collateral ISIN). securities is +1 / -1. Terms (rate, maturity) live on instruments. Each leg has its cash amount in money.

Reverse repo (cash out, collateral in economically, booked as a receivable):

account_numbertransaction_currencydate_transactiontransaction_idconnected_transaction_idcodecode_typetransaction_typemoneysecuritiesprice_type
30601810900000000171EUR2025-06-292246_812032246_81204instr1_repoINSTRUMENTrepo_l11000000.010
30601810900000000171EUR2025-06-302246_812042246_81203instr1_repoINSTRUMENTrepo_l2-1000000.0-10

Direct repo swaps the signs (cash in on the first leg, securities = -1).

Deposits

deposit with code_type = INSTRUMENT. Terms live on instruments. Open: negative money, securities = 1. Close: opposite. Accrued interest is interest on the same code.

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typemoneysecurities
30601810900000000173EUR2025-06-302246_81203dep123INSTRUMENTdeposit-1000000.01
30601810900000000173EUR2025-09-302246_81204dep123INSTRUMENTdeposit1000000.0-1
30601810900000000173EUR2025-09-302246_81205dep123INSTRUMENTinterest10000.0

FX

Two forex cash rows (code_type = CASH). Actual delivery: one account is debited, another is credited. Do not send the FX rate; TrackRecords infers it from the two money amounts. securities is empty. The file must contain an even number of forex rows (rule 37).

USD sold for EUR:

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typemoney
30601810900000000173USD2025-06-302246_81203USDCASHforex-12990.71
30601810900000000174EUR2025-06-302246_81204EURCASHforex1000000.0

Security conversion / substitution

Two trade rows, typically at 100% of face so P&L is locked on the old line and the new line starts clean. Cash nets to zero.

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typemoneysecurities
30601810900000000173EUR2025-06-302246_81203XS000A102S15ISINtrade1000-1
30601810900000000173EUR2025-06-302246_81204XS0123456789ISINtrade-10001

Internal transfers

Two transfer_internal rows with different account_number. Securities: code and quantity only. Cash: currency code and amount. The source side is negative, the destination side is positive.

Manager fees

Prefer a dedicated instrument in class Manager remuneration (37). Accrue with debt, pay with fee. fee_category distinguishes management, success, brokerage, and so on. Accrual and cash then net in analysis instead of living as two unrelated stories.

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typemoneydebtfee_category
30601810900000000173EUR2025-06-302246_81203success_fee1INSTRUMENTdebt-1000000.0
30601810900000000173EUR2025-07-102246_81203success_fee1INSTRUMENTdebt1000000.0
30601810900000000173EUR2025-07-102246_81204success_fee1INSTRUMENTfee-1000000.0success

Year-end fee true-up: if advances already paid exceed the final fee, portfolio on 31 December shows a receivable in class 37 (price_dirty positive). Do not put analytical fee accruals into holdings; only the amount that is in official NAV.

Dividends

From ex-date (record date), accrue debt on the share’s code. On pay date, reverse debt and book dividend money. NAV then includes the receivable before cash arrives.

account_numbertransaction_currencydate_transactiontransaction_idcodecode_typetransaction_typemoneydebt
30601810900000000173EUR2025-07-082246_81203US0378331005ISINdebt19.48
30601810900000000173EUR2025-08-122246_81203US0378331005ISINdebt-19.48
30601810900000000173EUR2025-08-122246_81204US0378331005ISINdividend19.48

Deal fees vs administrative fees

A fee on a trade is booked on the security ISIN:

FieldExample
codeXS0123456789
code_typeISIN
transaction_typefee
money-1000.00
commentBrokerage on trade

A typed cost (auditor, account keeping) uses an instrument in class Administrative and other expenses (36), which must exist in instruments:

FieldExample
codeAUDIT_FEE
code_typeINSTRUMENT
transaction_typefee
money-1000.00
commentAuditor

prices

Prices under the client accounting policy, used to value the book on any date in the period. Send a quote for every asset on every day it was in the book. Dirty price is required and must include accrued interest. Currency of price_dirty should match the asset currency on the nearest portfolio row.

Required when you send transactions and want TrackRecords to recalculate return. Market (non-cash, non-user-instrument) codes in transactions or portfolio need prices covering meta.start_date through meta.reported_date (rule 28).

ColumnDescriptionType
partition_idLot idstring
stated_at*Datedate
code_type*ISIN or INSTRUMENTstring
code*Asset codestring
price_clean_percentClean price, % of facedecimal
price_cleanClean price in moneydecimal
price_clean_currencyClean-price currencystring
facevalueOutstanding facedecimal
facevalue_currencyFace currencystring
accintAccrued interestdecimal
accint_currencyAccrued-interest currencystring
price_dirty*Dirty price in quote currency, including accrued interestdecimal
price_dirty_currency*Dirty-price currencystring
exchange_idVenue id from the TrackRecords catalogueint
board_idTrading boardstring
source_price_typeSource label (Close, Last bid, ...)string
price_type0 HTM, 1 fair value (default)int

If price_clean, facevalue or accint is filled, the matching *_currency field is required.

Quote currency, face and accrued interest can differ. Some venues quote a USD bond with accrued interest in another currency. NAV uses price_dirty / price_dirty_currency; FX conversion is applied automatically.

For equities, funds and depositary receipts fill only price_dirty and price_dirty_currency. Leave clean price, face and accrued interest empty.

On the same code and stated_at, portfolio.price_dirty must equal prices.price_dirty (rule 36). Debt classes are excluded from that check.

Validation rules

TR-Validator and the import pipeline apply the same checks. Relative tolerance for rules 11, 27 and 36 is configurable in the validator.

#TablesCheck
1allCurrencies are ISO 4217 (EUR, USD, ...)
2transactionssecurities required for trade / transfer when code_type ≠ CASH
3transactionsmoney required for coupon, dividend, interest, amortisation, deposit, margin, forex, fee, other, repo legs
4transactionsdebt required for transaction_type = debt
5transactionsFor trade, money and securities have opposite signs (unless a side or the product is zero)
6transactionsDeposits and deposit interest use code_type = INSTRUMENT, not ISIN
7transactionsCash code is ISO 4217
8transactionsOne account_number has one currency when money ≠ 0 (use a composite account code if needed)
9transactionsCash rows use forex, transfer_internal, transfer_external, cash_interest or fee
10transactions, instrumentsINSTRUMENT codes exist in instruments.instrument_code
11portfoliovalue_in_portfolio_currency = quantity × price_dirty × currency_rate (2 dp)
12instruments, portfolioasset_class / asset_class_id from the catalogue
13pricesprice_clean requires price_clean_currency
14pricesfacevalue requires facevalue_currency
15pricesaccint requires accint_currency
16transactions, portfolio, metaCash balance must not go negative (price_dirty at start_date plus money)
17transactions, portfolio, metaSecurity quantity must not go negative
18portfolio, instrumentsHoldings INSTRUMENT codes exist in instruments
19instruments, transactions, portfolioCash classes 12, 13, 23 have an instruments row whose instrument_code is the account_number
20portfolioCash classes: code_type = CASH, account_number set, code = account ISO currency
21portfolioPayables (20, 28, 30): price_dirty and value ≤ 0
22instrumentsDeposits and repo fill start, maturity, nominal, rate and frequency
23portfolio, transactions, metaHoldings quantity at start + securities = quantity at end
24portfolio, transactions, metaCash at start + money = cash at end
25portfolio, transactions, metaDebt at start + debt = debt at end
26instrumentsNo duplicate (stated_at, instrument_code)
27nav, portfolio, metanav matches portfolio NAV on the same date and currency (2 dp)
28transactions, portfolio, prices, metaPrices exist for non-cash, non-user-instrument codes over the period
29transactions, metaFX rate when transaction currency ≠ portfolio currency
30transactionsaccount_number required when money ≠ 0
31transactionstransaction_currency required when money or debt ≠ 0
32portfolio, instrumentsCash account_number exists as instruments.instrument_code
33portfolio, instrumentsFor cash, portfolio.code equals instruments.currency for that account
34transactionsNo duplicate (code_type, transaction_type, transaction_id, account_number, fee_category, partition_id)
35pricesNo duplicate (code_type, code, stated_at, partition_id, price_type)
36portfolio, pricesHoldings price_dirty matches prices.price_dirty for the same code and date (debt classes excluded)
37transactionsforex rows come in pairs: the number of forex transactions must be a multiple of 2

FAQ

When do I use Receivables vs Other receivables? Either class is fine. Default to Receivables (18). Use Other receivables (17) only if you need a second bucket. The same rule applies to Payables (28) vs Other payables (30).

What is Manager remuneration? Class 37 marks fee claims in portfolio (outstanding payable or receivable on the report date) and fee activity in transactions (debt for accrual, fee for cash). Holdings show only the NAV-relevant balance, not the full analytical history.

What is Administrative and other expenses? Class 36 is the same pattern for auditor, account-keeping and similar costs: outstanding claim in portfolio, accrual/cash in transactions.

Do holdings show monthly fee advances and the annual true-up? Holdings show only the payable or receivable that is in official NAV on that date. Accruals and payments stay in transactions. If year-end true-up means advances exceed the final fee, book a receivable in class 37 on 31 December.

Which dates belong in portfolio? At least period start and period end. Start is usually the previous year-end, not 1 January. Month-ends in the period are recommended.

A payable was accrued and settled in the same year. Do I still send both legs? Yes: one debt to open, one debt to close (and fee or cash if you pay it).

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