---
title: "Get bridge balances"
method: GET
path: "/v1/balances/bridge/{walletAddress}"
tags: ["Balances"]
---

# Get bridge balances

`GET /v1/balances/bridge/{walletAddress}`

Retrieves bridge balances for the specified wallet address.

**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).

## Path parameters

- `walletAddress` string, required

## Response `200`

Bridge balances retrieved successfully

- GetBridgeBalancesResponse
  - `walletAddress` string, required — Wallet address
  - `rebalancerAddress` string, required — Rebalancer contract address
  - `token` string, required — Token symbol
  - `balances` BridgeBalance[], required
    - `sourcePool` Pool — **Important: `poolAddress` is NOT globally unique across tokens.** For Aave V3, the same `poolAddress` (the Aave lending pool contract) is shared across all tokens on a given chain. For example, Aave V3 USDC, USDT, RLUSD, MUSD, USDG, USDE, and PYUSD on Ethereum all have the same `poolAddress`. A pool is uniquely identified by the combination of THREE fields together: - `poolAddress` - `chain` - `underlyingToken.symbol` When filtering pools by token (e.g. "show only USDC pools"), ALWAYS filter on `underlyingToken.symbol`. Never filter on `poolAddress` alone for Aave pools.
      - `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).
    - `destinationPool` Pool, required — **Important: `poolAddress` is NOT globally unique across tokens.** For Aave V3, the same `poolAddress` (the Aave lending pool contract) is shared across all tokens on a given chain. For example, Aave V3 USDC, USDT, RLUSD, MUSD, USDG, USDE, and PYUSD on Ethereum all have the same `poolAddress`. A pool is uniquely identified by the combination of THREE fields together: - `poolAddress` - `chain` - `underlyingToken.symbol` When filtering pools by token (e.g. "show only USDC pools"), ALWAYS filter on `underlyingToken.symbol`. Never filter on `poolAddress` alone for Aave pools.
      - `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).
    - `balanceRaw` string, required — Balance in raw units
    - `balanceFormatted` string, required — Balance formatted
    - `estimatedCompletion` string, required — Estimated completion timestamp or duration
    - `estimatedCompletionTimestamp` integer, required — Estimated completion as Unix timestamp (seconds)
    - `isForSpending` boolean, required — Whether the balance is reserved for spending

## Other responses

- `400` — Validation error
- `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 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)
