YieldSignal

Risk-weighted yield signals for autonomous agents, paid per call via x402 — no API key, no account. ETH liquid staking on Ethereum mainnet (Lido, Rocket Pool, Coinbase Wrapped Staked ETH, Frax Ether, Binance Staked ETH) plus USDC and WETH lending on Base (Aave, Compound, Morpho, Moonwell, Euler, Fluid).

$0.10/call signal$0.25/call analytics$0.50/call decision$1.00/call persistencesigned + on-chain track record

Proven, not promised

Strongest verified record right now: ETH liquid staking (Ethereum) at 100% within tolerance across 11 on-chain attestations. Every number below is recomputed from the public EAS track record on each page load — nothing here is a hand-written claim. Machine-readable at /accuracy.json.

AssetWithin 25bps of the leaderAvg regretMedian time on topAttestations scored
ETH_STAKING — ETH liquid staking (Ethereum)100%5 bps11h11
WETH — WETH lending (Base)44%80 bps2h55
USDC — USDC lending (Base)18%85 bps1h34

“Within tolerance” asks: when we flagged a protocol, was it still the leader — or at most 25bps behind it — when scored against the current market? Regret is how many bps behind the current leader the flagged protocol sits, on average. Both are directional (basis: directional-vs-current-market), not a historical backtest, and the endpoint says so.

Median time on top is how long a call actually stayed the leader before the next attestation replaced it — measured over each signal's own validity window, so a fast-rotating market is not judged against a market weeks later. It is also the practical answer to “how often should I re-check?”: 1h for USDC lending against 11h for ETH liquid staking (Ethereum). Machine-readable under windowedScore in /accuracy.json.

REST

GET https://yieldsignal.vercel.app/signal/eth-staking-yield
GET https://yieldsignal.vercel.app/signal/usdc-base-yield
GET https://yieldsignal.vercel.app/signal/weth-base-yield

Call it without payment and you'll get a 402 Payment Required with the exact price/asset/network. Any x402-compatible client (e.g. @x402/fetch) completes the payment automatically. Every product route is paid — there is no free tier. Bare /signal and /decision redirect (308) to the ETH liquid staking (Ethereum) route.

Decision, not just data

GET /decision/eth-staking-yield?position=lido&amountUsd=25000&horizonDays=30

The signal endpoints answer “what pays best right now”. The decision endpoints answer “given where my money already sits, is moving it worth the cost?” — returning MOVE/HOLD with expected net gain, break-even in days and a confidence tier, deterministic from the signed signal so you can reproduce it locally.

Is the yield real? (durability)

GET /durability/weth-base-yield

Splits every protocol's APY into base interest vs incentive and reports the post-incentive floor — what you keep if the reward campaign stops. On a real reading, the WETH leader paid 299bps of which 57.9% was incentive (floor 126bps), while the runner-up's 153bps was entirely base: the ranking flips without incentives. Only sources that itemize the reward component are decomposed; the rest are named as undecomposable and never assumed incentive-free, and no ranking claim is made when the current leader is one of them. A stress test of readings taken now — deliberately not a forecast of when a campaign ends. Base lending only: the five liquid-staking sources report no itemized incentive component, so there would be nothing to decompose.

Can you actually get out? (capacity)

GET /capacity/usdc-base-yield?amountUsd=200000

A market at 99% utilization pays beautifully and will not let you withdraw — the high rate is the symptom. This endpoint reads utilization and free liquidity straight from the protocol's own books (Aave, Compound) and tells you whether your size can exit right now and what share of the market it would be. Protocols that don't publish borrowed-vs-supplied are marked unmeasured and are never returned as executable.

How close is the repricing? (sensitivity)

GET /sensitivity/usdc-base-yield

A lending rate is not a number, it is a function of utilization with a kink. Below it the rate creeps; above it, it explodes. Read live on 2026-08-05: Compound's USDC market sat at 89.82% utilization against a kink at 90% — 0.18 points of headroom — where borrowing goes from 4.08% to 15.95% three points later. Aave had 3.84 points of room on the same asset. This endpoint reads the kink and the slopes from each protocol's own interest rate contract and reports where the market stands on that curve, plus the borrow APY at points around it. It is also the first route that speaks to the borrower, not just the lender. Aave and Compound only: Morpho's adaptive IRM exposes no static curve and the DefiLlama-sourced protocols expose none at all, so they are marked unmeasured — never assumed stable. It describes where the curve is now; it does not predict that utilization will move.

One risk in three wrappers (exposure)

GET /exposure/usdc-base-yield?positions=aave:200000,compound:50000,morpho:150000

The market is full of event detectors — depeg alerts, hack alerts, liquidation alerts — and most are free. None answer the question that actually costs money: am I exposed, and through what path? In the Stream Finance collapse only 1 of ~320 MetaMorpho vaults held the broken asset directly, yet $93M of loss became $285M of contagion. Read live for the portfolio above: three venues, and 81% of attributable capital behind a single collateral (cbBTC), arriving through both Compound and Morpho — plus Aave and Compound sharing the exact same 90% kink, so splitting between them buys nothing against a utilization shock. Morpho is attributed per isolated market, Compound by its real posted-collateral basket; Aave is reported unattributed, because a v3 supplier is exposed to the whole pool and splitting that across assets would imply diversification that does not exist. Structural shared exposure, not a correlation estimate.

How long does the answer hold? (persistence)

GET /persistence/usdc-base-yield

Every other endpoint here — and every competing yield feed — answers what pays best now. None answers how long that stays true, which is the number that decides whether moving capital is worth the gas. This endpoint answers it from this service's own hourly attestations on Base: the median time a protocol stayed the best pick, survival at 6/24/72h, and how much of the rotation is just two protocols trading places.

Measured over 24 days and 439 attestations, the three assets are not remotely the same product: the WETH leader never changed once (518h and counting, reported as a floor), the ETH staking leader changed every ~26h, and the USDC leader changed every ~2h — with half of those 167 switches being a round trip between the same two protocols. Chasing the USDC leader is worth $0.011 per $10,000 before gas; chasing the WETH one, $6.50. Same catalogue, 600x apart in what following it is actually worth.

It also answers, empirically, a question everyone assumes: does a bigger lead last longer? It does not — Spearman -0.04 across 177 completed leadership spells, with the 0-24bps and >=300bps bands both sitting at a 2h median. Gap size is not a usable proxy for confidence, and this is the only place that number is published. Every input is a public attestation UID, so you can recompute all of it from base.easscan.org and get the same answer without trusting this server. Assets whose lead has not yet changed are reported as a floor with a censoring flag, never as a median — and sample sizes travel with every figure.

The aggregate history is free and public at /persistence (machine-readable at /persistence.json) — evidence behind a paywall proves nothing. What is paid is the state now: which protocol leads, how long it has already led, and the lead duration applied to a MOVE/HOLD call.

The /decision routes consume this internally: the expected gain is projected over the horizon you asked for or over the measured lead duration, whichever is shorter. A 30-day projection on a 2h edge is how a MOVE that only pays gas gets recommended.

MCP

POST https://yieldsignal.vercel.app/mcp

Tools get_yield_signal and get_yield_decision (optional asset: "ETH_STAKING", "USDC" or "WETH"), plus get_yield_durability, get_exit_capacity, get_rate_sensitivity and get_shared_exposure (Base lending only: "USDC" or "WETH") and get_leadership_persistence (all three assets), gated per-call via @x402/mcptools/list/initialize stay free, only the tool call is paid. Also available as an elizaOS plugin.

Every reading is source-tagged

{
  "asset": "ETH_STAKING",
  "bestProtocol": "lido",
  "gapBps": 57,
  "rates": [
    { "protocol": "lido", "apyBps": 296, "weightedApyBps": 293, "source": "defillama", "asOf": "..." },
    { "protocol": "rocket-pool", "apyBps": 240, "weightedApyBps": 235, "source": "defillama", "asOf": "..." }
  ]
}

source is onchain/api (read directly from the protocol — Aave, Compound and Morpho) or defillama (aggregator — Moonwell, Euler, Fluid and all staking pools) — a reading that fails or looks invalid is omitted, never estimated.

Verifiable, not just claimed

Two independent ways to check a response wasn't tampered with or fabricated, without needing to trust our uptime at query time:

Agent discovery & reputation

Registration file (ERC-8004) at /agent-card.json — a portable identity for this service, discoverable outside x402-specific directories. Any buyer can leave verifiable feedback via the ReputationRegistry — see the agent card for both contract addresses.