Raw schema
{
"type": "object",
"properties": {
"query": {
"description": "Pool filters (token, chain, protocol, strategy, APY, TVL, freshness), e.g. {\"search\":\"usdc\",\"strategies\":[\"lending\"]}. Defaults to pools with at least $100K TVL.",
"type": "object",
"properties": {
"search": {
"description": "Words that must all appear in the pool symbol, protocol, chain, market label or token address, e.g. \"usdc\", \"steth\", \"aave usdt\".",
"type": "string",
"maxLength": 200
},
"chains": {
"description": "Chain names (case-insensitive exact match), e.g. [\"Ethereum\",\"Base\",\"Arbitrum\",\"Solana\"].",
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"protocols": {
"description": "Protocol slugs (case-insensitive exact match), e.g. [\"aave-v3\",\"morpho-blue\",\"compound-v3\"]. Use search for partial names.",
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"providers": {
"description": "Data feed: \"pool-feed\" (lending, liquidity and staking pools) or \"vault-feed\" (auto-compounding vaults).",
"maxItems": 2,
"type": "array",
"items": {
"type": "string",
"enum": [
"pool-feed",
"vault-feed"
]
}
},
"strategies": {
"description": "Pool type: lending markets, vaults, liquidity (DEX LP) pools or staking.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"lending",
"vault",
"liquidity",
"staking",
"unknown"
]
}
},
"stablecoinOnly": {
"description": "Only pools whose assets are all recognised stablecoins (single or pairs). Labels only; says nothing about peg safety.",
"type": "boolean"
},
"stablecoinPairOnly": {
"description": "Only pools pairing two or more recognised stablecoins, e.g. USDC-USDT.",
"type": "boolean"
},
"singleAssetOnly": {
"description": "Only single-asset pools (no LP pairs, so no impermanent loss from a pair).",
"type": "boolean"
},
"minApy": {
"description": "Minimum total APY. A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"maxApy": {
"description": "Maximum total APY. A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"minBaseApy": {
"description": "Minimum base APY (organic yield, excluding reward tokens). A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"maxBaseApy": {
"description": "Maximum base APY. A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"minRewardApy": {
"description": "Minimum reward-token APY. A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"maxRewardApy": {
"description": "Maximum reward-token APY, e.g. 0 for pools paying no reward tokens. A fraction, not a percentage: 0.05 means 5%, 0.5 means 50%.",
"type": "number",
"minimum": -1,
"maximum": 1000
},
"minTvlUsd": {
"description": "Minimum total value locked in USD. Defaults to 100,000 on this server; pass 0 to include tiny pools.",
"type": "number",
"minimum": 0,
"maximum": 1000000000000000
},
"maxTvlUsd": {
"description": "Maximum total value locked in USD.",
"type": "number",
"minimum": 0,
"maximum": 1000000000000000
},
"minScore": {
"description": "Minimum experimental assessment score 0-100. Few pools have reviewed evidence, so this usually returns nothing.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"minCoverage": {
"description": "Minimum share (0-100) of assessment checks with evidence.",
"type": "number",
"minimum": 0,
"maximum": 100
},
"exitAvailableOnly": {
"description": "Only pools with evidence that withdrawals are available.",
"type": "boolean"
},
"freshness": {
"description": "Data age rule. \"retrieved\" (default): retrieved within maxAgeMinutes. \"observed\": the source must state when it measured the rate. \"any\": include old quotes.",
"type": "string",
"enum": [
"retrieved",
"observed",
"any"
]
},
"maxAgeMinutes": {
"description": "Maximum data age in minutes for the freshness rule (default 60). It can only shorten the window: each rate also expires after its own time-to-live (usually 60 minutes). To include older quotes use freshness \"any\".",
"type": "number",
"minimum": 1,
"maximum": 10080
},
"sort": {
"description": "Sort field. Default \"tvl\" (largest pools first); use \"apy\" for the highest quoted APY first.",
"type": "string",
"enum": [
"apy",
"tvl",
"base",
"reward",
"name"
]
},
"direction": {
"description": "Sort direction (default \"desc\").",
"type": "string",
"enum": [
"asc",
"desc"
]
}
},
"additionalProperties": false
},
"groupBy": {
"default": "chain",
"description": "Break the statistics down by chain (default), protocol or strategy, or \"none\" for one overall row.",
"type": "string",
"enum": [
"chain",
"protocol",
"strategy",
"none"
]
},
"topGroups": {
"default": 10,
"description": "How many groups to return, largest TVL first (default 10).",
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}