Why This Matters
Offering tokenized stocks and real-world assets from scratch means integrating with issuers like Ondo, Midas, IXS, and Centrifuge, wiring up intent-based settlement, ERC-4626 vaults, and DEX routing, handling on-chain custody, and tracking positions across chains. We’ve done that - you get one API that covers all of it, with your tokenized-assets product live in days.What It Does
Let your users buy and hold real, on-chain tokens that represent equities and real-world assets. One product, one account, four 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.
Supported Markets
Fetch the live catalog — current prices, 24h change, sector tags, TVL/APY for RWA assets, and the Reg-S
restricted_jurisdictions flag — from GET /v2/tokenized_assets/markets, filterable 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 — 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 — there’s 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
Full price history —
apy_7d/apy_30d, 24h change, a 24h sparkline, and OHLC candles — is served on the markets endpoints from indexed NAV history, exactly like Midas.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 enriched with 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 and chain is optional, defaulting 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 — 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.Global Markets
Synthetic stock perps via Hyperliquid — a different product, with leverage.