{"openapi":"3.1.0","info":{"title":"Liquid Restaking Tokens Comparison API","version":"1.0.0","description":"The major Ethereum liquid-restaking tokens (LRTs) compared side by side, read keyless directly from the Ethereum blockchain via a public RPC node. Restaking is the DeFi narrative EigenLayer kicked off: you stake ETH and then restake it to also secure other services, earning Ethereum staking rewards PLUS restaking rewards on top. A liquid-restaking token — weETH (ether.fi), ezETH (Renzo), pufETH (Puffer) or rswETH (Swell) — is the liquid receipt for that position, and its on-chain exchange rate against ETH climbs as those combined rewards accrue. Restaking is a distinct, fast-moving asset class from plain liquid staking, and the spread between these tokens' rates and yields is what someone choosing a restaking provider (or arbitraging between LRTs) needs in one place. The rates endpoint is the comparison table: every tracked LRT with its live ETH exchange rate, its net APR over the last 30 days, its token supply and its issuer, ranked by yield. The token endpoint drills into one LRT by symbol — its rate, supply, ETH backing (TVL) and the APR over the last day, week and month. The convert endpoint converts any amount between any LRT and ETH, or between two LRTs, at the current on-chain rates. This is the liquid-RESTAKING comparison cut — distinct from liquid-STAKING tokens (the lstcompare feed), the single-protocol feeds (ether.fi, lido) and the DeFi-TVL feeds. Each token rate comes from its own on-chain rate source (a getRate() call, a rate-provider, or an ERC-4626 vault, depending on the protocol). APR is derived from real historical on-chain state; the 30-day window is used because several LRT rates update on an oracle schedule or in discrete ERC-4626 steps, making shorter windows noisy. The rate reflects realised value accrual — many LRTs additionally distribute points/airdrops that are NOT captured by the exchange rate. Rates are ETH per token. Keyless, nothing stored beyond a short cache.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/lrtcompare-api","description":"oanor gateway"}],"tags":[{"name":"Rates"},{"name":"Token"},{"name":"Convert"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/rates":{"get":{"operationId":"get_v1_rates","tags":["Rates"],"summary":"All tracked LRTs: ETH rate, 30d APR, supply, ranked by yield","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"The major Ethereum liquid-restaking tokens compared, ranked by net 30-day APR. eth_per_token is the live on-chain exchange rate (one token is worth this much ETH; the rate, not the level, is what matters for yield). apr_30d_pct is the net yield over the last 30 days, annualised from the on-chain rate growth — it captures realised staking+restaking value accrual but NOT any points/airdrops the protocol distributes separately. The 30-day window is used deliberately: several LRT rates update on an oracle schedule or in discrete ERC-4626 steps rather than every block, so shorter windows (see /v1/token) are noisy; 30 days is the reliable read. supply is the token's total supply. Live from each token's rate source, cached ~90s.","block":25306236,"count":4,"source":"Ethereum LRT contracts/rate providers via public RPC (ethereum-rpc.publicnode.com), keyless","tokens":[{"supply":1558681.2,"symbol":"weETH","protocol":"ether.fi","apr_30d_pct":2.51,"eth_per_token":1.096943},{"supply":51286.4,"symbol":"ezETH","protocol":"Renzo","apr_30d_pct":2.38,"eth_per_token":1.079661},{"supply":25753.5,"symbol":"pufETH","protocol":"Puffer","apr_30d_pct":2.19,"eth_per_token":1.077459},{"supply":12962.2,"symbol":"rswETH","protocol":"Swell","apr_30d_pct":1.79,"eth_per_token":1.073281}]},"meta":{"timestamp":"2026-06-13T04:42:39.220Z","request_id":"25b9ae2b-f02f-4375-aec7-bebaffd2dbb9"},"status":"ok","message":"LRT rates retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/token":{"get":{"operationId":"get_v1_token","tags":["Token"],"summary":"One LRT by symbol: rate, supply, TVL, 1d/7d/30d APR","description":"","parameters":[{"name":"symbol","in":"query","required":true,"description":"LRT symbol: weETH, ezETH, pufETH or rswETH","schema":{"type":"string"},"example":"weETH"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"One liquid-restaking token in detail. eth_per_token is the live on-chain exchange rate; tvl_eth is supply × rate (the ETH backing the token). net_apr_pct is the net yield over 1d/7d/30d, annualised from on-chain rate growth with real block timestamps — realised staking+restaking accrual, excluding any separately-distributed points/airdrops. IMPORTANT: several LRT rates update on an oracle schedule (Renzo, Swell) or in discrete ERC-4626 accrual steps (Puffer) rather than every block, so the 1d and 7d figures are NOISY for those (they can read 0 or even slightly negative when no update fell in the window, or spike right after one) — treat 30d as the reliable yield. A window is null if its historical state is unavailable. Live, cached ~90s.","source":"Ethereum weETH rate source via public RPC (ethereum-rpc.publicnode.com), keyless","supply":1558681.2,"symbol":"weETH","tvl_eth":1709784,"at_block":25306236,"protocol":"ether.fi","description":"ether.fi weETH (getRate)","net_apr_pct":{"1d":2.58,"7d":2.7,"30d":2.51},"eth_per_token":1.09694267,"token_per_eth":0.91162467},"meta":{"timestamp":"2026-06-13T04:42:39.504Z","request_id":"75d88664-bd3b-41e0-b94a-9e9da6e16b3b"},"status":"ok","message":"Token retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/convert":{"get":{"operationId":"get_v1_convert","tags":["Convert"],"summary":"Convert an amount between any LRT and ETH","description":"","parameters":[{"name":"amount","in":"query","required":true,"description":"Amount to convert","schema":{"type":"string"},"example":"10"},{"name":"from","in":"query","required":true,"description":"Source: eth or an LRT symbol","schema":{"type":"string"},"example":"weETH"},{"name":"to","in":"query","required":true,"description":"Target: eth or an LRT symbol","schema":{"type":"string"},"example":"ezETH"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":"ezeth","from":"weeth","note":"Converts an amount between any liquid-restaking token and ETH (or between two LRTs) at the current on-chain exchange rates. Each token is valued in ETH via its rate source, then converted to the target. ETH itself is 1. Live, cached ~90s.","amount":10,"result":10.16006896,"source":"Ethereum LRT rate sources via public RPC (ethereum-rpc.publicnode.com), keyless","eth_per_to":1.07966065,"eth_per_from":1.09694267},"meta":{"timestamp":"2026-06-13T04:42:39.613Z","request_id":"5e2231c1-e150-4e54-814c-74e3a7e43f61"},"status":"ok","message":"Conversion retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Service metadata","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"rates and meta take no parameters. token takes symbol (one of weETH, ezETH, pufETH, rswETH). convert takes amount (number), from and to (each 'eth' or an LRT symbol). Rates are ETH per token; APR is annualised from on-chain rate growth and excludes points/airdrops. The 30-day APR is the reliable read — some LRT rates update on an oracle schedule or in discrete ERC-4626 steps, making 1d/7d noisy. A ~90-second cache fronts the RPC.","sample":{"top_by_apr":"weETH"},"source":"Ethereum LRT contracts/rate providers via public RPC (ethereum-rpc.publicnode.com), keyless, live","service":"lrtcompare-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/rates":"All tracked LRTs: ETH rate, 30d APR, supply, ranked by yield.","GET /v1/token":"One LRT by symbol (symbol=weETH): rate, supply, TVL, 1d/7d/30d APR.","GET /v1/convert":"Convert an amount between any LRT and ETH (amount, from, to)."},"description":"The major Ethereum liquid-restaking tokens (weETH/ether.fi, ezETH/Renzo, pufETH/Puffer, rswETH/Swell) compared side by side, read keyless directly from the Ethereum blockchain. Restaking (the EigenLayer narrative) means staked ETH that also secures other services, earning staking PLUS restaking rewards. The rates endpoint is the comparison table (live ETH exchange rate, net 7d APR, supply, ranked by yield); token drills into one LRT (rate, supply, TVL, 1d/7d/30d APR); convert converts any amount between any LRT and ETH or between two LRTs. The liquid-RESTAKING comparison cut — distinct from liquid-STAKING tokens (lstcompare), the single-protocol feeds (ether.fi, lido) and the DeFi-TVL feeds. APR is derived from real historical on-chain state; it excludes separately-distributed points/airdrops.","tracked_tokens":[{"symbol":"weETH","protocol":"ether.fi"},{"symbol":"ezETH","protocol":"Renzo"},{"symbol":"pufETH","protocol":"Puffer"},{"symbol":"rswETH","protocol":"Swell"}],"upstream_status":"ok"},"meta":{"timestamp":"2026-06-13T04:42:39.668Z","request_id":"79eac26a-a57a-4b68-a26c-752c4db430d4"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":1050,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":1750,"monthly_call_quota":53000,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":4350,"monthly_call_quota":370000,"rps_limit":16,"hard_limit":true},{"slug":"scale","name":"Scale","price_cents_month":9600,"monthly_call_quota":2250000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/lrtcompare-api"}