{"openapi":"3.1.0","info":{"title":"DefiLlama API over Airnode","version":"1.0.0","description":"DefiLlama's free public API: the TVL of DeFi protocols and chains with its history, fees and revenue, DEX and options volumes, stablecoin supply by chain with peg prices, token prices by contract address or CoinGecko id, and yield pools with their APY history. Protocols, chains, stablecoins and pools are named by DefiLlama's own slugs and ids, which the list operations answer. This Airnode signs what it obtained from DefiLlama, so a response is proof of what DefiLlama answered rather than a claim by DefiLlama itself.\n\nEvery response carries an EIP-191 signature from the Airnode that served it, so the data can be attributed back to its source rather than trusted on reputation."},"servers":[{"url":"https://airnode-defillama.fly.dev"}],"paths":{"/":{"get":{"operationId":"getDocumentation","summary":"This document.","description":"Describes the operations this Airnode serves and how to verify what it returns. Free.","responses":{"200":{"description":"An OpenAPI document describing this Airnode.","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"performRequest","summary":"Perform an operation and attest to the response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"title":"listProtocols","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"listProtocols","description":"List every protocol DefiLlama tracks with its current TVL, chains and metadata","x-airnode-returns":{"id":"string","name":"string","slug":"string","symbol":"string","url":"string","logo":"string","category":"string","module":"string","chain":"string","chains":"array","address":"string","description":"string","audits":"string","audit_links":"array","gecko_id":"string","cmcId":"string","twitter":"string","treasury":"string","tvlCodePath":"string","methodology":"string","referralUrl":"string","listedAt":"integer","misrepresentedTokens":"boolean","openSource":"boolean","wrongLiquidity":"boolean","deprecated":"boolean","deadUrl":"boolean","deadFrom":"string","rugged":"boolean","excludeTvlFromParent":"boolean","tvl":"number","chainTvls":"object","tokenBreakdowns":"object","change_1h":"number","change_1d":"number","change_7d":"number","mcap":"number","staking":"number","pool2":"number","governanceID":"array","github":"array","dimensions":"object","hallmarks":"array","oraclesBreakdown":"array","oracles":"array","parentProtocol":"string","parentProtocolSlug":"string","previousNames":"array","assetToken":"string","forkedFrom":"array","forkedFromIds":"array","tokensExcludedFromParent":"object","stablecoins":"array","tags":"array","language":"string","warningBanners":"array","rwaAssetIds":"array","rwaAssetQuery":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getProtocol","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getProtocol","description":"Get a protocol's TVL history with its breakdown by chain and by token","x-airnode-returns":{"id":"string","name":"string","symbol":"string","url":"string","logo":"string","description":"string","address":"string","chain":"string","chains":"array","category":"string","module":"string","audits":"string","audit_links":"array","gecko_id":"string","cmcId":"string","twitter":"string","treasury":"string","tvlCodePath":"string","methodology":"string","referralUrl":"string","listedAt":"integer","misrepresentedTokens":"boolean","wrongLiquidity":"boolean","isParentProtocol":"boolean","deprecated":"boolean","deadUrl":"boolean","deadFrom":"string","rugged":"boolean","openSource":"boolean","mcap":"number","staking":"number","pool2":"number","governanceID":"array","github":"array","stablecoins":"array","oracles":"array","oraclesBreakdown":"array","forkedFrom":"array","forkedFromIds":"array","previousNames":"array","tags":"array","language":"string","parentProtocol":"string","parentProtocolSlug":"string","otherProtocols":"array","dimensions":"object","hallmarks":"array","currentChainTvls":"object","chainTvls":"object","tvl":"array","tokens":"array","tokensInUsd":"array","raises":"array","hacks":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["protocol"],"properties":{"protocol":{"description":"The protocol slug as listProtocols answers it, aave or aave-v3 for example.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getHistoricalChainTvl","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getHistoricalChainTvl","description":"Get the daily TVL of all of DeFi across every chain","x-airnode-returns":{"date":"integer","tvl":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getHistoricalChainTvlByChain","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getHistoricalChainTvlByChain","description":"Get the daily TVL of one chain","x-airnode-returns":{"date":"integer","tvl":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["chain"],"properties":{"chain":{"description":"The chain name as listChains answers it, Ethereum or Arbitrum for example.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getProtocolTvl","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getProtocolTvl","description":"Get the current TVL of a protocol as a single number"},"parameters":{"type":"object","additionalProperties":false,"required":["protocol"],"properties":{"protocol":{"description":"The protocol slug as listProtocols answers it, aave for example.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"listChains","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"listChains","description":"List every chain with its current TVL","x-airnode-returns":{"name":"string","tvl":"number","chainId":"number","gecko_id":"string","gasTokenGeckoId":"string","tokenSymbol":"string","cmcId":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getFeesOverview","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getFeesOverview","description":"List every protocol's fees and revenue with totals over several windows","x-airnode-returns":{"chain":"string","allChains":"array","protocols":"array","totalDataChart":"array","totalDataChartBreakdown":"array","breakdown24h":"object","breakdown30d":"object","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"},"dataType":{"description":"Which figure every total and chart carries: dailyFees, the default, dailyRevenue for what the protocol keeps, or dailyHoldersRevenue for what reaches its token holders.","type":"string","enum":["dailyFees","dailyRevenue","dailyHoldersRevenue"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getFeesOverviewByChain","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getFeesOverviewByChain","description":"List the fees and revenue of every protocol on one chain","x-airnode-returns":{"chain":"string","allChains":"array","protocols":"array","totalDataChart":"array","totalDataChartBreakdown":"array","breakdown24h":"object","breakdown30d":"object","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["chain","excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"chain":{"description":"A chain name from allChains of the overview, lowercase, ethereum or arbitrum for example.","type":"string"},"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"},"dataType":{"description":"Which figure every total and chart carries: dailyFees, the default, dailyRevenue for what the protocol keeps, or dailyHoldersRevenue for what reaches its token holders.","type":"string","enum":["dailyFees","dailyRevenue","dailyHoldersRevenue"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getProtocolFees","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getProtocolFees","description":"Get one protocol's fees and revenue with its daily history and chain breakdown","x-airnode-returns":{"id":"string","defillamaId":"string","name":"string","displayName":"string","slug":"string","url":"string","referralUrl":"string","description":"string","logo":"string","symbol":"string","address":"string","gecko_id":"string","cmcId":"string","twitter":"string","treasury":"string","chain":"string","chains":"array","module":"string","category":"string","protocolType":"string","methodologyURL":"string","methodology":"object","breakdownMethodology":"object","defaultChartView":"string","audits":"string","audit_links":"array","forkedFrom":"array","previousNames":"array","governanceID":"array","github":"array","tags":"array","hallmarks":"array","listedAt":"integer","tvlCodePath":"string","dimensions":"object","misrepresentedTokens":"boolean","doublecounted":"boolean","hasLabelBreakdown":"boolean","parentProtocol":"string","linkedProtocols":"array","childProtocols":"array","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","annualized1y":"number","average1y":"number","monthlyAverage1y":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number","totalDataChart":"array","totalDataChartBreakdown":"array","chainBreakdown":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["protocol"],"properties":{"protocol":{"description":"The protocol slug as the overview answers it, uniswap or uniswap-v3 for example.","type":"string"},"dataType":{"description":"Which figure every total and chart carries: dailyFees, the default, dailyRevenue for what the protocol keeps, or dailyHoldersRevenue for what reaches its token holders.","type":"string","enum":["dailyFees","dailyRevenue","dailyHoldersRevenue"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getDexOverview","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getDexOverview","description":"List every DEX with its trading volume over several windows","x-airnode-returns":{"chain":"string","allChains":"array","protocols":"array","totalDataChart":"array","totalDataChartBreakdown":"array","breakdown24h":"object","breakdown30d":"object","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getDexOverviewByChain","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getDexOverviewByChain","description":"List the trading volume of every DEX on one chain","x-airnode-returns":{"chain":"string","allChains":"array","protocols":"array","totalDataChart":"array","totalDataChartBreakdown":"array","breakdown24h":"object","breakdown30d":"object","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["chain","excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"chain":{"description":"A chain name from allChains of the overview, lowercase, ethereum or arbitrum for example.","type":"string"},"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getProtocolDexVolume","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getProtocolDexVolume","description":"Get one DEX's volume with its daily history and chain breakdown","x-airnode-returns":{"id":"string","defillamaId":"string","name":"string","displayName":"string","slug":"string","url":"string","referralUrl":"string","description":"string","logo":"string","symbol":"string","address":"string","gecko_id":"string","cmcId":"string","twitter":"string","treasury":"string","chain":"string","chains":"array","module":"string","category":"string","protocolType":"string","methodologyURL":"string","methodology":"object","breakdownMethodology":"object","defaultChartView":"string","audits":"string","audit_links":"array","forkedFrom":"array","previousNames":"array","governanceID":"array","github":"array","tags":"array","hallmarks":"array","listedAt":"integer","tvlCodePath":"string","dimensions":"object","misrepresentedTokens":"boolean","doublecounted":"boolean","hasLabelBreakdown":"boolean","parentProtocol":"string","linkedProtocols":"array","childProtocols":"array","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","annualized1y":"number","average1y":"number","monthlyAverage1y":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number","totalDataChart":"array","totalDataChartBreakdown":"array","chainBreakdown":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["protocol","excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"protocol":{"description":"The protocol slug as the overview answers it, uniswap or uniswap-v3 for example.","type":"string"},"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getOptionsOverview","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getOptionsOverview","description":"List every options exchange with its notional or premium volume","x-airnode-returns":{"chain":"string","allChains":"array","protocols":"array","totalDataChart":"array","totalDataChartBreakdown":"array","breakdown24h":"object","breakdown30d":"object","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number"}},"parameters":{"type":"object","additionalProperties":false,"required":["excludeTotalDataChart","excludeTotalDataChartBreakdown"],"properties":{"excludeTotalDataChart":{"description":"true to leave totalDataChart empty. false adds one [timestamp, total] pair per day since the dashboard started, which can double the size of the answer.","type":"boolean"},"excludeTotalDataChartBreakdown":{"description":"true to leave totalDataChartBreakdown empty. false adds one [timestamp, breakdown by chain and protocol] pair per day, which is the larger of the two charts by far.","type":"boolean"},"dataType":{"description":"Which figure every total and chart carries: dailyNotionalVolume, the default, or dailyPremiumVolume.","type":"string","enum":["dailyNotionalVolume","dailyPremiumVolume"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getProtocolOptionsVolume","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getProtocolOptionsVolume","description":"Get one options exchange's volume with its daily history","x-airnode-returns":{"id":"string","defillamaId":"string","name":"string","displayName":"string","slug":"string","url":"string","referralUrl":"string","description":"string","logo":"string","symbol":"string","address":"string","gecko_id":"string","cmcId":"string","twitter":"string","treasury":"string","chain":"string","chains":"array","module":"string","category":"string","protocolType":"string","methodologyURL":"string","methodology":"object","breakdownMethodology":"object","defaultChartView":"string","audits":"string","audit_links":"array","forkedFrom":"array","previousNames":"array","governanceID":"array","github":"array","tags":"array","hallmarks":"array","listedAt":"integer","tvlCodePath":"string","dimensions":"object","misrepresentedTokens":"boolean","doublecounted":"boolean","hasLabelBreakdown":"boolean","parentProtocol":"string","linkedProtocols":"array","childProtocols":"array","total24h":"number","total48hto24h":"number","total7d":"number","total14dto7d":"number","total30d":"number","total60dto30d":"number","total1y":"number","total7DaysAgo":"number","total30DaysAgo":"number","totalAllTime":"number","annualized1y":"number","average1y":"number","monthlyAverage1y":"number","change_1d":"number","change_7d":"number","change_1m":"number","change_7dover7d":"number","change_30dover30d":"number","totalDataChart":"array","totalDataChartBreakdown":"array","chainBreakdown":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["protocol"],"properties":{"protocol":{"description":"The protocol slug as the overview answers it, uniswap or uniswap-v3 for example.","type":"string"},"dataType":{"description":"Which figure every total and chart carries: dailyNotionalVolume, the default, or dailyPremiumVolume.","type":"string","enum":["dailyNotionalVolume","dailyPremiumVolume"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"listStablecoins","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"listStablecoins","description":"List every stablecoin with its circulating supply by chain","x-airnode-returns":{"peggedAssets":"array","chains":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"includePrices":{"description":"true to add each stablecoin's current price. Off by default.","type":"boolean"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getStablecoinChart","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getStablecoinChart","description":"Get the daily circulating supply of all stablecoins, or of one","x-airnode-returns":{"date":"string","totalCirculating":"object","totalCirculatingUSD":"object","totalUnreleased":"object","totalMintedUSD":"object","totalBridgedToUSD":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"stablecoin":{"description":"A stablecoin id from listStablecoins to narrow the series to one, 1 for Tether.","type":"integer"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getStablecoinChartByChain","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getStablecoinChartByChain","description":"Get the daily circulating supply of stablecoins on one chain","x-airnode-returns":{"date":"string","totalCirculating":"object","totalCirculatingUSD":"object","totalUnreleased":"object","totalMintedUSD":"object","totalBridgedToUSD":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["chain"],"properties":{"chain":{"description":"The chain name as listChains answers it, Ethereum or Tron for example.","type":"string"},"stablecoin":{"description":"A stablecoin id from listStablecoins to narrow the series to one, 1 for Tether.","type":"integer"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getStablecoin","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getStablecoin","description":"Get one stablecoin's supply history on every chain it circulates on","x-airnode-returns":{"id":"string","name":"string","symbol":"string","address":"string","url":"string","description":"string","mintRedeemDescription":"string","onCoinGecko":"string","gecko_id":"string","cmcId":"string","pegType":"string","pegMechanism":"string","priceSource":"string","auditLinks":"array","twitter":"string","wiki":"string","bridgeConfig":"object","chainBalances":"object","currentChainBalances":"object","price":"number","tokens":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["asset"],"properties":{"asset":{"description":"The stablecoin id as listStablecoins answers it, 1 for Tether.","type":"integer"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"listStablecoinChains","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"listStablecoinChains","description":"List every chain with the stablecoin supply circulating on it","x-airnode-returns":{"name":"string","totalCirculatingUSD":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getStablecoinPrices","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getStablecoinPrices","description":"Get the daily price of every stablecoin","x-airnode-returns":{"date":"integer","prices":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getCurrentPrices","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getCurrentPrices","description":"Get the current price of tokens by contract address or CoinGecko id","x-airnode-returns":{"coins":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["coins"],"properties":{"coins":{"description":"Comma-separated tokens written as chain:address, ethereum:0xdF574c24545E5FfEcb9a659c229253D4111d87e1 for example, or coingecko:id such as coingecko:ethereum to name a coin by its CoinGecko id.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getHistoricalPrices","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getHistoricalPrices","description":"Get the price of tokens at a past moment","x-airnode-returns":{"coins":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["timestamp","coins"],"properties":{"timestamp":{"description":"UNIX timestamp in seconds of the moment wanted.","type":"integer"},"coins":{"description":"Comma-separated tokens written as chain:address, ethereum:0xdF574c24545E5FfEcb9a659c229253D4111d87e1 for example, or coingecko:id such as coingecko:ethereum to name a coin by its CoinGecko id.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getFirstPrices","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getFirstPrices","description":"Get the earliest price DefiLlama holds for tokens","x-airnode-returns":{"coins":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["coins"],"properties":{"coins":{"description":"Comma-separated tokens written as chain:address, ethereum:0xdF574c24545E5FfEcb9a659c229253D4111d87e1 for example, or coingecko:id such as coingecko:ethereum to name a coin by its CoinGecko id.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getPriceChart","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getPriceChart","description":"Get token prices at regular intervals over a range","x-airnode-returns":{"coins":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["coins"],"properties":{"coins":{"description":"Comma-separated tokens written as chain:address, ethereum:0xdF574c24545E5FfEcb9a659c229253D4111d87e1 for example, or coingecko:id such as coingecko:ethereum to name a coin by its CoinGecko id.","type":"string"},"start":{"description":"UNIX timestamp in seconds of the earliest point wanted.","type":"integer"},"end":{"description":"UNIX timestamp in seconds of the latest point wanted, used in place of start.","type":"integer"},"span":{"description":"How many points to answer. Defaults to 0.","type":"integer"},"period":{"description":"The time between points in candle notation, 4h, 2d or 1w. Defaults to 24 hours.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getPriceChange","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getPriceChange","description":"Get the percentage price change of tokens over a period","x-airnode-returns":{"coins":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["coins"],"properties":{"coins":{"description":"Comma-separated tokens written as chain:address, ethereum:0xdF574c24545E5FfEcb9a659c229253D4111d87e1 for example, or coingecko:id such as coingecko:ethereum to name a coin by its CoinGecko id.","type":"string"},"timestamp":{"description":"UNIX timestamp in seconds of the point to measure from. Defaults to now.","type":"integer"},"lookForward":{"description":"true to measure the period after timestamp rather than before it.","type":"boolean"},"period":{"description":"The period in candle notation, 4h, 2d, 3w. Defaults to 24 hours.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getBlockAtTimestamp","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getBlockAtTimestamp","description":"Get the block closest to a timestamp on a chain","x-airnode-returns":{"height":"integer","timestamp":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["chain","timestamp"],"properties":{"chain":{"description":"The lowercase chain identifier, ethereum, bsc, polygon or arbitrum for example.","type":"string"},"timestamp":{"description":"UNIX timestamp in seconds of the moment wanted.","type":"integer"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"listYieldPools","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"listYieldPools","description":"List every yield pool with its APY, TVL and prediction","x-airnode-returns":{"status":"string","data":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"getYieldPoolChart","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"getYieldPoolChart","description":"Get the daily APY and TVL history of one pool","x-airnode-returns":{"status":"string","data":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["pool"],"properties":{"pool":{"description":"The pool id as listYieldPools answers it.","type":"string"}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}}]}}}},"responses":{"200":{"description":"The upstream response and the attestation over it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Attestation"}}}},"400":{"description":"The operation exists but the parameters or the projection are missing, unknown or malformed, or the projection names a path the response does not have."},"404":{"description":"No such operation."},"502":{"description":"The upstream API could not be reached or refused the request."}}}}},"components":{"schemas":{"Attestation":{"type":"object","required":["airnode","requestHash","timestamp","data","signature"],"properties":{"airnode":{"type":"string","description":"The address whose signature attests to this response."},"requestHash":{"type":"string","description":"Identifies the request this response answers."},"timestamp":{"type":"string","description":"Unix seconds at which the response was signed."},"data":{"description":"The upstream response body: the JSON value when it parses as JSON, the text as received otherwise. With a projection, an object keyed by the names it asked for."},"signature":{"type":"string","description":"The attestation itself."}}}}},"x-airnode":{"address":"0xd37276CC98eB045eea492C127dAc8A3A3D3FD1f1","version":"0.1.4","attestation":{"scheme":"eip191-secp256k1","digest":"keccak256(abi.encodePacked(bytes32 requestHash, uint256 timestamp, bytes dataBytes))","dataBytes":"UTF-8 of data, or of its compact JSON when data is not a string","requestHash":"keccak256(utf8(JSON.stringify([operation, parameterEntriesSortedByName]))), where an object value is itself entries sorted by name, at any depth, and an array keeps its order. A request that carries a projection appends its entries, sorted the same way, as a third element","verify":"Recover the signer of the signature over the digest and check it equals the address above."},"passthrough":{"url":"https://airnode-defillama.fly.dev/api","routes":{"listProtocols":{"method":"GET","path":"/protocols","parameters":{}},"getProtocol":{"method":"GET","path":"/protocol/{protocol}","parameters":{"protocol":"path"}},"getHistoricalChainTvl":{"method":"GET","path":"/v2/historicalChainTvl","parameters":{}},"getHistoricalChainTvlByChain":{"method":"GET","path":"/v2/historicalChainTvl/{chain}","parameters":{"chain":"path"}},"getProtocolTvl":{"method":"GET","path":"/tvl/{protocol}","parameters":{"protocol":"path"}},"listChains":{"method":"GET","path":"/v2/chains","parameters":{}},"getFeesOverview":{"method":"GET","path":"/overview/fees","parameters":{"excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query","dataType":"query"}},"getFeesOverviewByChain":{"method":"GET","path":"/overview/fees/{chain}","parameters":{"chain":"path","excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query","dataType":"query"}},"getProtocolFees":{"method":"GET","path":"/summary/fees/{protocol}","parameters":{"protocol":"path","dataType":"query"}},"getDexOverview":{"method":"GET","path":"/overview/dexs","parameters":{"excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query"}},"getDexOverviewByChain":{"method":"GET","path":"/overview/dexs/{chain}","parameters":{"chain":"path","excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query"}},"getProtocolDexVolume":{"method":"GET","path":"/summary/dexs/{protocol}","parameters":{"protocol":"path","excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query"}},"getOptionsOverview":{"method":"GET","path":"/overview/options","parameters":{"excludeTotalDataChart":"query","excludeTotalDataChartBreakdown":"query","dataType":"query"}},"getProtocolOptionsVolume":{"method":"GET","path":"/summary/options/{protocol}","parameters":{"protocol":"path","dataType":"query"}},"listStablecoins":{"method":"GET","path":"/stablecoins/stablecoins","parameters":{"includePrices":"query"}},"getStablecoinChart":{"method":"GET","path":"/stablecoins/stablecoincharts/all","parameters":{"stablecoin":"query"}},"getStablecoinChartByChain":{"method":"GET","path":"/stablecoins/stablecoincharts/{chain}","parameters":{"chain":"path","stablecoin":"query"}},"getStablecoin":{"method":"GET","path":"/stablecoins/stablecoin/{asset}","parameters":{"asset":"path"}},"listStablecoinChains":{"method":"GET","path":"/stablecoins/stablecoinchains","parameters":{}},"getStablecoinPrices":{"method":"GET","path":"/stablecoins/stablecoinprices","parameters":{}},"getCurrentPrices":{"method":"GET","path":"/coins/prices/current/{coins}","parameters":{"coins":"path"}},"getHistoricalPrices":{"method":"GET","path":"/coins/prices/historical/{timestamp}/{coins}","parameters":{"timestamp":"path","coins":"path"}},"getFirstPrices":{"method":"GET","path":"/coins/prices/first/{coins}","parameters":{"coins":"path"}},"getPriceChart":{"method":"GET","path":"/coins/chart/{coins}","parameters":{"coins":"path","start":"query","end":"query","span":"query","period":"query"}},"getPriceChange":{"method":"GET","path":"/coins/percentage/{coins}","parameters":{"coins":"path","timestamp":"query","lookForward":"query","period":"query"}},"getBlockAtTimestamp":{"method":"GET","path":"/coins/block/{chain}/{timestamp}","parameters":{"chain":"path","timestamp":"path"}},"listYieldPools":{"method":"GET","path":"/yields/pools","parameters":{}},"getYieldPoolChart":{"method":"GET","path":"/yields/chart/{pool}","parameters":{"pool":"path"}}},"parameters":{"x-airnode-sign":"false skips the signature: no attestation headers, and the body streamed through with no size cap.","x-airnode-project":"alias:pointer, once per field to keep, each pointer an RFC 6901 JSON Pointer into the upstream response. The body becomes an object of those aliases, the signature covers it, and a pointer the response does not have is a 400."},"flow":"Send the request the provider documents, method, path, query and body as they are, to url followed by the route's path. The body comes back as the upstream sent it, with the upstream's status, and on success the attestation is in the X-Airnode-Address, X-Airnode-Request-Hash, X-Airnode-Timestamp and X-Airnode-Signature headers, with the operation served in X-Airnode-Operation. Every query parameter starting with x-airnode- is this Airnode's own, listed under parameters, and never reaches the upstream.","requestHash":"keccak256(utf8(JSON.stringify([\"passthrough\", method, path, queryEntriesSortedByName, body]))), where method is upper case, path and query are what was sent after url with the Airnode's own parameters removed, and body is the request body as sent, or an empty string. A request that carries a projection appends its entries, sorted by name, as a sixth element","dataBytes":"UTF-8 of the response body exactly as received, or of the projected object as compact JSON"}}}