Skip to main content

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, and deJAAA, a yield-bearing AAA-CLO fund), traded on the secondary market via DEX swaps. Regulation-S: not for US persons.
You call our API, we return an unsigned transaction or an EIP-712 payload. Users sign with their own wallet, tokens settle to their Tokenized Assets Account, you capture fees. Not perps. This is distinct from Global Markets, which offers synthetic perpetual futures with no token ownership. Tokenized Assets gives users actual ERC-20 tokens they hold and can transfer, settled on-chain. Important: Users must first create a Tokenized Assets Account before trading. It’s one isolated product account per owner at a deterministic address; the same account holds all three asset families across every supported chain. Tokens move in and out of that account, never the owner’s wallet directly.

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 below amount. null once the token is approved.
  • order — the order metadata (order_hash, order_message, extension, quote_id) plus safe_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)

When build.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.
Wait for the approval transaction to confirm before submitting the order. If you submit too early, no market maker can pull the input token and the order won’t fill.

3. Submit the signed order

The owner signs order.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_amount populates as fills arrive).
  • filled — fully settled. fill_tx_hash and filled_amount are 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
The order flow and the swap flow are mutually exclusive and enforced both ways: an equity symbol on /transact/buy or /transact/sell returns 422 pointing to the order flow, and an RWA symbol (mTBILL/mBASIS/mBTC) on /quote or /order returns 422 Wrong trade flow pointing to the swap endpoints.

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 same transact/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 same transact/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.
deRWA are Regulation-S instruments: they must not be offered to US persons. Each deRWA market carries a restricted_jurisdictions field (e.g. ["US"]) so you can geo-gate. The API surfaces the restriction but does not enforce it — geo-gating and any eligibility attestation are your responsibility.

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
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 of TSLAon, 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.