API
ImplementedThe read-only HTTP surface: routes, shapes, and what each unavailable state means.
A read-only HTTP surface. It holds no key and can move nothing.
#Routes
| Route | Returns |
|---|---|
GET /health/live | Process liveness |
GET /health/ready | Readiness, including chain reachability |
GET /v1/status | Network, chain health, identity provider mode, data mode, launch gate |
GET /v1/health | Protocol health checks for a monitor. 503 once a check is failing |
GET /v1/market | The whole marketplace snapshot: vaults, badges, activity, aggregate stats |
GET /v1/vaults | Every deployed vault's summary |
GET /v1/vaults/:address | One vault: summary, positions with valuations, source identity |
GET /v1/vaults/:address/divergence | Per-asset snapshot, live balance, unmirrored delta, state |
GET /v1/receipts | Recent sync receipts, executions and skips alike |
GET /v1/sources/:address | Source identity and observed chain activity |
GET /v1/portfolio/:address | Vault shares held by an address |
#Unavailable is a value
Every figure that can be unknown is nullable, and carries the reason separately. Nothing is zero-filled.
{
"totalAssets": null,
"navUnavailableReason": "Position 0xA51c… cannot be priced (PriceStale)."
}Aggregate TVL follows the same rule with one extra condition: it is summed only when every vault is priceable. A partial sum presented as a total would understate the protocol while looking authoritative, so instead the response says how many vaults could not be priced.
#bigint at the boundary
Chain values are bigint in the SDK and decimal strings in JSON. They are never converted to number: a uint256 does not fit, and silently losing precision on a balance is worse than a slightly awkward type.
#Identity is advisory, and says so
Source identity is fetched best-effort and never blocks a response. Every payload carrying identity marks it explicitly:
{
"identity": { "handle": "…", "displayName": "…", "avatarUrl": null },
"identityIsAdvisory": true,
"identityProvider": "fomoscan",
"identityMode": "mock"
}identityMode is live, mock or disabled. When it is not live, the whole surface is labelled development data.
#Data mode
/v1/status reports dataMode as live or development-fixtures. In this build it is development-fixtures: identities come from recorded fixtures, while vault balances, positions, trades, pause flags and state are read from chain and are real.
#Skip reasons
Skip reasons are projected to their verbatim contract enum name, never paraphrased at the boundary. A client that wants friendlier wording can gloss them; a client that wants to match onchain data needs the real name.