Documentation: all sections

Vault view keys & NAV attestations

Saxeo Vault seals everything sensitive by default: declared value, yield, maturity, positions, all readable only by the issuer or the holder. That is the right default, and it is the wrong answer the moment a regulator or an auditor needs to see the book. View keys resolve that without weakening the default: privacy by default, transparency by permission. The issuer grants a specific party read access to specific fields, for a bounded time, and revokes it at will.

Granting a scoped view

POST /v1/vault/assets/{id}/view-grant (session-authed, issuer only) mints a view key over exactly the fields you name.

curl https://www.saxeonetwork.tech/__api/v1/vault/assets/$ASSET_ID/view-grant \
-H "Authorization: Bearer $SAXEO_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
  "scope": ["holders", "value", "nav"],
  "label": "Q3 auditor: Ernst example LLP",
  "expires_in_days": 30
}'
{
  "grant_id": "vg_7c02…",
  "token": "vk_…",
  "url": "https://www.saxeonetwork.tech/__api/v1/vault/view/vk_…",
  "note": "The token is shown once. Share it over a secure channel; it grants read access to the scoped fields until it expires or is revoked."
}

The token is returned exactly once. The grantee needs no Saxeo account: they read the granted fields at the public endpoint, and see only what the scope allows.

# The grantee, with only the token:
curl https://www.saxeonetwork.tech/__api/v1/vault/view/$VIEW_TOKEN
{
  "asset": { "id": "…", "name": "Series A receivables", "type": "receivable" },
  "scope": ["holders", "value", "nav"],
  "holders": [{ "wallet": "0x…", "position_usd": 380000 }],
  "value": { "declared_usd": 500000 },
  "nav": { "nav_usd": 496200, "as_of": "2026-08-30T00:00:00Z" },
  "chain_head": "a91f…",
  "expires_at": "2026-09-30T00:00:00Z"
}

A field outside the granted scope is simply absent from the response. The response also carries the asset's current chain_head, so a grantee can cross-check what they were shown against the public event chain and confirm the record is intact.

Managing grants

GET /v1/vault/assets/{id}/view-grants (issuer only) lists the live grants on an asset with their scope, label, and expiry. DELETE /v1/vault/view-grants/{id} revokes one immediately; the token stops resolving on the next request. Grants are per-asset and independent, so a grant to one auditor never widens what another can see.

An auditor often needs one number on the record rather than the whole book: the net asset value, and the reserves the issuer says stand behind it. POST /v1/vault/assets/{id}/nav (issuer only) records both — as the issuer's own declaration, sealed, hash-chained, and signed as a declaration. Saxeo counts nothing and confirms nothing here; read what it does and does not say before you hand one to a counterparty.

curl https://www.saxeonetwork.tech/__api/v1/vault/assets/$ASSET_ID/nav \
-H "Authorization: Bearer $SAXEO_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
  "nav_usd": 496200,
  "reserves_usd": 500000,
  "as_of": "2026-08-30T00:00:00Z",
  "note": "August month-end mark"
}'

The gateway seals nav_usd and reserves_usd at rest, appends a hash-chained nav_attestation event to the asset's ledger (so it anchors to Solana with everything else), and returns a signed proof:

{
  "proof": "eyJ2Ijox…",
  "signature": "0x4f8c…",
  "signer": "0xA1b2…9F",
  "payload": {
    "v": 1,
    "type": "nav-attestation",
    "asset_id": "…",
    "seq": 7,
    "nav_micro_usd": 496200000000,
    "reserves_micro_usd": 500000000000,
    "solvent": true,
    "as_of": "2026-08-30T00:00:00Z",
    "commitment": "a91f…",
    "trust_model": "attested: signed by the Saxeo registry over its hash-chained ledger; publicly anchored when an anchor is present; not zero-knowledge",
    "issued_at": "2026-08-30T09:14:02Z"
  },
  "verify": "POST /v1/receipts/verify with {receipt: proof, signature}"
}

What the NAV proof says

The proof carries the figures the issuer typed, and a solvent flag, without publishing the book. Be exact about that flag: solvent is true when the declared reserves_usd is greater than or equal to the declared nav_usd. It is arithmetic over two numbers an issuer entered in a form. Saxeo does not count the reserves, contact a custodian, price the assets, or check that either figure corresponds to anything that exists — so the flag records an issuer asserting solvency, signed as their assertion. Send no reserves_usd and the proof carries the NAV with no solvent field at all, rather than a claim it cannot support.

What the signature does establish is narrower, and still worth having: that these figures were declared for this asset at this time and sealed under commitment (the sha256 of the sealed figures), that the same commitment was appended to the asset's event chain as a nav_attestation event — a chain from which nothing can be quietly removed or reordered — and, once the anchor pass runs, that the chain's root is published on a public chain. seq is this asset's NAV sequence number, so a skipped mark shows up as a gap and a re-stated one as a later entry, both of them permanent. A counterparty verifies the signature through the same public receipt verify endpoint as everything else, learns the declared NAV, and learns nothing about individual positions, counterparties, or reserve composition unless you separately grant a view over those fields.

A backer who needs the figure checked still has to do what an auditor does, with the view key you grant them. A declared backing figure is never proof of reserves — the same rule Saxeo Attestation states, and it applies here identically.

Honest scope

Everything here is registry infrastructure, not custody or audit. The figures are issuer-declared — the solvent flag included, since it is only a comparison of two declared numbers. The registry seals them, chains them so they are tamper-evident, anchors them publicly, and proves the record's integrity. It does not hold the assets, verify that the reserves exist, or appraise the NAV. A proof means Saxeo's signature is genuine, the ledger it signed over is intact, and its anchors are on a public chain. It does not mean Saxeo has independently confirmed what an issuer stated. That confirmation is what an auditor does with the view key you grant them.