---
title: "Get pools information"
method: GET
path: "/v1/pools"
tags: ["Pools"]
---

# Get pools information

`GET /v1/pools`

Retrieves comprehensive information about supported DeFi protocols, pools, Total Value Locked (TVL), and Annual Percentage Yield (APY) data on supported networks.<br><br>

The response is a flat list of pools across supported protocols (Aave, Morpho, Euler) and tokens (USDC, MUSD, USDT, RLUSD, USDG, USDE, PYUSD). Each pool includes protocol metadata, pool address/name, underlying token details, TVL, liquidity, collateral exposure, APY breakdowns, signing metadata, and blacklist status.<br><br>

**APY Information**: The APY data includes native lending rates, reward provider APYs (e.g., MERKLE, BREVIS), and total combined APY. All APY values are formatted to 2 decimal places and represent 7-day average market rates adjusted by fees.<br><br>

**Aave pool address collision example**: On Ethereum, the following pools
all share `poolAddress: "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2"`:
- Aave V3 USDC (underlyingToken.symbol: "USDC")
- Aave V3 USDT (underlyingToken.symbol: "USDT")
- Aave V3 RLUSD (underlyingToken.symbol: "RLUSD")
- Aave V3 MUSD (underlyingToken.symbol: "MUSD")
- Aave V3 USDG (underlyingToken.symbol: "USDG")
- Aave V3 USDE (underlyingToken.symbol: "USDE")
- Aave V3 PYUSD (underlyingToken.symbol: "PYUSD")

When rendering a token-specific pool list, filter by `underlyingToken.symbol`,
not by `poolAddress`.

This endpoint requires an API key and can be used to discover available investment opportunities before configuring a rebalancer or making deposits.

**Rate limiting**: 1 request per 3 seconds per client IP. Excess requests receive HTTP `429` with `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers (see `RateLimitExceeded` response).

## Response `200`

Pools information retrieved successfully

- GetPoolsResponse
  - `pools` Pool[], required
    - `protocolName` string, required — Protocol name
    - `protocolVersion` string, required — Protocol version
    - `protocolDescription` string, required — Protocol description
    - `protocolUrl` string, uri, required — Protocol website URL
    - `poolAddress` string, required — Pool contract address. The pool contract address. For Aave V3 pools, this is the Aave lending pool contract address, which is the SAME for all tokens (USDC, USDT, RLUSD, MUSD, USDG, USDE, PYUSD) on a given chain. Do NOT use this field alone as a unique pool identifier — it must always be combined with `chain` and `underlyingToken.symbol`. For Morpho and Euler, this address IS unique per pool
    - `poolName` string, required — Pool name
    - `chain` string, required — Chain name
    - `chainId` integer, required — Chain ID
    - `underlyingToken` Token, required
      - `symbol` 'USDC' | 'MUSD' | 'USDT' | 'RLUSD' | 'USDG' | 'USDE' | 'PYUSD', required — Token symbol
      - `name` string, required — Token full name
      - `address` string, required — Token contract address
      - `decimals` integer, required — Token decimals
      - `version` string, nullable — Token contract version
    - `poolTvl` string, required — Total Value Locked for the pool
    - `poolLiquidity` string, required — Available liquidity for the pool
    - `collateralExposure` object, nullable — Collateral exposure for the pool. Keys are Morpho market identifiers, values are the collateral token symbols for each market. Null for non-Morpho pools (Aave, Euler).
    - `poolApy` PoolApyInfo, required
      - `native` string, required — Native APY percentage (formatted to 2 decimals)
      - `rewards` object, required — Map of reward tokens to their APYs (formatted to 2 decimals)
      - `total` string, required — Total APY percentage (formatted to 2 decimals)
      - `totalNet` string, required — Total net APY percentage (formatted to 2 decimals)
      - `performanceFee` string, required — Performance fee percentage (formatted to 2 decimals)
    - `signData` PoolSignData, required
      - `protocolId` integer, required — Protocol ID (0=Aave, 1=Morpho, 2=Euler)
      - `poolAddress` string, required — Pool contract address
      - `domainId` integer, required — Domain ID for the chain
    - `blacklisted` boolean, required — Indicates whether the pool has been blacklisted (banned) due to a third party critical security issue. Blacklisted pools are deprecated and retained solely for backwards compatibility. New deposits are never routed to blacklisted pools, and all existing balances are automatically rebalanced out of such pools when possible (balance is large enough to pay on-behalf fee and there is enough liquidity to withdraw).

## Other responses

- `401` — No authorization header provided
- `429` — Too many requests for this endpoint. Limits are enforced per client IP for the public API routes backed by `RebalancerResource` (and related resources using the same filter). Response headers (when throttled): - `Retry-After`: seconds to wait before retrying (matches the rate-limit window duration for that endpoint). - `X-RateLimit-Limit`: maximum requests allowed in the window (e.g. `1`). - `X-RateLimit-Remaining`: remaining requests in the window (`0` when throttled). - `X-RateLimit-Reset`: Unix timestamp (seconds) when the limit window resets. `internalCode` in the JSON body is `THROTTLE_PER_IP` for IP-scoped limits (other values may apply for different scopes in the backend).
- `500` — Internal server error

---

[API](https://skmtc.net/metalend/apis/metalend-rebalancing-api.md) · [All operations](https://skmtc.net/metalend/apis/metalend-rebalancing-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/metalend/metalend-rebalancing-api/versions/1b9900a9e91e/schema)
