---
title: "Get migratable DeFi positions"
method: GET
path: "/positions/{address}"
tags: ["Utilities"]
---

# Get migratable DeFi positions

`GET /positions/{address}`

Returns the address's DeFi positions in one normalised shape, each carrying the largest amount that can actually be withdrawn right now. `maxWithdrawable` is capped against the venue's full withdraw validation — health factor (with a buffer above the liquidation edge), E-Mode thresholds, zero-LTV collateral, paused reserves and pool liquidity — so a client never asks a user to sign an exit the protocol would reject. Currently covers Aave v3 across every market on the deposit-enabled chains; a `failures` entry appears when a venue could not be reached, so an empty list is distinguishable from a failed lookup.

## Path parameters

- `address` string, required — EVM address holding the DeFi positions

## Headers

- `x-api-key` string, required — API key for authentication
- `x-api-version` string — API version identifier (e.g. "2026-04.amazon"). Optional today, will become required in a future release.

## Response `200`

Normalised DeFi positions

- PositionsResponse
  - `positions` object[], required
    - `venue` 'aave', required
    - `kind` 'lending', required
    - `market` object, required — Positions are keyed by market, not chain — Ethereum alone hosts four Aave v3 markets with distinct pools and risk params.
      - `address` string, required
      - `name` string, required
    - `chain` string, required — CAIP-2 chain id
    - `asset` object, required
      - `address` string, required
      - `symbol` string, required
      - `decimals` number, required
    - `amount` string, required — Supplied balance in base units, accrued interest included
    - `usdValue` number, required
    - `apy` number, required
    - `isCollateral` boolean, required
    - `maxWithdrawable` string, required — Largest amount withdrawable right now, in base units. Capped so the withdraw cannot be rejected on-chain.
    - `withdrawableUsd` number, required — USD value of `maxWithdrawable` — what would actually reach the deposit address, as opposed to `usdValue`, which prices the whole holding. Display this next to an amount you offer: it is also the figure this project's deposit floor is judged against, and re-deriving it from `usdValue` needs the amount ratio taken in integer space to survive an 18-decimal balance.
    - `isFullExit` boolean, required — True when the entire supplied balance can leave in one transaction
    - `constraints` string[], required
  - `totalUsd` number, required
  - `minDepositUsd` number, required — The USD floor the withdrawn proceeds must clear for this project, resolved from the platform minimum and the project's own `minDepositUsd`. Proceeds below it are rejected on ingest after the withdrawal has already happened.
  - `failures` object[] — Present only when a venue could not be reached, so an empty `positions` list can be told apart from a failed lookup.
    - `venue` string, required
    - `reason` string, required

## Other responses

- `400` — Invalid request, unauthorized, or the project is not configured for deposits
- `403` — API key lacks the required deposits scope

---

[API](https://skmtc.net/rhinestonewtf/apis/deposit-service-api.md) · [All operations](https://skmtc.net/rhinestonewtf/apis/deposit-service-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/rhinestonewtf/deposit-service-api/revisions/c9aa3f252e4f/schema)
