Skip to main content

Assets & Vaults

Read endpoints for the catalog and live vault state. The catalog is filtered to assets enabled for your organization — a newly launched asset simply does not appear until it is enabled for you. There are no marketing states in the API.


GET /v1/assets

The full catalog, grouped by asset.

Response — data[]:

FieldTypeNotes
id, symbol, namestringAsset identity (rcusdp, xaua)
typeopen enumUnderlying asset class: cash_yield (tokenized T-bills / money market), commodity (physical commodity token), plus reserved values (private_credit, fixed_income, real_estate, equity). Tolerate unknown values — new classes are added without notice.
nativeChainenumsui
statusenumactive · paused (no new deposits; redeem/claim unaffected) · retired (history & redeem only)
currencystringQuote currency (USDC)
pricestringNAV per share/unit in currency
apystring | nullYield assets only
unitstring?Physical unit (gram for xaua)
vaults[]object[]Investable instances — see below

vaults[] fields:

FieldTypeNotes
vaultIdstringe.g. rcusdp-sui — use in all tx/* and vault endpoints
chainenumsui
railenumdirect — the account's USDC and the vault are on the same chain
statusenumas asset status
minDepositstringin currency
settlementobjectsee below
cancelableboolwhether pending deposits can be cancelled before settlement (false on xaua-sui)
cancelFeeBpsnumber?cancel fee, if any — 200 (2%) on rcusdp-sui, verified on-chain
feeBpsobject?{subscribe, redeem} asset-level fees, if any
requiresWhitelistbool?XAUa: wallet must be whitelisted before transacting

settlement object — customer-facing timing only (internal batching mechanics are not exposed):

FieldMeaning
deposit / redeemTime to settle, e.g. "T+1", "T+3" (business days)
cutoffUtcRequests before this time enter the current settlement cycle; after it, the next one
instantRedeem?{available, feeBps, source} — immediate exit path where supported. Read from the contract per request; see below

:::note Instant redeem is read from the contract, not declared Instant-redeem availability and its fee are an operator switch on the vault contract — they change without a release. This endpoint reads that switch for you on every request (short-cached), so you do not need to query the chain yourself. The source field tells you what you got:

sourcemeaning
"chain"available and feeBps are the contract's current values
"catalog-unverified"the chain could not be read; these are the catalog's declared values and may be stale

Never quote an instant redemption on "catalog-unverified" — it means we could not confirm the switch, which is not the same as confirming it is on. Treat it like available: false until a later request returns "chain".

Even on "chain", the switch can flip between your read and the user's signature, so keep the queued-redemption fallback for a rejected instant build. :::

Example:

{"data":[
{"id":"rcusdp","symbol":"rcUSDP","name":"TBook USD Yield Vault","type":"cash_yield",
"nativeChain":"sui","status":"active","currency":"USDC","price":"1.02754344","apy":"8.32",
"vaults":[
{"vaultId":"rcusdp-sui","chain":"sui","rail":"direct","status":"active","minDeposit":"1",
"settlement":{"deposit":"T+1","redeem":"T+1","instantRedeem":{"available":true,"feeBps":700}},
"cancelable":true,"cancelFeeBps":200},
"cancelable":true,"cancelFeeBps":200}]},
{"id":"xaua","symbol":"XAUa","name":"Alpha Gold Token","type":"commodity",
"nativeChain":"sui","status":"active","currency":"USDC","price":"107.51","unit":"gram",
"vaults":[
{"vaultId":"xaua-sui","chain":"sui","rail":"direct","status":"active","minDeposit":"10",
"settlement":{"deposit":"T+3","redeem":"T+3","cutoffUtc":"10:00"},"cancelable":false,
"requiresWhitelist":true,"feeBps":{"subscribe":10,"redeem":20}}]}]}

GET /v1/vaults

Flat vault list (same entitlement filter). Query: assetId=, chain=, status=.


GET /v1/vaults/:vaultId

One vault's catalog entry plus live pricing:

FieldTypeNotes
vaultId, assetId, symbolstringIdentity
chain, rail, statusenumAs in the catalog
currencystringQuote currency (USDC)
sharePricestringCurrent NAV per share (live where a NAV source is wired; reference price otherwise)
apystring | null
minDepositstring
settlementobjectinstantRedeem is read live from the contract and carries source ("chain" | "catalog-unverified") — see the note above
cancelablebool
requiresWhitelistbool
pausedbooltrue when status is paused
asOftimestamp

Errors: not_found.


GET /v1/vaults/:vaultId/price

{ "vaultId": "rcusdp-sui", "price": "1.02754344", "apy": "8.32", "currency": "USDC", "asOf": "2026-06-15T08:00:00Z" }

Cached up to 60 seconds. Poll freely (read rate limits apply), or subscribe to vault.price.updated webhooks instead.