Docs

User V2 vault position performance

Realized + unrealized earnings of a user's Morpho Vault V2 position. Uses the average_cost accounting method: per-user share-price differentials are accumulated against the running share balance, with transfers netted into the same balance so that earnings reflect the user's economic exposure rather than their on-chain transaction count. return_on_capital is the time-weighted ratio of net earnings to capital deployed over the holding period (non-annualised).

Vault selector example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11 (format: <chain_id>:<vault_address>; replace with the target vault).

Path Parameters

user-address*string

Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.

Formataddress
vault-selector*string

Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.

Format<chain_id>:<vault_address>

Response Body

application/json

const baseUrl = process.env.CORE_REST_BASE_URL ?? "https://api.morpho.org";const apiKey = process.env.MORPHO_API_KEY ?? "<MORPHO_API_KEY>";const vaultSelector = "1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11";const userAddress = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";const url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position/performance`);const response = await fetch(url, {  headers: {    accept: "application/json",    "x-api-key": apiKey,  },});if (!response.ok) throw new Error(await response.text());const body = await response.json();
{
  "data": {
    "user_address": "0xABcdEFABcdEFabcdEfAbCdefabcdeFABcDEFabCD",
    "chain_id": 1,
    "vault_address": "0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11",
    "last_indexed_block": "25475349",
    "accounting_method": "average_cost",
    "net_earnings_assets": "0",
    "return_on_capital": null
  }
}