Get Data
Before Starting
In this tutorial, you'll see three main ways to fetch data for Morpho Markets:
- API: Using the Morpho public API. This is the easiest and most direct way to get comprehensive, indexed data for most applications.
- Smart Contract: Fetching data directly onchain using read functions (or offchain via libraries like Viem). This is best for real-time, trustless data needed within other smart contracts or sensitive applications.
- SDK: Using the Morpho SDKs for pre-built abstractions that handle complex calculations (like interest accrual) and simplify development.
For each topic below, you'll find guides for each method where applicable. This structure helps you choose the best approach for your specific use case.
Discovery and Listing
Markets List
Quickly retrieve a list of all markets or filter for specific ones, like those whitelisted for incentives.
query {
markets {
items {
uniqueKey
lltv
oracleAddress
irmAddress
loanAsset {
address
symbol
decimals
}
collateralAsset {
address
symbol
decimals
}
state {
borrowAssets
supplyAssets
fee
utilization
}
}
}
}query {
markets(where: { whitelisted: true }) {
items {
uniqueKey
whitelisted
lltv
oracleAddress
irmAddress
loanAsset {
address
symbol
decimals
}
collateralAsset {
address
symbol
decimals
}
state {
borrowAssets
supplyAssets
fee
utilization
}
}
}
}Market Parameters
Fetch the core, immutable parameters for one or more markets.
query {
markets(
first: 100
orderBy: SupplyAssetsUsd
orderDirection: Desc
where: { chainId_in: [1, 8453] }
) {
items {
uniqueKey
loanAsset { address }
collateralAsset { address }
lltv
irmAddress
oracleAddress
}
}
}query {
marketByUniqueKey(
uniqueKey: "0x9103c3b4e834476c9a62ea009ba2c884ee42e94e6e314a26f04d312434191836"
chainId: 8453
) {
uniqueKey
loanAsset { address }
collateralAsset { address }
lltv
irmAddress
oracleAddress
}
}Market Metrics
Total Collateral, Borrow & Supply
Get the real-time state of liquidity and debt in a market.
query {
markets(
first: 100
orderBy: SupplyAssetsUsd
orderDirection: Desc
where: { chainId_in: [1, 8453] }
) {
items {
uniqueKey
state {
collateralAssets
collateralAssetsUsd
borrowAssets
borrowAssetsUsd
supplyAssets
supplyAssetsUsd
liquidityAssets
liquidityAssetsUsd
}
}
}
}query {
marketByUniqueKey(
uniqueKey: "0x9103c3b4e834476c9a62ea009ba2c884ee42e94e6e314a26f04d312434191836"
chainId: 8453
) {
state {
collateralAssets
borrowAssets
supplyAssets
liquidityAssets
}
}
}Market APY (Native & Rewards)
Get the real-time APY, interest rates, and accrual information for markets.
query {
markets(
first: 100
orderBy: SupplyAssetsUsd
orderDirection: Desc
where: { chainId_in: [1, 8453] }
) {
items {
uniqueKey
state {
borrowApy
avgBorrowApy
avgNetBorrowApy
supplyApy
avgSupplyApy
avgNetSupplyApy
rewards {
asset {
address
chain {
id
}
}
supplyApr
borrowApr
}
}
}
}
}query {
marketByUniqueKey(
uniqueKey: "0x9103c3b4e834476c9a62ea009ba2c884ee42e94e6e314a26f04d312434191836"
chainId: 8453
) {
state {
borrowApy
avgBorrowApy
avgNetBorrowApy
supplyApy
avgSupplyApy
avgNetSupplyApy
rewards {
supplyApr
borrowApr
}
}
}
}Interactive Interest Rate Visualization
Understanding how the AdaptiveCurveIRM works in practice is crucial for developers integrating with Morpho Markets. This section provides a hands-on guide to implementing and visualizing the interest rate model calculations.
The Morpho protocol uses a kinked interest rate model (IRM) with a target utilization of 90%.

Below you'll find three approaches to working with this model: using the API, implementing it yourself, or understanding the mathematical foundation.
The easiest way to display the interest rate model is to use the Morpho API, which provides pre-calculated curve data with 101 data points (0% to 100% utilization).
Step 1: Query the GraphQL Endpoint
query GetMarketIrmCurve($uniqueKey: String!, $chainId: Int!) {
marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
id
irmAddress
state {
id
utilization
}
currentIrmCurve {
utilization
supplyApy
borrowApy
}
}
}API Endpoint: api.morpho.org/graphql
This endpoint returns:
- Market identification data
- Current utilization state
- Pre-calculated interest rate curve with 101 data points
Step 2: Integrate with Frontend Component
const ChartInterestRateModelClient = ({ queryResult }) => {
const marketData = queryResult?.data?.marketByUniqueKey;
const shouldShowNoDataError = useMemo(
() =>
marketData?.currentIrmCurve?.length === 0 ||
marketData?.irmAddress === undefined,
[marketData?.currentIrmCurve?.length, marketData?.irmAddress]
);
return (
<Card padding="s" grow={1}>
<InterestRateModelChart
statuses={{
loading: false,
error: shouldShowNoDataError,
}}
height="288px"
data={marketData?.currentIrmCurve}
irmAddress={marketData?.irmAddress}
utilization={marketData?.state?.utilization ?? 0}
/>
</Card>
);
};- No need to implement rate calculations
- Pre-calculated data optimized for visualization
- Always up-to-date with latest protocol parameters
- Minimal code required for integration
Asset Information
Assets
Get metadata and pricing for specific tokens.
query GetAssetsWithPrice {
assets(where: { symbol_in: ["wstETH", "WETH"], chainId_in: [1] }) {
items {
symbol
address
priceUsd
chain {
id
network
}
}
}
}Position Tracking
User Position on Market
query {
marketPositions(
first: 10,
orderBy: BorrowAssetsUsd,
orderDirection: Desc
where: {
marketUniqueKey_in: ["0x698fe98247a40c5771537b5786b2f3f9d78eb487b4ce4d75533cd0e94d88a115"]
}
) {
items {
user { address }
state {
collateral
borrowAssets
borrowAssetsUsd
}
}
}
}All Market Positions
query {
marketPositions(
first: 10
orderBy: SupplyShares
orderDirection: Desc
where: {
marketUniqueKey_in: [
"0x698fe98247a40c5771537b5786b2f3f9d78eb487b4ce4d75533cd0e94d88a115"
]
}
) {
items {
market {
uniqueKey
loanAsset {
address
symbol
}
collateralAsset {
address
symbol
}
}
user {
address
}
state {
supplyShares
supplyAssets
supplyAssetsUsd
borrowShares
borrowAssets
borrowAssetsUsd
collateral
collateralUsd
}
}
}
}Risk & Oracle Data
Oracle Data
query MARKETS_PARAMS {
markets(
first: 100
orderBy: SupplyAssetsUsd
orderDirection: Desc
where: { chainId_in: [1, 8453] }
) {
items {
uniqueKey
oracleAddress
oracle {
address
type
creationEvent {
txHash
timestamp
blockNumber
}
data {
... on MorphoChainlinkOracleV2Data {
baseFeedOne {
address
description
vendor
pair
}
baseFeedTwo {
address
}
baseVaultConversionSample
quoteFeedOne {
address
}
quoteFeedTwo {
address
}
quoteVaultConversionSample
}
... on MorphoChainlinkOracleData {
baseFeedOne {
address
description
vendor
pair
}
baseOracleVault {
address
}
}
}
}
oracleInfo {
type
}
}
}
}query {
marketByUniqueKey(
uniqueKey: "0x9103c3b4e834476c9a62ea009ba2c884ee42e94e6e314a26f04d312434191836"
chainId: 8453
) {
uniqueKey
oracleAddress
oracle {
address
type
creationEvent {
txHash
timestamp
blockNumber
}
data {
... on MorphoChainlinkOracleV2Data {
baseFeedOne {
address
description
vendor
pair
}
baseFeedTwo {
address
}
baseVaultConversionSample
quoteFeedOne {
address
}
quoteFeedTwo {
address
}
quoteVaultConversionSample
}
... on MorphoChainlinkOracleData {
baseFeedOne {
address
description
vendor
pair
}
baseOracleVault {
address
}
}
}
}
oracleInfo {
type
}
}
}Liquidations
query {
transactions(
where: {
marketUniqueKey_in: [
"0x49bb2d114be9041a787432952927f6f144f05ad3e83196a7d062f374ee11d0ee"
"0x093d5b432aace8bf6c4d67494f4ac2542a499571ff7a1bcc9f8778f3200d457d"
]
type_in: [MarketLiquidation]
}
) {
items {
blockNumber
hash
type
user {
address
}
data {
... on MarketLiquidationTransactionData {
seizedAssets
repaidAssets
seizedAssetsUsd
repaidAssetsUsd
badDebtAssetsUsd
liquidator
market {
uniqueKey
}
}
}
}
}
}Market Warnings
Warning type can be:
unrecognized_collateral_asset: The collateral asset used in the market is not a part of the recognized token listunrecognized_oracle: The oracle used in the market is not recognizedunrecognized_loan_asset: The loan asset used in the market is not a part of our recognized token listbad_debt_unrealized& RED level: This market has significant unrealized bad debt (>25 BPS total supply)bad_debt_unrealized& YELLOW level: This market has some unrealized bad debt (>$10k)bad_debt_realized: This market has some realized bad debt (>10 BPS of total supply)
Warning level is either:
- YELLOW
- RED
query {
markets {
items {
uniqueKey
warnings {
type
level
}
}
}
}Integration
Vault Listing
The following query corresponds to which vault has this market in its supply queue
query {
marketByUniqueKey(
uniqueKey: "0x9103c3b4e834476c9a62ea009ba2c884ee42e94e6e314a26f04d312434191836"
chainId: 8453
) {
uniqueKey
supplyingVaults {
address
symbol
metadata {
description
}
}
}
}Historical Data
The historicalState allows to get historical data for certain queries. The queries need to be backfilled to return proper data (i.e. the historical data needs to be indexed and stored). Some queries are not backfilled and are flagged as deprecated in the Morpho API sandbox.
Available options when using an historicalState query:
startTimestamp: beginning of the historical data in UNIX timestamp format,endTimestamp: end of the historical data in UNIX timestamp format,interval: interval of the historical data points (YEAR,QUARTER,MONTH,WEEK,DAY,HOUR).
Inputting these options is not mandatory but it is advised to specify them to control the specific data returned.
If no options are specified, the default values will be:
startTimestamp: 0,endTimestamp: infinity,interval: will adjust according tostartTimestampandendTimestampto return around 50 data points.
Historical APYs
The example below mirrors the structure shown in the Morpho API sandbox, so you can copy/paste it directly when testing queries.
query MarketByUniqueKey($uniqueKey: String!, $options: TimeseriesOptions) {
marketByUniqueKey(uniqueKey: $uniqueKey) {
historicalState {
supplyApy(options: $options) {
x
y
}
borrowApy(options: $options) {
x
y
}
}
}
}with the following variables
{
"uniqueKey": "0x608929d6de2a10bacf1046ff157ae38df5b9f466fb89413211efb8f63c63833a",
"options": {
"startTimestamp": 1707749700,
"endTimestamp": 1708354500,
"interval": "HOUR"
}
}Historical Market States
query MarketApys($options: TimeseriesOptions) {
marketByUniqueKey(
uniqueKey: "0x608929d6de2a10bacf1046ff157ae38df5b9f466fb89413211efb8f63c63833a"
) {
uniqueKey
historicalState {
supplyAssetsUsd(options: $options) {
x
y
}
borrowAssetsUsd(options: $options) {
x
y
}
}
}
}Historical Asset Price
query {
wstETHWeeklyPriceUsd: assetByAddress(
address: "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0"
chainId: 1
) {
historicalPriceUsd(
options: {
startTimestamp: 1707749700
endTimestamp: 1708354500
interval: HOUR
}
) {
x
y
}
}
}