Why This Matters
Five issuers, each with its own settlement model: intent-based orders, DEX swaps, ERC-4626 vaults, and primary-market NAV cycles. Compass normalizes all of them into one API and one account.What It Does
Let your users buy and hold real, on-chain tokens that represent equities and real-world assets. One product, one account, five asset families:- Tokenized equities (Ondo): fractional-share ERC-20s of stocks like Tesla, Apple, and Nvidia, traded via intent-based orders.
- RWA yield tokens (Midas): NAV-accruing ERC-20s (
mTBILL,mBASIS,mBTC) backed by real-world assets, traded via swaps. - Managed vaults (IXS): permissionless ERC-4626 RWA vaults on BNB Smart Chain; deposits mint instantly, redemptions settle asynchronously.
- deRWA wrappers (Centrifuge): freely-transferable ERC-20 wrappers of Centrifuge V3 RWA fund shares (
deSPXA, an S&P 500 index fund, anddeJAAA, a yield-bearing AAA-CLO fund), traded on the secondary market via DEX swaps. Regulation-S: not for US persons. - Money-market funds (WisdomTree): issuer-permissioned fund shares (
WTGXX) subscribed and redeemed on the primary market at NAV, settling asynchronously. Sandbox only (staging API, Ethereum Sepolia).
Supported Markets
GET /v2/tokenized_assets/markets returns the live catalog: current prices, 24h change, sector tags, TVL/APY for RWA assets, and the Reg-S restricted_jurisdictions flag. Filter by provider, asset_class, and chain.
Getting Started
Create a Tokenized Assets Account
POST /v2/tokenized_assets/create_account returns the deterministic account address for owner and an unsigned creation transaction. The address is identical on every chain, but the account must be deployed once per chain you trade on, so pass chain (ethereum by default, base for Midas on Base, bsc for IXS). If the account already exists on that chain, transaction is null and you can skip straight to trading.
Trade Equities (Ondo)
Tokenized equities trade through an intent-based settlement protocol: the user signs an off-chain order and professional market makers fill it on-chain. The maker is the Tokenized Assets Account, not the owner’s wallet: the account holds the input tokens, authorizes the order, and receives the output tokens. The owner’s wallet is its sole controller and signs everything off-chain. Per order: build the order, sign a one-time token approval if one is returned, submit the signed order, then poll for the fill.1. Build an order
POST /v2/tokenized_assets/order returns three things in one round-trip:
quote: a preview of the input/output amounts and fees.approval_safe_tx_eip712: an EIP-712 payload, present only when the account’s allowance to the settlement contract is belowamount.nullonce the token is approved.order: the order metadata (order_hash,order_message,extension,quote_id) plussafe_message_eip712, the payload the owner signs to authorize the order.
If the account isn’t deployed on this chain yet, the call returns
400 Tokenized Assets Account not deployed; create it first. An unsupported from_token/to_token returns 404 Market not found.2. Approve the input token (first order per token only)
Whenbuild.approval_safe_tx_eip712 is non-null, the owner signs it with signTypedData, then a relayer (or the owner) broadcasts it. This authorizes the settlement contract to pull the input token.
Approval is one-time per token: the API requests an unlimited approval, so every future order against the same
from_token skips this step.3. Submit the signed order
The owner signsorder.safe_message_eip712 and submits it to POST /v2/tokenized_assets/order/submit. Unlike the approval, this signature is never broadcast on-chain. It’s relayed off-chain to the market-maker network, which validates it against the account at fill time.
extension and quote_id are opaque values from the upstream quote. Pass them back unchanged; don’t inspect them. Including order_hash guarantees you get a usable handle for status and cancel lookups.4. Poll for fill status
GET /v2/tokenized_assets/order/{order_hash} returns the lifecycle state:
pending: waiting for a market maker (covers partial fills;filled_amountpopulates as fills arrive).filled: fully settled.fill_tx_hashandfilled_amountare set, and the output token lands in the account.expired: the auction window closed without a fill.cancelled: cancelled on-chain before it filled.
Python
5. Cancel an unfilled order
POST /v2/tokenized_assets/order/{order_hash}/cancel returns cancel_safe_tx_eip712, which cancels the order on-chain when signed and broadcast, the same sign-then-relay pattern as the token approval. It works on pending and expired orders; a filled or already-cancelled order returns 409, and only the maker account can cancel (403 otherwise).
Python
Trade RWA Yield (Midas)
Midas RWA tokens are ERC-20s whose NAV accrues yield from real-world assets. They trade on the secondary market via an on-chain DEX aggregator: no order lifecycle, just a swap. They’re held in the same Tokenized Assets Account.Buy and sell (swaps)
Fund the account with a plain ERC-20 transfer of the input token, then swap.transact/buy and transact/sell each return one unsigned transaction (or an EIP-712 payload with gas_sponsorship: true) plus an estimated_amount_out.
Python
Managed Vaults (IXS)
IXS managed vaults are permissionless ERC-4626 RWA vaults on BNB Smart Chain whose NAV accrues yield from real-world assets, held through the same Tokenized Assets Account. One vault is surfaced today:USDC on BNB Smart Chain is an 18-decimal token (not 6, as on other chains). Pass human-readable amounts and the API scales them correctly.
Deposit and redeem
Vaults use the sametransact/buy / transact/sell endpoints as Midas, but you pass the vault address as the tokenized side (IXS shares aren’t a registered symbol). The two sides settle differently.
Python
Redemption status
GET /v2/tokenized_assets/redemptions reconstructs the owner’s redemption requests directly from the vault (Compass stores no async state). Poll it after a sell until the request is finalized.
Python
Trade deRWA (Centrifuge)
Centrifuge V3 issues deRWA tokens: freely-transferable ERC-20 wrappers of otherwise-restricted RWA fund shares. Unlike the KYC-gated primary vaults, deRWA trade permissionlessly on DEXs, so they use the sametransact/buy / transact/sell swap flow as Midas, held in the same Tokenized Assets Account. Two deRWA are surfaced today, both on Base:
deJAAA is yield-bearing: its NAV accrues CLO interest, so it surfaces apy_7d/apy_30d. deSPXA tracks an equity index (price movement, not yield), so its APY fields are null and it’s presented by price + % change instead.
Buy and sell (swaps)
Pass the deRWA token address as the tokenized side (deRWA aren’t registered symbols). A buy swaps USDC → deRWA; a sell swaps deRWA → USDC through the on-chain DEX aggregator. Both settle instantly in one transaction.current_price_usd on the market is the token’s NAV (not a DEX mid), while estimated_amount_out is the honest executable amount from the live swap quote.
Python
The markets endpoints serve full price history from indexed NAV history, exactly like Midas:
apy_7d/apy_30d, 24h change, a 24h sparkline, and OHLC candles.Money-Market Funds (WisdomTree Connect, Sandbox Only)
WisdomTree Connect issues tokenized funds as issuer-permissioned ERC-20s. Two things make them behave unlike every other family above. 1. Trading is primary-market, and settlement is asynchronous. There is no DEX and no issuance vault. A buy transfers USDC to WisdomTree’s on-receipt wallet for that fund and chain, resolved through WisdomTree’s own API, so you never supply or configure an address. WisdomTree observes the deposit off-chain and mints fund shares back to your product account at the next NAV cycle. The transaction you sign therefore delivers no shares. That is expected, not a failure. Responses carrysettlement: "async", and estimated_amount_out is what the NAV cycle will
deliver.
USDC received after the cutoff rolls to the following business day.
2. The account must be registered with WisdomTree first. Fund-share transfers are gated by
an on-chain compliance module: a wallet can only hold or receive shares once WisdomTree has
screened it and minted it a non-transferable KYC token. Register your product account
address (not your EOA) in the WisdomTree Connect portal, have a second user approve it, and
wait for the KYC token to be minted. Until then, buys are rejected with a
422 Account not whitelisted rather than sending USDC that could never settle. The product account address is
deterministic, so you can register it before it is deployed.
Subscribe and redeem
GET /v2/tokenized_assets/positions once the NAV cycle settles, valued at
the fund’s constant $1.00 NAV. Money-market funds distribute yield as additional shares rather
than price appreciation, so these markets carry no 24h change, APY, or candle history.
Read Markets and Positions
Markets and candles
GET /v2/tokenized_assets/markets lists every market; GET /v2/tokenized_assets/markets/{symbol} returns a single market with extended detail (52-week range, volume, market cap, holder count, tradable sessions) and an optional OHLC candle series.
Candles need a matching interval + range pair. Pass both, or omit both to get the detail without candles:
Python
Positions
GET /v2/tokenized_assets/positions returns the balances of every tokenized asset in the owner’s account: Ondo equities, Midas RWA tokens, IXS vault shares, and Centrifuge deRWA. Each carries a current USD price (RWA at the latest indexed NAV, IXS vaults at live on-chain NAV, deRWA at the Centrifuge NAV), plus a total_usd aggregate.
Pass the owner’s wallet address; the API derives the account and reads balances from there (fills, swaps, and deposits all land in the account, not the wallet). The read is per-chain; chain is optional and defaults to ethereum. Pass base for Midas or Centrifuge holdings, or bsc for IXS holdings.
Python
Error reference
Error reference
All
4xx/5xx responses use the standard Compass { "error": "<error>", "message": "<text>" } envelope, except input-validation 422s, which come from FastAPI as { "detail": [...] }.Use Cases
Brokerage app for retail. Let users buy fractional Tesla or Apple shares with USDC, hold them as on-chain tokens, and sell any time without a centralized broker. Example: a user buys $500 ofTSLAon, holds it as an ERC-20, and sells back to USDC a month later. You embed a fee on each trade.
On-chain portfolio diversification. Crypto-native users get equity and T-bill exposure without leaving their wallet, with the same UX as a token swap, settled just-in-time on-chain.
Example: a user rotates $10,000 of idle USDC into mTBILL to earn short-term Treasury yield while staying fully on-chain.
Treasury allocation. DAOs and on-chain orgs rebalance treasuries into tokenized equities or RWA yield while keeping signing authority with the owner wallet. No third-party custody.
Example: a DAO parks $250,000 of its stablecoin treasury in mBASIS and tracks NAV live from the positions endpoint.
Next Steps
Product Accounts
Background on the per-product account model used here.
Gas Sponsorship
How
/v2/gas_sponsorship/prepare broadcasts the signed approval and cancel transactions.Perpetual Trading
Synthetic stock perps via Hyperliquid. A different product, with leverage.