Skip to Content
docs

Aave V3 Market Data

Learn how to discover available markets and access detailed market information in Aave.

Market Structure

Aave market data describes lending pools across different chains:

  • Market identification (name, chain, address)
  • The reserves in the market
  • Efficiency Mode (E-Mode) categories and configurations
  • Market metrics (total size, available liquidity)

When you provide a user account address, the data also includes user-specific information such as net worth, health factor, and current positions.

The following TypeScript interfaces illustrate the core Market type and its related types:

interface Market {
  name: string;
  chain: Chain;
  address: EvmAddress;
  icon: string;
  totalMarketSize: BigDecimal;
  totalAvailableLiquidity: BigDecimal;
  eModeCategories: EmodeMarketCategory[];
  userState?: MarketUserState;
  borrowReserves: Reserve[];
  supplyReserves: Reserve[];
}

Reserve Structure

Each reserve within an Aave market describes the lending and borrowing data for a specific asset:

  • Token information (underlying, aToken, vToken addresses and metadata)
  • Supply information (APY, liquidity, caps, collateral configuration)
  • Borrow information (APY, available liquidity, utilization rates, caps)
  • Reserve incentives (Merit programs, Aave governance rewards)
  • Market mechanics (flash loans, permits, pause/freeze states)
  • Efficiency Mode (E-Mode) configurations for the asset
  • Isolation Mode settings Deprecated in Aave V3.7
  • User-specific state (balances, borrowable amounts, collateral usage)

When you provide a user account address, the reserve data also includes user-specific information such as current balances, borrowing capacity, and collateral status.

The following TypeScript interfaces and GraphQL fragments illustrate the core Reserve type and its related types:

interface Reserve {
  market: MarketInfo;
  underlyingToken: Currency;
  aToken: Currency;
  vToken: Currency;
  acceptsNative?: NativeCurrency;
  size: TokenAmount;
  usdExchangeRate: BigDecimal;
  usdOracleAddress: EvmAddress;
  isFrozen: boolean;
  isPaused: boolean;
  flashLoanEnabled: boolean;
  permitSupported: boolean;
  supplyInfo: ReserveSupplyInfo;
  borrowInfo?: ReserveBorrowInfo;
  isolationModeConfig?: ReserveIsolationModeConfig; // deprecated in Aave V3.7
  eModeInfo: EmodeReserveInfo[];
  incentives: ReserveIncentive[];
  userState?: ReserveUserState;
}

See Incentive Programs for details.

Listing Available Markets

Discover all available Aave markets across supported blockchain networks.

Use the useAaveMarkets hook in React, the markets action in TypeScript, or the markets query in GraphQL to fetch available markets across different chains.

In React, the useAaveMarkets hook supports both a loading state and React Suspense.

const { data, loading, error } = useAaveMarkets({
  chainIds: ChainId[],
  user: EvmAddress | undefined,
  borrowsOrderBy: MarketReservesRequestOrderBy | undefined,
  suppliesOrderBy: MarketReservesRequestOrderBy | undefined,
});

Specify one or more chains to retrieve markets for.

Ethereum Markets
import { useAaveMarkets, chainId } from "@aave/react";

// …

const { data, loading, error } = useAaveMarkets({
  chainIds: [chainId(1)],
});

if (loading) {
  return <p>Loading…</p>;
}

if (error) {
  return <p>{error.message}</p>;
}

// data: Market[]

Use a user address to include account-level data for each market and reserve. In GraphQL, set the optional user field shown in the query above.

With User State
import { useAaveMarkets, evmAddress, chainId } from "@aave/react";

const { data, loading, error } = useAaveMarkets({
  chainIds: [chainId(1)],
  user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
});

Fetching a Single Market

Retrieve detailed information about a specific market including reserves and user state.

Use the useAaveMarket hook in React, the market action in TypeScript, or the market query in GraphQL to fetch detailed information about a specific market.

In React, the useAaveMarket hook supports both a loading state and React Suspense.

const { data, loading, error } = useAaveMarket({
  address: EvmAddress,
  chainId: ChainId,
  user: EvmAddress | undefined,
  borrowsOrderBy: MarketReservesRequestOrderBy | undefined,
  suppliesOrderBy: MarketReservesRequestOrderBy | undefined,
});

Fetch a specific market by address and chain.

Ethereum Market
import { useAaveMarket, evmAddress, chainId } from "@aave/react";

// …

const { data, loading, error } = useAaveMarket({
  address: evmAddress("0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2"),
  chainId: chainId(1),
});

if (loading) {
  return <p>Loading market…</p>;
}

if (error) {
  return <p>Error: {error.message}</p>;
}

if (!data) {
  return <p>Market not found</p>;
}

// data: Market

Use a user address to include account-level data for the market and its reserves. In GraphQL, set the optional user field shown in the query above.

With User State
import { useAaveMarket, evmAddress, chainId } from "@aave/react";

// …

const { data, loading, error } = useAaveMarket({
  address: evmAddress("0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2"),
  chainId: chainId(1),
  user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
});

APY History

Retrieve historical APY data for reserves to analyze interest rate trends over time.

Use the useBorrowAPYHistory and useSupplyAPYHistory hooks in React, the borrowAPYHistory and supplyAPYHistory actions in TypeScript, or the borrowAPYHistory and supplyAPYHistory queries in GraphQL to fetch historical APY data for specific reserves.

In React, both hooks support a loading state and React Suspense.

const { data, loading, error } = useBorrowAPYHistory({
  chainId: ChainId,
  underlyingToken: EvmAddress,
  market: EvmAddress,
  window: TimeWindow,
});

const { data, loading, error } = useSupplyAPYHistory({
  chainId: ChainId,
  underlyingToken: EvmAddress,
  market: EvmAddress,
  window: TimeWindow,
});

Fetch borrow and supply APY history for a specific reserve over a given time window.

import {
  useBorrowAPYHistory,
  evmAddress,
  chainId,
  TimeWindow,
} from "@aave/react";

// …

const { data, loading, error } = useBorrowAPYHistory({
  chainId: chainId(1),
  underlyingToken: evmAddress("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), // USDC
  market: evmAddress("0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2"),
  window: TimeWindow.LastWeek,
});

if (loading) {
  return <p>Loading APY history…</p>;
}

if (error) {
  return <p>Error: {error.message}</p>;
}

// data: APYSample[]

Each returned APYSample contains:

  • avgRate: Average APY for the time period
  • date: Timestamp for the data point

Available time windows include (GraphQL enum value in parentheses):

  • TimeWindow.LastDay (LAST_DAY)
  • TimeWindow.LastWeek (LAST_WEEK)
  • TimeWindow.LastMonth (LAST_MONTH)
  • TimeWindow.LastSixMonths (LAST_SIX_MONTHS)
  • TimeWindow.LastYear (LAST_YEAR)