Methodology
StockAPY publishes rates on tokenized stocks. This page explains exactly where each number comes from, so you can check it yourself.
Where the numbers come from
Most DeFi rates come from the DefiLlama yields API, matched to our own list of venues by pool ID rather than by token symbol. Symbols collide across chains and issuers — there is a SPY on Robinhood Chain and a wSPYx on Ethereum — so a symbol match would quietly mix up two different products.
Aave V4 and Morpho come from their own GraphQL APIs, which cover markets DefiLlama does not index, and Kraken’s vaults are read directly from Ink, Kraken’s own L2. Anything no API covers is entered by hand and labelled as such, and rows sourced by hand carry the date a human last checked them. A single row can draw on more than one source: Kraken’s vaults take their size from the chain and their rate from a human reading Kraken’s page, because no one source has both.
- defillama
- 28 rows
- aave_api
- 7 rows
- onchain
- 3 rows
- morpho_api
- 12 rows
- manual
- 11 rows
How often it refreshes
A scheduled job runs every 60 minutes and writes a snapshot. The last successful run was 23 Oct 2026. Every snapshot is committed to version control, so the history of any number on this site can be reconstructed.
Where the links go
Each market links to the most specific page we can establish for it, which for most DeFi venues is the market or lending page rather than the protocol’s front door. The arrow marks an outbound link; hovering says whether it is market-specific.
These are resolved from each protocol’s own identifiers, not guessed: Kamino market and reserve addresses and Jupiter vault ids from their APIs, Morpho market ids cross-checked against the markets listed in their sitemap, and Aave reserves by symbol. Where two markets shared a collateral, loan asset and LLTV, we used on-chain activity to tell them apart rather than picking one.
Crypto.com and Kraken have no public per-market URL, so those rows link to the product page. Every other market links to its own vault, reserve or market page.
The timestamp in the last column links to that pool’s rate and TVL history on DefiLlama, where we read it from. That link is always exact, because the pool id is the one we query.
Liquidity pools
We cover three venues, where nearly all tokenized-stock liquidity sits: Raydium on Solana, Uniswap on Base, BNB Chain, Ethereum and Robinhood Chain, and Aero on Base and Robinhood Chain. Only active pools are listed: at least $1,000 traded in the last 24 hours and at least $10k in the pool. Below that a pool is not meaningfully traded and its fee rate is noise.
Raydium data comes from Raydium’s own API. Each pool’s configuration gives Raydium’s cut of trading fees — currently 12% to the protocol and 4% to a fund — and Raydium’s published fee APR is computed on the full fee. We apply the cut, so our figure is what an LP actually keeps, about 16% below Raydium’s.
Uniswap pools come from GeckoTerminal, CoinGecko’s on-chain DEX index, which gives each pool’s address, 24h volume, value and fee tier. Uniswap’s own documented data route is its subgraphs on The Graph, which need an API key. The fee APY is 24h volume × fee tier ÷ value, before any Uniswap protocol fee, which applies to some pools and is not deducted.
Aero, launched on 21 October 2026 from the merger of Aerodrome and Velodrome, publishes no pool data API. We read its pools on-chain from Aero’s LP Sugar contract, the same contract the Aero app reads, on Base and Robinhood Chain. It returns each pool’s reserves, the swap volume and fees over the last 24 hours, its fee settings and its gauge emissions; prices come from DefiLlama, with GeckoTerminal as a fallback, and a pool we cannot price is not listed. We apply Aero’s own arithmetic for value, volume and fees, then compute the fee APY the same way as for the other venues: a year of fees, less the 5% Aero sends to sAERO Token Operators, divided by the pool’s whole value. Aero’s app divides by the liquidity near the current price only, so it shows a higher figure. An Aero LP takes either those fees or the AERO emissions paid to the pool’s gauge, never both, so we show emissions as dollars per day beside the fee APY, with no total. While a pool has less than a day of on-chain history, its figures cover the hours available, are flagged, and are left out of the headline median. Pools left over from Aerodrome and Velodrome before the merger are not Aero pools and are not listed.
A pool is listed only if one of its tokens is in our registry of tokenized-stock contracts, matched by address. Every address in the registry was checked against the token’s own on-chain name, because symbols are free to copy: building it turned up a Solana token called AMDC whose on-chain name is a USD stablecoin. Every row links to the exact pool’s deposit page and to its independent page on GeckoTerminal. All rates are before impermanent loss.
Borrow terms
Aave V4 reserves come from Aave’s own GraphQL API, which DefiLlama does not index for the equity spokes. It gives the collateral factor, the liquidation bonus and the borrow rate on the loan asset directly from the protocol. Everything else comes from DefiLlama’s lendBorrow endpoint, read from the collateral market itself. The borrow cost is the rate on the asset you would actually borrow, which is not always the same pool: in a pooled market such as Kamino’s xStocks Market, the stock reserve’s own borrow rate is the cost of borrowing the stock, so we point at the stablecoin reserve in that market instead and record which pool each rate came from.
We do not publish available borrowing liquidity. Supply, borrowed amounts and debt ceilings mean different things in a pooled market and an isolated one, and a single “available” column would imply a comparability that is not there.
Base, rewards and points are never added up silently
Base APY is interest paid by borrowers. Reward APY is a token incentive the protocol is paying out of its own budget; it can be cut at any time. Points are a promise of a future airdrop with no stated value. We show all three separately and never fold points into an APY figure, because nobody can honestly price them.
Programmes that have ended
Incentive programmes stop. When one does, we mark the opportunity Ended rather than deleting it: the row keeps the last rate we recorded, shown struck through, with the date and what we observed. Ended rows are excluded from every headline figure — the median, the best rate, the totals and the borrow tables — so a programme that no longer pays cannot flatter the numbers.
We keep them because a venue that paid for a while and then stopped is the most direct evidence this site has for its own argument. A yield aggregator that quietly removes the rows loses that history.
Listed and unlisted markets
Anyone can create a Morpho Blue market, and Morpho only surfaces curated ones in its own interface. Several of the largest tokenized-stock markets are not listed there: one NVDA market holds about $1.4m of collateral and pays a 39% borrow rate, and you will not find it by browsing. It is reachable by direct link and the collateral is real, so we list it — flagged Unlisted, because an uncurated market’s oracle and parameters have had nobody’s eyes on them.
Where several markets exist for the same stock and loan asset, we show each as its own row rather than picking one. They are genuinely different markets with different rates, sizes and risk.
Lend rate is not the stock’s rate
Morpho lists a “Lend Rate” against markets whose collateral is a tokenized stock, and on some of them it is very high — over 50% on one Robinhood Chain market as we write. It is easy to read that as yield on the stock. It is not. Morpho’s documentation is explicit that lenders deposit the loan asset and that collateral is posted by borrowers and never lent out, so that rate belongs to whoever supplies the USDG or USDC.
We show it in the borrow table as “Lend side”, clearly separated from what the stock earns, which on Morpho is zero. Folding it into the stock’s APY would make this site exactly as misleading as the pages it is meant to clarify.
A measured zero is not a missing number
Several venues accept tokenized stocks as collateral but never lend them out. Those rows show 0% because zero is the correct answer. Rows where we simply have not collected a rate say not collected instead. These are different things and the table never blurs them.
What we refuse to publish
- Marketing ceilings. “Up to 4%” is not a rate and does not go in the table.
- Estimated or back-filled APYs. If we did not read it from a source, it is null.
- A rate without a timestamp. Every row shows when it was last collected, and rows older than twice the refresh interval are flagged as stale.
Known gaps
- We do not publish liquidation thresholds as a column, only the maximum loan-to-value. Aave reports a 5.5% liquidation bonus on its equity reserves; other venues express the same risk differently, and a single column would flatten distinctions that matter.
- Superform’s own app and DefiLlama disagree on its vault rates by roughly a factor of 1.8 — on 19 Oct 2026 Superform showed 12.56% on superTSLA where DefiLlama reported 22.98%, with both reporting the same deposits. The rate is sUP emissions in both cases, so the gap is how that token is valued and annualised. We publish DefiLlama’s figure because it is the source we can read hourly, which means our highest headline rate is the higher of two readings. Check the vault page before trusting it.
- Crypto.com publishes a per-stock rate table but does not say whether the yield is interest, an incentive or revenue share. We record the total and leave the split null, and those rows are excluded from the “yield that is real interest” figure rather than counted as incentives.
- Bybit and Bitrue both list tokenized stocks for spot trading but pay nothing on them. They stay on the watchlist so the absence is documented rather than implied.
- Kraken’s vault sizes are read from the Veda BoringVault contracts on Ink, valued at the vault’s share supply times the price of the underlying xStock. The exact share rate lives in an Accountant contract whose address we could not find, so this understates each vault by roughly the yield it has accrued since launch — on the order of a percent. The rates themselves are hand-entered from Kraken’s site, because their Earn API needs an authenticated key.
- CeFi has no usable public API for tokenized stock earn products. Kraken’s vault rates need an on-chain reader we have not built yet; Bitrue and Crypto.com need manual checks.
- DefiLlama reports no reward APY for the Kamino xStocks markets even though incentive programmes have been announced there, so our reward column may understate them.
- TVL on CeFi venues is almost never disclosed. Those cells read “Not disclosed” rather than being left blank.
- 7 venues sit on the watchlist because we could not confirm a live rate.
Use the data
The full dataset is available as JSON at /api/opportunities and as CSV at /api/opportunities.csv. It is free to use. A link back is appreciated but not required.
Corrections
If a number here is wrong, it is worth telling us — the fix usually takes one line in a seed file. Every opportunity carries a verified flag that only a human can set.
Information only, not financial advice. Numbers are collected automatically and can be wrong or stale. Verify on the platform before depositing anything.