Positions, Earnings, History, Portfolio
Account-scoped read endpoints. Secret key required. For omnibus accounts, everything on this page is pool-level — user-level detail lives in your ledger (see Account Models).
GET /v1/accounts/:id/positions
Live holdings per vault. Query: assetId= (optional filter).
{
"data": [
{
"assetId": "rcusdp",
"vaultId": "rcusdp-sui",
"shares": "97.310000",
"sharePrice": "1.0275",
"value": "99.99",
"currency": "USDC",
"pending": {
"deposits": [
{ "recordId": "42", "amount": "50.000000",
"cancelable": true, "submittedAt": "2026-06-15T08:02:11Z" }
],
"redeems": [
{ "recordId": "7", "shares": "10.000000", "estimatedProceeds": "10.27" }
]
},
"claimable": "0.000000",
"asOf": "2026-06-15T08:15:00Z"
}
]
}
Notes:
pending.deposits[].recordIdis the cancel handle fortx/cancel-deposit.- Only vaults where the account holds something appear; vaults on chains where the account has no wallet are skipped.
- Sui-rail positions read on-chain records directly. Legacy Solana-rail positions already include settled-but-not-yet-touched balances (the gateway settles lazily on the user's next interaction; the API accounts for it so you never display stale numbers).
value = shares × sharePrice, incurrency.sharePriceandvaluearenullwhen the price source is briefly unavailable — handle that in your UI.
GET /v1/accounts/:id/earnings
Query: assetId= (optional; defaults to rcusdp).
{
"assetId": "rcusdp",
"totalDeposited": "5000.00",
"totalRedeemed": "1000.00",
"netInvested": "4000.00",
"currentValue": "4210.55",
"profit": "210.55",
"profitRateBps": 526,
"totalFees": "1.20",
"asOf": "2026-06-15T08:15:00Z"
}
Definitions (normative):
netInvested = totalDeposited − totalRedeemed(redeemed = claimed proceeds; deposits cancelled before settlement net out oftotalDeposited)currentValue = (shares + pendingRedeemShares) × sharePrice + pendingDepositAmount + claimableprofit = currentValue − netInvestedprofitRateBps = profit / netInvested × 10⁴(integer;0whennetInvested≤ 0)- Fees are reported separately in
totalFees, not netted out ofprofit.
For commodity assets (XAUa) profit is price appreciation — there is no yield component.
GET /v1/accounts/:id/transactions
Indexer-backed history — the unified replacement for separate deposit/redemption/withdrawal history lists.
Query: type=deposit|redeem|claim|cancel_deposit|treasury_withdrawal · status= (intent statuses) · vaultId= · limit= (default 20, max 100) · cursor=.
{
"data": [
{
"id": "txi_01h…", "source": "api", "type": "deposit", "status": "settled",
"vaultId": "rcusdp-sui", "chain": "sui",
"amount": "100", "shares": null, "digest": "8vJk…",
"createdAt": "…", "submittedAt": "…", "settledAt": "…"
},
{
"id": "che_3kPw…_0", "source": "chain", "type": "deposit", "status": "settled",
"vaultId": "rcusdp-sui", "chain": "sui",
"amount": "25.000000", "shares": null, "digest": "3kPw…",
"createdAt": "…", "submittedAt": null, "settledAt": "…"
}
],
"nextCursor": "eyJ…", "hasMore": false
}
source: "chain" rows are on-chain transactions from the account's registered wallet that were not built through the API — indexed and attributed anyway, with a synthetic che_… id derived from the digest. They are merged into the first page only; paginate with cursor for the API-originated intent history.
GET /v1/accounts/:id/portfolio
One call for an in-app dashboard:
{
"totalValue": "4210.55",
"totalProfit": null,
"currency": "USDC",
"positions": [
{ "assetId": "rcusdp", "vaultId": "rcusdp-sui", "value": "3110.55", "share": "0.7388" },
{ "assetId": "xaua", "vaultId": "xaua-sui", "value": "1100.00", "share": "0.2612" }
],
"asOf": "2026-06-15T08:15:00Z"
}
totalProfit is currently null — portfolio-level profit requires the full indexed history and lands with a later release. Use /earnings per asset for profit today.