Portfolio NAV
The report endpoints in this section answer “what goes on the investor statement”. This page answers a smaller question an automated consumer asks every cycle: what is this portfolio worth right now. It is the endpoint to build against when a vault platform, attestation service, or internal job needs to pull NAV on a schedule and publish it somewhere else, on-chain or otherwise. The figure comes from the same portfolio ledger that drives the dashboard, the Report Studio, and/computed, one source of truth, several read paths.
Endpoint
NAV is served per portfolio by the portfolio-management service:/portfolio-management, not /lp-report-studio, so a key with a path allowlist needs that prefix too. Access is scoped to the portfolios the key’s account owns.
Response
Which number is “the NAV”?
nav.raw. It is the account’s real current value, net equity: spot balances plus protocol positions valued net of debt. This is the figure to attest or publish as vault NAV.
nav.gross is NAV neutralized for deposits and withdrawals, pure trading performance. It can be negative, and it is not what a vault is worth. Publishing it as NAV is the classic integration mistake; don’t.
Freshness and publish guards
An automated publisher must never push a stale or flagged figure. Three fields exist for exactly that:last_updated_at: when the ledger behind this response was last recalculated. Reject the response if it is older than your staleness tolerance.is_recalculating:truewhile a ledger rebuild is in flight. Retry after a few minutes, or treat the value as not-yet-final.publish_hold: a manual do-not-publish gate.truemeans an operator has flagged this portfolio’s numbers as wrong or not-yet-verified (via the hold button in the account view) and it must not be published until cleared, regardless oflast_updated_at.publish_hold_accountslists which member accounts are held; a portfolio is held if any of them is. This is the hard stop for “hold publishing until manual inspection” — honor it fail-closed: if you cannot read the flag, do not publish.
vs_currency, the endpoint returns 503 with no figures rather than silently falling back to USD. An empty response instead of a wrong one; what to do with a missed cycle (skip, retry, reuse last published) is your workflow’s decision, made explicitly.
Currency conversion
- All flat monetary scalars (
nav.raw,nav.gross, the PnL fields, fees, debt, funding) are converted tovs_currencyat the current rate. nav_breakdownand fields explicitly suffixed_usdalways stay USD-denominated; the breakdown mixes token amounts with USD values and does not convert cleanly.- Fiat rates use USDC as a USD proxy; crypto denominations divide by the coin’s current USD price. Same sources as the historical chart conversion below, so the series and the scalar agree.
Finding the portfolio ID
data[i]._id as the portfolio_id. For the recommended one-account-per-vault setup this list has exactly one entry, which also keeps each downstream workflow isolated: a failure or key rotation on one vault never touches the others.
Historical NAV series
For backfills or cross-checking a published series, the daily history is available in the same currencies:Errors
Publishing checklist
- Pull a few hours ahead of your publish time, so a data issue can be flagged and resolved before the deadline rather than discovered at it.
- Never publish when
publish_holdistrue. It is the manual hold an operator sets when a figure looks wrong; treat it as a hard stop, skip the cycle, and surfacepublish_hold_accounts(with reasons) to whoever is on call. Fail closed: if the flag cannot be read, do not publish. - Reject on
is_recalculatingwhen the value materially moved, and onlast_updated_atolder than your tolerance. - Publish
nav.raw, nevernav.gross.

