Morpho Vaults
For enterprise access, use https://private.api.morpho.org as the base URL and send your API key in the x-api-key header. Request an API key.
How to query Morpho Vaults Data thanks to the API?
Each example below is available as REST (selected by default) or GraphQL — use the tabs to switch.
- REST calls use public
GETrequests againsthttps://api.morpho.orgwith standard public rate limits. Entities are addressed by a<chainId>:<address>selector (e.g.1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB). REST returns single-entity reads — config, state, APY, allocation history, and positions; there are no list endpoints, so enumeration/discovery, USD-denominated values, and reward APRs come from GraphQL. - GraphQL queries run against the Playground at https://api.morpho.org/graphql — paste any query below and run it.
Discovery and Listing
Vaults List
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB" \
-H "accept: application/json"REST fetches one vault at a time by <chainId>:<address>; discovering or enumerating vaults is GraphQL-only.
query {
vaultV2s(first: 1000, where: { chainId_in: [1, 8453] }) {
items {
address
symbol
name
listed
asset {
id
address
decimals
}
chain {
id
network
}
}
}
}query {
vaults(first: 1000, where: { chainId_in: [1, 8453] }) {
items {
address
symbol
name
listed
asset {
id
address
decimals
}
chain {
id
network
}
}
}
}Vault Metrics
Total Deposits & Assets
All Vaults
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/state" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/state" \
-H "accept: application/json"REST returns one vault's totals — there is no list endpoint, so enumerate via GraphQL. USD-denominated values are GraphQL-only.
query {
vaultV2s(first: 100) {
items {
address
totalAssets
totalAssetsUsd
totalSupply
liquidityUsd
idleAssetsUsd
}
}
}query {
vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
state {
totalAssets
totalAssetsUsd
totalSupply
}
}
}
}Specific Vault
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/state" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/state" \
-H "accept: application/json"Returns total_assets, total_supply, and withdrawable_assets; V2 also returns allocated_assets and idle_assets. USD-denominated values are GraphQL-only.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
address
totalAssets
totalAssetsUsd
totalSupply
liquidity
liquidityUsd
idleAssetsUsd
}
}query {
vaultByAddress(
address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
chainId: 1
) {
address
state {
totalAssets
totalAssetsUsd
totalSupply
}
liquidity {
underlying
usd
}
}
}APY (Native + Rewards)
All Vaults
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/apy" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/apy" \
-H "accept: application/json"/apy returns the instant net apy (post-fee, excluding rewards); for realized trailing averages use /v0/vaults-v1/{sel}/apy-averages?lookback= (V1) or /v1/vaults-v2/{sel}/apy-averages?lookback= (V2). REST is per-vault; enumeration and reward APRs are GraphQL-only.
query {
vaultV2s(first: 10) {
items {
address
asset {
yield {
apr
}
}
avgNetApyExcludingRewards
avgNetApy
performanceFee
managementFee
maxRate
rewards {
asset {
address
chain {
id
}
}
supplyApr
}
}
}
}
query {
vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
asset {
yield {
apr
}
}
state {
apy
netApy
netApyExcludingRewards
avgNetApyExcludingRewards
avgNetApy
dailyApy: avgNetApyExcludingRewards(lookback: ONE_DAY)
dailyNetApy: avgNetApy(lookback: ONE_DAY)
weeklyApy: avgNetApyExcludingRewards(lookback: SEVEN_DAYS)
weeklyNetApy: avgNetApy(lookback: SEVEN_DAYS)
monthlyApy: avgNetApyExcludingRewards(lookback: THIRTY_DAYS)
monthlyNetApy: avgNetApy(lookback: THIRTY_DAYS)
allRewards {
asset {
address
chain {
id
}
}
supplyApr
}
allocation {
supplyAssets
supplyAssetsUsd
market {
marketId
state {
rewards {
asset {
address
chain {
id
}
}
supplyApr
borrowApr
}
}
}
}
}
}
}
}Specific Vault
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/apy" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/apy" \
-H "accept: application/json"/apy returns the instantaneous net apy (post-fee, excluding rewards) and rate_per_second_wad. For realized trailing averages use /v0/vaults-v1/{sel}/apy-averages (V1) or /v1/vaults-v2/{sel}/apy-averages (V2) with ?lookback=<one_hour|six_hours|one_day|seven_days|thirty_days|ninety_days|one_year|inception>. Reward APRs and per-market allocation breakdowns are GraphQL-only.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
address
asset {
yield {
apr
}
}
avgNetApyExcludingRewards
avgNetApy
performanceFee
managementFee
maxRate
rewards {
asset {
address
chain {
id
}
}
supplyApr
}
}
}query {
vaultByAddress(
address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
chainId: 1
) {
address
asset {
yield {
apr
}
}
state {
apy
netApy
netApyExcludingRewards
avgNetApyExcludingRewards
avgNetApy
dailyApy: avgNetApyExcludingRewards(lookback: ONE_DAY)
dailyNetApy: avgNetApy(lookback: ONE_DAY)
weeklyApy: avgNetApyExcludingRewards(lookback: SEVEN_DAYS)
weeklyNetApy: avgNetApy(lookback: SEVEN_DAYS)
monthlyApy: avgNetApyExcludingRewards(lookback: THIRTY_DAYS)
monthlyNetApy: avgNetApy(lookback: THIRTY_DAYS)
allRewards {
asset {
address
chain {
id
}
}
supplyApr
}
allocation {
supplyAssets
supplyAssetsUsd
market {
marketId
state {
rewards {
asset {
address
chain {
id
}
}
supplyApr
borrowApr
}
}
}
}
}
}
}Share Price (Token Value)
All Vaults
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/state" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/state" \
-H "accept: application/json"/state returns share_price_ray — the normalized share price scaled by RAY (1e27), i.e. one whole share quoted in whole underlying tokens. Enumeration and USD-denominated share price are GraphQL-only.
query {
vaultV2s(first: 10) {
items {
address
totalSupply
totalAssets
sharePrice
}
}
}query {
vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
state {
sharePriceNumber
sharePriceUsd
}
}
}
}Specific Vault
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/state" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/state" \
-H "accept: application/json"/state returns share_price_ray — the normalized share price scaled by RAY (1e27), i.e. one whole share quoted in whole underlying tokens. USD-denominated share price is GraphQL-only.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
totalAssets
totalSupply
sharePrice
}
}query {
vaultByAddress(
address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
chainId: 1
) {
address
state {
sharePriceNumber
sharePriceUsd
}
}
}Configuration & Curation
Vault Parameters
All Vaults
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB" \
-H "accept: application/json"Returns the core on-chain config (owner, curator, timelock_seconds, fees; V1 adds guardian; V2 adds adapter_registry, liquidity_adapter, gates). The allocators list, curator metadata, listed status, free-form metadata, and enumeration are GraphQL-only.
query {
vaultV2s(first: 10) {
items {
address
name
listed
metadata {
description
image
}
allocators {
allocator {
address
}
}
owner {
address
}
curators {
items {
addresses {
address
}
}
}
sentinels {
sentinel {
address
}
}
timelocks {
duration
selector
functionName
}
}
}
}query {
vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
name
listed
metadata {
description
}
allocators {
address
}
state {
owner
curator
guardian
timelock
curators {
name
socials {
type
url
}
image
}
}
}
}
}Specific Vault
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB" \
-H "accept: application/json"Returns the core on-chain config: owner, curator, timelock_seconds, and fee setup (V1 adds guardian; V2 adds adapter_registry, liquidity_adapter, and gates). The allocators list, curator metadata, sentinels, listed status, and free-form metadata (description/image) are GraphQL-only.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
address
name
listed
metadata {
description
image
}
allocators {
allocator {
address
}
}
owner {
address
}
curators {
items {
addresses {
address
}
}
}
sentinels {
sentinel {
address
}
}
timelocks {
duration
selector
functionName
}
}
}query {
vaultByAddress(
address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
chainId: 1
) {
address
name
listed
metadata {
description
}
allocators {
address
}
state {
owner
curator
guardian
timelock
curators {
name
socials {
type
url
}
image
}
}
}
}Roles: Allocators & Sentinels
# Vault config
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145" \
-H "accept: application/json"
# Allocators
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/allocators" \
-H "accept: application/json"
# Sentinels
curl -sS "https://api.morpho.org/v1/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/sentinels" \
-H "accept: application/json"/allocators and /sentinels are cursor-paginated (cursor, default limit=100, max 1000) and return data[].address plus data[].tx_hash of the most recent role grant.
# Vault config
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB" \
-H "accept: application/json"
# Allocators
curl -sS "https://api.morpho.org/v1/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/allocators" \
-H "accept: application/json"/allocators is cursor-paginated (cursor, default limit=100, max 1000) and returns data[].address plus data[].tx_hash of the most recent role grant. Morpho Vaults V1 has no sentinel role.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
address
name
allocators {
allocator {
address
}
}
sentinels {
sentinel {
address
}
}
}
}query {
vaultByAddress(
address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
chainId: 1
) {
address
name
allocators {
address
}
}
}Fee Wrapper
A Fee Wrapper is a Vault V2 configured in a specific, constrained mode that enables distribution channels to add a fee layer on top of an existing Morpho Vault V2.
FeeWrapper List
curl -sS "https://api.morpho.org/v0/vaults-v2/8453:0xd4468EF3745c315949a97090eD27b3F73b9b7C02" \
-H "accept: application/json"A fee wrapper is a Vault V2 — read it by <chainId>:<address> via the V2 endpoint. Listing all fee wrappers (filter by type) is GraphQL-only.
query VaultV2ByAddress {
vaultV2ByAddress(
address: "0xd4468EF3745c315949a97090eD27b3F73b9b7C02"
chainId: 8453
) {
type
address
name
}
}query VaultV2s {
vaultV2s(skip: 0, first: 20, where: { type_in: [FeeWrapper] }) {
items {
address
name
}
}
}FeeWrapper Yield
# Config (performance / management fee setup)
curl -sS "https://api.morpho.org/v0/vaults-v2/8453:0xd4468EF3745c315949a97090eD27b3F73b9b7C02" \
-H "accept: application/json"
# APY (instant net APY)
curl -sS "https://api.morpho.org/v0/vaults-v2/8453:0xd4468EF3745c315949a97090eD27b3F73b9b7C02/apy" \
-H "accept: application/json"The config route (GET /v0/vaults-v2/{selector}) returns performance_fee_wad, performance_fee_recipient, management_fee_wad, and management_fee_recipient; /apy returns the instant net APY. Reward APRs and historical share price are GraphQL-only.
query VaultV2ByAddress {
vaultV2ByAddress(
address: "0xd4468EF3745c315949a97090eD27b3F73b9b7C02"
chainId: 8453
) {
type
apy
avgNetApyExcludingRewards
avgNetApy
performanceFee
performanceFeeRecipient
managementFee
managementFeeRecipient
rewards {
asset {
symbol
address
}
supplyApr
}
}
}query VaultV2s {
vaultV2s(skip: 0, first: 20, where: { type_in: [FeeWrapper] }) {
items {
type
address
apy
avgNetApyExcludingRewards
avgNetApy
performanceFee
performanceFeeRecipient
managementFee
managementFeeRecipient
rewards {
asset {
symbol
address
}
supplyApr
}
}
}
}Position Tracking
Vault Depositors
Specific Vault
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"REST returns a single user's position in a vault; the full depositor list is GraphQL-only.
query {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
positions(first: 10, skip:0) {
items {
user {
address
}
assets
assetsUsd
shares
}
}
totalSupply
asset {
address
symbol
}
}
}
query {
vaultPositions(
first: 10
orderBy: Shares
orderDirection: Desc
where: { vaultAddress_in: ["0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"] }
) {
items {
user {
address
}
state {
shares
assets
assetsUsd
}
}
}
}Set of Vaults
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"REST reads one (vault, user) position per request; querying a set of vaults at once is GraphQL-only.
query {
vaultV2s(
first: 10
where: {
chainId_in: [1]
address_in: [
"0xb576765fB15505433aF24FEe2c0325895C559FB2"
"0x6dC58a0FdfC8D694e571DC59B9A52EEEa780E6bf"
]
}
) {
items {
address
name
positions(first: 10, skip: 0) {
items {
user {
address
}
assets
assetsUsd
shares
}
pageInfo {
count
countTotal
skip
limit
}
}
}
pageInfo {
count
countTotal
skip
limit
}
}
}query {
vaultPositions(
first: 10
orderBy: Shares
orderDirection: Desc
where: {
vaultAddress_in: [
"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
"0x73e65DBD630f90604062f6E02fAb9138e713edD9"
]
}
) {
items {
vault {
address
}
user {
address
}
state {
shares
assets
assetsUsd
}
}
}
}User Positions
User All Vaults Position
# Vault V2 position
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"
# Vault V1 position
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"REST reads one vault position at a time; the aggregate across every vault a user holds is GraphQL-only.
query GetUserVaultPositions($address: String!, $chainId: Int!) {
userByAddress(address: $address, chainId: $chainId) {
address
chain {
id
}
vaultV2Positions {
shares
vault {
address
symbol
}
}
vaultPositions {
state {
shares
}
vault {
address
symbol
}
}
}
}Query Variables example:
{
"address": "USER_ADDRESS",
"chainId": 8453
}User Market Position
# Vault V2 position
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0x821880a3E2bac432d67E5155e72BB655Ef65fa5E/position" \
-H "accept: application/json"
# Vault V1 position
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0x821880a3E2bac432d67E5155e72BB655Ef65fa5E/position" \
-H "accept: application/json"REST reads one position at a time (per vault, per market, per user); the combined cross-vault/cross-market overview and transaction history are GraphQL-only.
query {
userByAddress(
chainId: 1
address: "0x821880a3E2bac432d67E5155e72BB655Ef65fa5E"
) {
address
marketPositions {
market {
marketId
}
state {
borrowAssets
borrowAssetsUsd
supplyAssets
supplyAssetsUsd
}
}
vaultPositions {
vault {
address
name
}
state {
assets
assetsUsd
shares
}
}
vaultV2Positions {
vault {
address
name
}
assets
assetsUsd
shares
}
}
vaultV1Transactions(
first: 10
orderBy: Time
orderDirection: Desc
where: {
userAddress_in: ["0x821880a3E2bac432d67E5155e72BB655Ef65fa5E"]
chainId_in: [1]
}
) {
items {
txHash
timestamp
type
}
}
marketTransactions(
first: 10
orderBy: Timestamp
orderDirection: Desc
where: {
userAddress_in: ["0x821880a3E2bac432d67E5155e72BB655Ef65fa5E"]
chainId_in: [1]
}
) {
items {
txHash
timestamp
type
}
}
vaultV2transactions(
first: 10
orderBy: Time
orderDirection: Desc
where: {
userAddress_in: ["0x821880a3E2bac432d67E5155e72BB655Ef65fa5E"]
chainId_in: [1]
}
) {
items {
txHash
timestamp
type
shares
assets
vault {
address
name
}
}
}
}User Earnings
Earnings Across All Vaults
# Vault V2 performance
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position/performance" \
-H "accept: application/json"
# Vault V1 performance
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position/performance" \
-H "accept: application/json"/position/performance returns per-vault net_earnings_assets (≈ pnl) and return_on_capital (≈ roe); the aggregate across all vaults is GraphQL-only.
query {
userByAddress(address: "USERADDRESS", chainId: 1) {
vaultV2Positions {
vault {
name
address
}
assets
assetsUsd
shares
pnl
pnlUsd
roe # time-weighted return since inception (non-annualized)
}
vaultPositions {
vault {
name
address
}
state {
assets
assetsUsd
shares
pnl
pnlUsd
roe # time-weighted return since inception (non-annualized)
}
}
}
}Earnings on a Specific Vault
# Position: shares + assets
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"
# Performance: net earnings + return on capital
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position/performance" \
-H "accept: application/json"# Position: shares + assets
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position" \
-H "accept: application/json"
# Performance: net earnings + return on capital
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/users/0xabcdefabcdefabcdefabcdefabcdefabcdefabcd/position/performance" \
-H "accept: application/json"/position returns shares and assets; /position/performance returns net_earnings_assets (≈ pnl) and return_on_capital (≈ roe — time-weighted since inception, non-annualized). USD-denominated values are GraphQL-only.
query {
vaultV2PositionByAddress(
userAddress: "USERADDRESS"
vaultAddress: "MORPHOVAULTV2ADDRESS"
chainId: 1
) {
vault {
name
address
}
assets
assetsUsd
shares
pnl
pnlUsd
roe # time-weighted return since inception (non-annualized)
}
}query {
vaultPositions(where: {
userAddress_in: ["USERADDRESS"]
vaultAddress_in: ["MORPHOVAULTV1ADDRESS"]
chainId_in: [1]
}) {
items {
vault {
name
address
}
state {
assets
assetsUsd
shares
pnl
pnlUsd
roe # time-weighted return since inception (non-annualized)
}
}
}
}Historical Data
APY Historical State
All Vaults
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/apy/history?lookback=thirty_days" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB/apy/history?lookback=thirty_days" \
-H "accept: application/json"REST exposes trailing history via fixed lookback windows (one_day, seven_days, thirty_days, ninety_days, one_year, inception) and is per-vault; enumeration is GraphQL-only.
query VaultV2Apys($options: TimeseriesOptions) {
vaultV2s(first: 10, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
name
historicalState {
avgApy(options: $options, lookbackHours: 24) {
x
y
}
avgNetApy(options: $options, lookbackHours: 24) {
x
y
}
}
}
}
}query VaultApys($options: TimeseriesOptions) {
vaults(first: 10, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
name
historicalState {
apy(options: $options) {
x
y
}
netApy(options: $options) {
x
y
}
}
}
}
}Specific Vault
curl -sS "https://api.morpho.org/v0/vaults-v2/1:0x04422053aDDbc9bB2759b248B574e3FCA76Bc145/apy/history?lookback=thirty_days" \
-H "accept: application/json"curl -sS "https://api.morpho.org/v0/vaults-v1/1:0x73e65DBD630f90604062f6E02fAb9138e713edD9/apy/history?lookback=thirty_days" \
-H "accept: application/json"REST exposes trailing history via fixed lookback windows (one_day, seven_days, thirty_days, ninety_days, one_year, inception) rather than an arbitrary startTimestamp/endTimestamp/interval.
query VaultV2Apys($options: TimeseriesOptions) {
vaultV2ByAddress(
address: "0x04422053aDDbc9bB2759b248B574e3FCA76Bc145"
chainId: 1
) {
address
name
historicalState {
avgApy(options: $options, lookbackHours: 24) {
x
y
}
avgNetApy(options: $options, lookbackHours: 24) {
x
y
}
}
}
}query VaultApys($options: TimeseriesOptions) {
vaultByAddress(address: "0x73e65DBD630f90604062f6E02fAb9138e713edD9") {
address
name
historicalState {
apy(options: $options) {
x
y
}
netApy(options: $options) {
x
y
}
}
}
}Query Variables:
{
"options": {
"startTimestamp": 1768211594,
"endTimestamp": 1768384394,
"interval": "DAY"
}
}Historical Allocation (Morpho Vaults V1)
curl -sS "https://api.morpho.org/v0/vaults-v1/1:0x73e65DBD630f90604062f6E02fAb9138e713edD9/allocations/history?lookback=thirty_days" \
-H "accept: application/json"REST returns per-market allocation history for a single vault via fixed lookback windows; append &market_id=<id> to filter to one market. Listing allocations across all vaults and USD-denominated series are GraphQL-only.
query Vaults($options: TimeseriesOptions) {
vaults (first: 10, skip: 0, orderBy: TotalAssetsUsd, orderDirection: Desc) {
items {
address
name
historicalState {
allocation {
market {
marketId
}
supplyAssets(options: $options) {
x
y
}
supplyAssetsUsd(options: $options) {
x
y
}
}
}
}
}
}query VaultApys($options: TimeseriesOptions) {
vaultByAddress(address: "0x73e65DBD630f90604062f6E02fAb9138e713edD9") {
address
historicalState {
allocation {
market {
marketId
}
supplyAssets(options: $options) {
x
y
}
supplyAssetsUsd(options: $options) {
x
y
}
}
}
}
}Query Variables:
{
"options": {
"startTimestamp": 1768211594,
"endTimestamp": 1768384394,
"interval": "DAY"
}
}