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
On this page
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.
| Section | Purpose |
|---|---|
| meta | Portfolio identity, base currency, report period |
| portfolio | Holdings on a date: structure, quantity, dirty price, value. Enough for composition, stress and risk. Not enough, by itself, for a time-weighted return |
| instruments | Non-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) |
| transactions | Cash, 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 |
| prices | Valuation prices under the client accounting policy, including accrued interest. Used with transactions to value the book on any date |
| results | Manager-reported income, TWR/MWR, fees, NAV. Optional. Lets you compare the manager’s own figures with TrackRecords |
| nav | NAV 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):
| |
In XLSX each section is a sheet with the same column names.
Version history
| Date | Change |
|---|---|
| 18 August 2026 | Added rule 37 |
| 4 February 2026 | Validator setting: relative tolerance for rules 11, 27 and 36 |
| 27 January 2026 | Rule 36: exclude holdings in debt asset classes. Validator: checks and save run off the UI thread, live log, better progress bar |
| 20 October 2025 | Added rule 36 (holdings price vs prices). Trim leading/trailing spaces on portfolio.code, prices.code, transactions.code, instruments.instrument_code |
| 17 October 2025 | Validate exchange_id |
| 8 September 2025 | Rule 27: round NAV to 2 dp. Trim spaces on asset_class |
| 1 September 2025 | Rule 11: round value_in_portfolio_currency to 2 dp (Excel stores numbers as float64) |
| 22 August 2025 | Added 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 2025 | Removed 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 2025 | Optional price_type on transactions, prices and portfolio |
| 25 March 2025 | results.sucess_fees renamed to success_fees. prices.boardid renamed to board_id. instruments.colleteral renamed to collateral |
| 24 March 2025 | instruments.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 2025 | Asset-class catalogue and ids updated |
| 26 February 2025 | Holdings: 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 2025 | Transactions: 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.
| Column | Description | Example | Type |
|---|---|---|---|
| portfolio_name* | Display name | Strategic mandate | string |
| description | Comment | Core fixed income | string |
| owner | Asset owner / client | Pension Fund Ltd | string |
| manager | Manager, broker or fund | TrackRecords AM | string |
| portfolio_id | Mandate, account or other id | MA-01/2024 | string |
| portfolio_type | 2 snapshot, 3 transaction-based | 3 | int32 |
| currency* | Base currency, ISO 4217. Position values and NAV are shown in this currency | EUR | string |
| reported_date* | Report date, yyyy-mm-dd | 2025-12-31 | date |
| start_date* | Period start, yyyy-mm-dd | 2024-12-31 | date |
| created_at | File created | 2026-01-15 | date |
* 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.
| Column | Description | Example | Type |
|---|---|---|---|
| stated_at* | Holdings date, yyyy-mm-dd | 2025-12-31 | date |
| partition_id | Lot / parcel id when you keep lots | 001 | string |
| account_number | Broker or bank account. Required for cash | 30601810000000001234 | string |
| asset_class* | Class name from the catalogue below | Corporate bonds | string |
| asset_class_id* | Class id | 1 | int32 |
| code_type* | ISIN, INSTRUMENT or CASH | ISIN | string |
| code* | Identifier for that type | XS0123456789 | string |
| asset_name | Name | Issuer 4.25% 2029 | string |
| quantity* | Quantity | 10 | decimal |
| price_dirty* | Unit dirty price, including accrued interest for bonds. Negative for payables | 1017.80 | decimal |
| price_dirty_currency* | Price currency, ISO 4217 | EUR | string |
| currency_rate* | price_dirty_currency / portfolio currency | 1.00 | decimal |
| value_in_portfolio_currency* | price_dirty × currency_rate × quantity. Negative for payables | 10178.00 | decimal |
| price_type | 0 hold-to-maturity, 1 fair value (default if omitted) | 1 | int32 |
| pif | Fund name when the asset sits inside a fund (look-through) | Fund Cosmos | string |
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.
| Category | asset_class | id |
|---|---|---|
| Equity | Equities | 10 |
| Equity | Mortgage certificates | 22 |
| Equity | Funds | 26 |
| Equity | ETF | 42 |
| Equity | REIT | 43 |
| Equity | ADR/GDR | 49 |
| Bonds | Corporate bonds | 1 |
| Bonds | Covered / mortgage bonds | 2 |
| Bonds | Regional bonds | 3 |
| Bonds | Municipal bonds | 31 |
| Bonds | Foreign sovereign bonds | 4 |
| Bonds | Sovereign bonds | 5 |
| Bonds | Eurobonds | 6 |
| Bonds | Bonds | 7 |
| Bonds | Structured bonds | 9 |
| Cash and deposits | Deposits | 11 |
| Cash and deposits | Cash at broker | 12 |
| Cash and deposits | Cash at bank | 13 |
| Cash and deposits | Cash in clearing margin | 23 |
| Cash and deposits | Subordinated deposits | 38 |
| Repo | Repo receivables | 19 |
| Repo | Repo payables | 20 |
| Receivables / payables | Other receivables | 17 |
| Receivables / payables | Receivables | 18 |
| Receivables / payables | Payables | 28 |
| Receivables / payables | Other payables | 30 |
| Property | Residential property | 15 |
| Property | Commercial property | 16 |
| Property | Land | 25 |
| Derivatives | Futures | 34 |
| Derivatives | Options | 39 |
| Derivatives | Interest-rate swap | 40 |
| Derivatives | FX swap | 41 |
| Expenses | Administrative and other expenses | 36 |
| Expenses | Manager remuneration | 37 |
| Other | Indices | 35 |
| Other | Loans | 14 |
| Other | MFO securities | 21 |
| Other | Other assets | 24 |
| FX | Currency pairs | 44 |
| FX | Cryptocurrency | 45 |
| Rates | Rates and indicators | 46 |
| Rates | Macro indicators | 47 |
| Commodities | Exchange-traded commodities | 48 |
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
| Column | Description | Example | Type |
|---|---|---|---|
| stated_at* | Record / creation date | 2024-12-31 | date |
| asset_class | Class name | Deposits | string |
| asset_class_id* | Class id | 11 | int32 |
| instrument_code* | Unique code. For cash, the account number | DEP-2024-001 | string |
| asset_name | Name | Bank deposit | string |
| inn* | Issuer tax id, or any unique numeric code if you have no tax id | 1234567890 | string |
| currency* | ISO 4217 | EUR | string |
| start_date | Interest start | 2024-12-31 | date |
| maturity_date | Maturity | 2025-12-31 | date |
| nominal | Face in instrument currency | 1000000.00 | decimal |
| yield_or_dividend_rate | Rate, % p.a. | 5.3 | decimal |
| yield_or_dividend_freq | 0 at maturity, 1 annual, 2 semi, 4 quarterly, 12 monthly | 0 | int32 |
| collateral | Collateral in instrument currency | 0 | decimal |
* 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.
| Column | Description | Example | Type |
|---|---|---|---|
| period_id | Row number | 1 | int32 |
| period_name | e.g. YTD, 2024, Since inception | YTD | string |
| partition_id | Lot id | 1007253 | string |
| start_date | Period start, yyyy-mm-dd | 2024-12-31 | date |
| end_date | Period end, yyyy-mm-dd | 2025-12-31 | date |
| income_currency | ISO 4217 for the figures on this row | EUR | string |
| income_gross | Income before fees | 8162039.47 | decimal |
| income_net | Income after fees | 7857683.45 | decimal |
| mwr_gross / mwr_net | Money-weighted return, simple % | 15.5 | decimal |
| twr_gross / twr_net | Time-weighted return, simple % | 15.4 | decimal |
| start_nav / end_nav | NAV in income_currency | 52000000.25 | decimal |
| inflows / outflows | External flows in income_currency | 1526235.23 | decimal |
| avg_nav | Average NAV | 58000000.58 | decimal |
| aic | Average invested capital | 53000256.29 | decimal |
| management_fees | Management fees for the period | 152000.50 | decimal |
| success_fees | Performance fees for the period | 152355.52 | decimal |
| other_fees | Broker, depositary, exchange, auditor and similar | 15265.25 | decimal |
nav
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.
| Column | Description | Example | Type |
|---|---|---|---|
| partition_id | Lot id | 1007253 | string |
| date* | yyyy-mm-dd | 2025-12-31 | date |
| nav* | NAV in currency | 60008000.29 | decimal |
| net_flows* | External inflows minus outflows | 1526235.23 | decimal |
| currency* | ISO 4217 | EUR | string |
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.
| Field | Description | Required | Type |
|---|---|---|---|
| partition_id | Lot id | string | |
| account_number | Account. Required for cash movements (money ≠ 0) | if money ≠ 0 | string |
| transaction_currency* | ISO 4217 | if money or debt ≠ 0 | string |
| currency_rate | FX rate on the transaction. Required and not 0 or 1 when transaction_currency differs from meta.currency; may be empty when they match | decimal | |
| date_transaction* | Trade / event datetime | yes | datetime |
| date_settlement | Settlement datetime | datetime | |
| transaction_id* | Unique id | yes | string |
| connected_transaction_id | Linked id (repo legs) | string | |
| code_type* | ISIN / INSTRUMENT / CASH | yes | string |
| code* | Instrument, or ISO currency for cash | yes | string |
| transaction_type* | See catalogue | yes | string |
| securities* | Security quantity change | decimal | |
| money* | Cash change | decimal | |
| debt* | Receivable / payable change | decimal | |
| comment | Text | string | |
| exchange_id | Venue id from the TrackRecords catalogue | int | |
| fee_category | For fee: depositary, brokerage, exchange, bank, management, success | string | |
| other | Extra JSON | jsonb | |
| price_type | 0 HTM, 1 fair value | int |
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
| id | name | Meaning |
|---|---|---|
| 1 | trade | Buy/sell securities or futures. Direction is the sign of securities / money |
| 2 | dividend | Dividends / fund distributions |
| 3 | interest | Deposit and repo interest |
| 4 | coupon | Bond coupons |
| 5 | maturity | Bond redemption proceeds |
| 6 | amortisation | Partial principal repayment |
| 7 | deposit | Deposit open/close (cash to/from the bank under a deposit contract) |
| 8 | margin | Variation margin on a cash-settled future |
| 9 | forex | FX with actual cash delivery |
| 10 | transfer_internal | Transfer between accounts in the same book |
| 11 | transfer_external | External transfer (also used for opening balances) |
| 12 | fee | Bank, broker, exchange, depositary, manager |
| 13 | other | Unclassified |
| 14 | repo_l1 | Repo first leg |
| 15 | repo_l2 | Repo second leg |
| 16 | debt | Accrue / write off receivables or payables |
| 17 | cash_interest | Interest on cash balances |
| 18 | split | Share split. securities = new quantity minus old. A 1000:100 split on 100 shares is securities = 900 |
| 19 | consolidation | Reverse split. securities = new minus old (negative). A 100:1000 consolidation on 1000 shares is securities = -900 |
Which legs are required:
securitiesmust be non-zero fortradeand transfers whencode_type ≠ CASH.moneymust be non-zero forcoupon,dividend,interest,amortisation,deposit,margin,forex,fee,other,repo_l1,repo_l2.debtmust be non-zero fordebt.- Cash rows (
code_type = CASH) use onlyforex,transfer_internal,transfer_external,cash_interestorfee.
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_number | transaction_currency | date_settlement | transaction_id | code | code_type | transaction_type | money | securities |
|---|---|---|---|---|---|---|---|---|
| 30601810000000001234 | EUR | 2025-01-20 | 7188687288 | XS0123456789 | ISIN | trade | -16.49 | 15 |
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_number | transaction_currency | date_settlement | transaction_id | code | code_type | transaction_type | money | securities |
|---|---|---|---|---|---|---|---|---|
| 30601810000000001234 | EUR | 2025-01-20 | 7188687286 | Si-12.25 | INSTRUMENT | trade | -10000 | 1 |
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_id | account_number | transaction_currency | date_settlement | transaction_id | code | code_type | transaction_type | money | securities |
|---|---|---|---|---|---|---|---|---|---|
| 001_1 | 30601810900000000171 | EUR | 2024-12-31 | 2 | XS0123456789 | ISIN | transfer_external | 3500 | |
| 30601810000000000453 | EUR | 2024-12-31 | 72 | EUR | CASH | transfer_external | 1527843 | ||
| 30601840800000000296 | USD | 2024-12-31 | 71 | USD | CASH | transfer_external | 340.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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | debt |
|---|---|---|---|---|---|---|---|
| 30601810900000000171 | EUR | 2025-06-30 | 2246_81203 | instr1_debt | INSTRUMENT | debt | 1000000.0 |
| 30601810900000000171 | EUR | 2025-09-30 | 2246_81204 | instr1_debt | INSTRUMENT | debt | -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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | debt |
|---|---|---|---|---|---|---|---|
| 30601810900000000171 | EUR | 2025-05-03 | 2246_81205 | XS0123456789 | ISIN | debt | 239950 |
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_number | transaction_currency | date_transaction | transaction_id | connected_transaction_id | code | code_type | transaction_type | money | securities | price_type |
|---|---|---|---|---|---|---|---|---|---|---|
| 30601810900000000171 | EUR | 2025-06-29 | 2246_81203 | 2246_81204 | instr1_repo | INSTRUMENT | repo_l1 | 1000000.0 | 1 | 0 |
| 30601810900000000171 | EUR | 2025-06-30 | 2246_81204 | 2246_81203 | instr1_repo | INSTRUMENT | repo_l2 | -1000000.0 | -1 | 0 |
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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | money | securities |
|---|---|---|---|---|---|---|---|---|
| 30601810900000000173 | EUR | 2025-06-30 | 2246_81203 | dep123 | INSTRUMENT | deposit | -1000000.0 | 1 |
| 30601810900000000173 | EUR | 2025-09-30 | 2246_81204 | dep123 | INSTRUMENT | deposit | 1000000.0 | -1 |
| 30601810900000000173 | EUR | 2025-09-30 | 2246_81205 | dep123 | INSTRUMENT | interest | 10000.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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | money |
|---|---|---|---|---|---|---|---|
| 30601810900000000173 | USD | 2025-06-30 | 2246_81203 | USD | CASH | forex | -12990.71 |
| 30601810900000000174 | EUR | 2025-06-30 | 2246_81204 | EUR | CASH | forex | 1000000.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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | money | securities |
|---|---|---|---|---|---|---|---|---|
| 30601810900000000173 | EUR | 2025-06-30 | 2246_81203 | XS000A102S15 | ISIN | trade | 1000 | -1 |
| 30601810900000000173 | EUR | 2025-06-30 | 2246_81204 | XS0123456789 | ISIN | trade | -1000 | 1 |
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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | money | debt | fee_category |
|---|---|---|---|---|---|---|---|---|---|
| 30601810900000000173 | EUR | 2025-06-30 | 2246_81203 | success_fee1 | INSTRUMENT | debt | -1000000.0 | ||
| 30601810900000000173 | EUR | 2025-07-10 | 2246_81203 | success_fee1 | INSTRUMENT | debt | 1000000.0 | ||
| 30601810900000000173 | EUR | 2025-07-10 | 2246_81204 | success_fee1 | INSTRUMENT | fee | -1000000.0 | success |
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_number | transaction_currency | date_transaction | transaction_id | code | code_type | transaction_type | money | debt |
|---|---|---|---|---|---|---|---|---|
| 30601810900000000173 | EUR | 2025-07-08 | 2246_81203 | US0378331005 | ISIN | debt | 19.48 | |
| 30601810900000000173 | EUR | 2025-08-12 | 2246_81203 | US0378331005 | ISIN | debt | -19.48 | |
| 30601810900000000173 | EUR | 2025-08-12 | 2246_81204 | US0378331005 | ISIN | dividend | 19.48 |
Deal fees vs administrative fees
A fee on a trade is booked on the security ISIN:
| Field | Example |
|---|---|
| code | XS0123456789 |
| code_type | ISIN |
| transaction_type | fee |
| money | -1000.00 |
| comment | Brokerage on trade |
A typed cost (auditor, account keeping) uses an instrument in class Administrative and other expenses (36), which must exist in instruments:
| Field | Example |
|---|---|
| code | AUDIT_FEE |
| code_type | INSTRUMENT |
| transaction_type | fee |
| money | -1000.00 |
| comment | Auditor |
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).
| Column | Description | Type |
|---|---|---|
| partition_id | Lot id | string |
| stated_at* | Date | date |
| code_type* | ISIN or INSTRUMENT | string |
| code* | Asset code | string |
| price_clean_percent | Clean price, % of face | decimal |
| price_clean | Clean price in money | decimal |
| price_clean_currency | Clean-price currency | string |
| facevalue | Outstanding face | decimal |
| facevalue_currency | Face currency | string |
| accint | Accrued interest | decimal |
| accint_currency | Accrued-interest currency | string |
| price_dirty* | Dirty price in quote currency, including accrued interest | decimal |
| price_dirty_currency* | Dirty-price currency | string |
| exchange_id | Venue id from the TrackRecords catalogue | int |
| board_id | Trading board | string |
| source_price_type | Source label (Close, Last bid, ...) | string |
| price_type | 0 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.
| # | Tables | Check |
|---|---|---|
| 1 | all | Currencies are ISO 4217 (EUR, USD, ...) |
| 2 | transactions | securities required for trade / transfer when code_type ≠ CASH |
| 3 | transactions | money required for coupon, dividend, interest, amortisation, deposit, margin, forex, fee, other, repo legs |
| 4 | transactions | debt required for transaction_type = debt |
| 5 | transactions | For trade, money and securities have opposite signs (unless a side or the product is zero) |
| 6 | transactions | Deposits and deposit interest use code_type = INSTRUMENT, not ISIN |
| 7 | transactions | Cash code is ISO 4217 |
| 8 | transactions | One account_number has one currency when money ≠ 0 (use a composite account code if needed) |
| 9 | transactions | Cash rows use forex, transfer_internal, transfer_external, cash_interest or fee |
| 10 | transactions, instruments | INSTRUMENT codes exist in instruments.instrument_code |
| 11 | portfolio | value_in_portfolio_currency = quantity × price_dirty × currency_rate (2 dp) |
| 12 | instruments, portfolio | asset_class / asset_class_id from the catalogue |
| 13 | prices | price_clean requires price_clean_currency |
| 14 | prices | facevalue requires facevalue_currency |
| 15 | prices | accint requires accint_currency |
| 16 | transactions, portfolio, meta | Cash balance must not go negative (price_dirty at start_date plus money) |
| 17 | transactions, portfolio, meta | Security quantity must not go negative |
| 18 | portfolio, instruments | Holdings INSTRUMENT codes exist in instruments |
| 19 | instruments, transactions, portfolio | Cash classes 12, 13, 23 have an instruments row whose instrument_code is the account_number |
| 20 | portfolio | Cash classes: code_type = CASH, account_number set, code = account ISO currency |
| 21 | portfolio | Payables (20, 28, 30): price_dirty and value ≤ 0 |
| 22 | instruments | Deposits and repo fill start, maturity, nominal, rate and frequency |
| 23 | portfolio, transactions, meta | Holdings quantity at start + securities = quantity at end |
| 24 | portfolio, transactions, meta | Cash at start + money = cash at end |
| 25 | portfolio, transactions, meta | Debt at start + debt = debt at end |
| 26 | instruments | No duplicate (stated_at, instrument_code) |
| 27 | nav, portfolio, meta | nav matches portfolio NAV on the same date and currency (2 dp) |
| 28 | transactions, portfolio, prices, meta | Prices exist for non-cash, non-user-instrument codes over the period |
| 29 | transactions, meta | FX rate when transaction currency ≠ portfolio currency |
| 30 | transactions | account_number required when money ≠ 0 |
| 31 | transactions | transaction_currency required when money or debt ≠ 0 |
| 32 | portfolio, instruments | Cash account_number exists as instruments.instrument_code |
| 33 | portfolio, instruments | For cash, portfolio.code equals instruments.currency for that account |
| 34 | transactions | No duplicate (code_type, transaction_type, transaction_id, account_number, fee_category, partition_id) |
| 35 | prices | No duplicate (code_type, code, stated_at, partition_id, price_type) |
| 36 | portfolio, prices | Holdings price_dirty matches prices.price_dirty for the same code and date (debt classes excluded) |
| 37 | transactions | forex 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.