Skip to main content

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:
Note the prefix: this service sits behind /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: true while 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. true means 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 of last_updated_at. publish_hold_accounts lists 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.
And one behavior: if no conversion rate is available for the requested 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 to vs_currency at the current rate.
  • nav_breakdown and fields explicitly suffixed _usd always 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

Returns the portfolios the account owns; use 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:
Keys are millisecond timestamps, one point per day; the latest point is the most recent end-of-day NAV.

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_hold is true. It is the manual hold an operator sets when a figure looks wrong; treat it as a hard stop, skip the cycle, and surface publish_hold_accounts (with reasons) to whoever is on call. Fail closed: if the flag cannot be read, do not publish.
  • Reject on is_recalculating when the value materially moved, and on last_updated_at older than your tolerance.
  • Publish nav.raw, never nav.gross.