Skip to main content
Protocol-reported APYs aren’t comparable: Morpho reports a smoothed average, Aave a spot supply rate, Lagoon a weekly APR, Yearn a net APR. Webacy publishes one standardized yield per vault, then breaks it down so you can see where it comes from, what fees cost, and whether you can actually get it. Every field on this page is returned on the vault metadata object by GET /vaults (list) and GET /vaults/{address} (detail), and on the V3 vault detail. All yields are decimal ratios (0.0291 = 2.91%).
These fields are informational. None of them changes a vault’s risk score or letter grade.

What you get

Standardized APY

The vault’s realized yield, measured the same way for every protocol, with its source and window.

Incentives

Third-party reward campaigns (Merkl), kept separate from the base yield, with eligibility and end dates.

Yield durability

A 0–100 score for how much of the yield a typical depositor can count on if incentives stop.

Fees

APY before and after the vault’s fees, with the fee rates and where they came from.

Deposit status

Whether a new depositor can deposit right now, and who is allowed to.

Flow terms

Whether deposits and redemptions settle instantly or through a request queue, and any lockup.

Standardized APY

When apy_measure starts with realized_, apy is the vault’s realized share-price yield: how much the value of one vault share actually grew, annualized. Its apy_source is then onchain.share_price (Webacy’s own on-chain read) or tradingstrategy.share_price (an independent share-price feed, corroborated against a live on-chain read). When no realized yield is available, apy is the protocol’s own figure instead (a spot, smoothed, or projected rate), and apy_source / apy_measure say which. Check apy_measure before treating apy as measured depositor earnings.
  • Windows: 7, 30, and 90 days. The headline apy is the 90-day window, or the 30-day window when the vault is younger. The 7-day window is published for monitoring but is never the headline.
  • Source: share prices are read on-chain by Webacy at the block for each date (convertToAssets for ERC-4626 vaults, pricePerShare for Yearn v2, getPricePerFullShare for Beefy, the reserve’s normalized income for Aave). Where an independent share-price feed also covers the vault, the two are compared and a disagreement is flagged.
  • Net of fees by construction: protocols that take their fee inside the share price (Morpho, Euler, Yearn, Lagoon, and others) are already net of that fee.
  • Guards: Webacy’s pipeline refuses a realized result outside −95% to +50% rather than publishing it. A share price rising faster than that is usually interest accruing on debt that won’t be repaid. Funds whose share price tracks a market price (equity or gold index funds) are refused too, because that’s a price return, not yield. The API then publishes apy only when it is above 0 and at most 500%, so a realized loss appears only in realized_apy_windows.
A gap between apy and apy_native is information, not an error. Protocol figures are often spot rates or include rewards that never reach the share price. The realized figure is what depositors actually earned.
The vault pipeline runs every 6 hours. Each vault’s data_as_of says when its record was last measured; a failed read keeps the previous record, so data_as_of can be older than the latest run.

Incentives

incentives describes third-party reward campaigns run through Merkl, matched to the vault by chain and address. Incentives are paid from a sponsor’s budget, not earned by the deposits, so they are never added into apy. The object is null when the vault has no Merkl campaign.
Read incentive_apr together with incentive_apr_restricted. An ordinary depositor’s incentive is incentive_apr − incentive_apr_restricted. When all of it is restricted, an ordinary depositor earns only the base apy.null on incentive_apr_restricted (or any eligibility APR field) means eligibility wasn’t computed. Don’t read it as 0, and don’t treat the incentive as open. APR whose eligibility is unknown is not counted as restricted, so the subtraction above can include it (incentive_apr_liquid_eligibility_unknown gives that part).
Also returned: incentive_apr_liquid_restricted, incentive_apr_liquid_eligibility_unknown, incentive_apr_liquid_low_quality (open token APR paid in a token with no reliable value), incentive_apr_boosted (campaigns with per-user boosts, so the headline is an average), incentive_eligibility_hooks, incentive_reward_qualities, incentive_self_funded, merkl_native_apr, and merkl_total_apr. Each campaign row also carries boosted.

Yield durability

incentives.yield_durability scores how much of a vault’s current yield a typical depositor can count on if incentives are not renewed. The base yield counts as fully durable; only the incentive part is discounted:
  • share is the incentive share of the yield an ordinary depositor can earn. Restricted campaigns are left out, so it can be lower than the headline incentive_share.
  • liquid_fraction is the share of the open incentives paid in tradable tokens. Points and pre-launch tokens count as 0, and so does a token with no reliable value. APR that Merkl reports but can’t attribute to a campaign, or whose eligibility is unknown, counts as 0.5. When no incentive is open to an ordinary depositor, it is 0.5 and has no effect, because share is 0.
  • renewal grows with the campaign streak: 0.25 + 0.65 × min(streak days / 365, 1), so between 0.25 and 0.90.
  • funding is 0.85 when the vault’s own curator funds the campaign, otherwise 1.
flags add context independent of the tier: incentive_dependent (incentives are 50% or more of the typical depositor’s yield), short_streak (under 30 days of unbroken campaigns), points_incentive / pretge_incentive, self_subsidised, and restricted_incentive (some incentive APR is gated and was excluded from the score). drivers returns the inputs above.
A vault whose incentives are all restricted can score high: for an ordinary depositor its yield is all base yield, which is fully durable. The restricted_incentive flag tells you this is the case.

Fees

fees gives the yield before and after the vault’s own fees, with the rates behind them. The object is null when nothing is known about the vault’s fees. A rate the source doesn’t provide is never assumed: apy_before_fees stays null and fee_gap_reason says why. Entry and exit fees are reported in fee_model but not folded into either APY.

Deposit status

deposit_status says whether a new depositor can deposit right now.

Flow terms

flow_terms says how deposits and redemptions settle. The object is null when nothing is known. A sync redemption can still be limited by available liquidity. See pct_tvl_withdrawable and the withdrawal signals in Vault Risk Intelligence.

Filtering and sorting

On the vault list (GET /vaults):

Example

Steakhouse High Yield USDC Edition (Morpho, Base). Excerpt of metadata from GET /vaults/0xbeeff2490feffa212fac2f6553682c219e6a8845?chain=base, trimmed to the fields on this page:
How to read it:
  • The vault’s realized APY is 2.91%, annualized from its share-price change over the last 90 days and measured on-chain. Morpho’s own figure is 3.16%.
  • Before the curator’s 25% performance fee, the annualized APY is 3.88%, so fees cost 0.97 percentage points a year.
  • Sponsors pay another 2.61% in incentives, but all of it is restricted (Coinbase-verified depositors), so an ordinary depositor earns 2.91% and an eligible one about 5.52%. incentive_apr is the authoritative total: the listed campaign’s own apr is 1%, and the rest is APR Merkl reports for the vault without attributing it to a listed campaign.
  • Durability is high with restricted_incentive: for an ordinary depositor the yield is all base yield. liquid_fraction is 0.5 because no incentive is open to an ordinary depositor, so it has no effect on the score.