User V2 vault position activity
Events that changed a user's share balance in a Morpho Vault V2, newest first, one row per event log.
Signs: deposit and shares_transfer_in add shares, withdraw and shares_transfer_out remove them. Folding the whole feed with those signs returns the shares of the position endpoint at the same last_indexed_block; a partial window does not reconcile, and neither does the feed of a fee recipient, whose balance also grows through fee mints this endpoint does not emit.
assets is never derived: it is present on deposit and withdraw, and absent on share transfers, whose ERC-20 log carries no asset amount.
Bundled transactions are reconciled: a share transfer to or from a bundler adapter that carries a bundled deposit or withdrawal is reported as that deposit or withdrawal.
A self-transfer is omitted, since it changes no balance. Rows are therefore capped, not filled, by limit: keep paginating until cursor is null.
Cursors are bound to the selector and to the type filter of the request that produced them; replaying one with different filters returns 400.
Vault selector example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11 (format: <chain_id>:<vault_address>; replace with the target vault).
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.
Path Parameters
Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.
addressSelector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.
<chain_id>:<vault_address>Query Parameters
Maximum number of event logs to read.
1001 <= value <= 1000Opaque cursor returned by a previous page.
Restrict the feed to the given event types.
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/activity`);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();{
"params": {
"chain_id": 1,
"vault_address": "0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11",
"user_address": "0x0000000000000000000000000000000000000001"
},
"data": [
{
"type": "shares_transfer_out",
"data": {
"shares": "250000000000000000000",
"to_address": "0x3F32bC09d41eE699844F8296e806417D6bf61Bba"
},
"block_number": "19840000",
"tx_hash": "0x4e3a9b0ff1c2d52d7e8c5e1d3b9a8f7e6c5b4a39281706f5e4d3c2b1a09f8e7d",
"log_index": 12,
"timestamp": 1715270400
},
{
"type": "withdraw",
"data": {
"shares": "300000000000000000000",
"assets": "302631578"
},
"block_number": "19800500",
"tx_hash": "0x1f2e3d4c5b6a798807162534435261708f9e0d1c2b3a49586776859403f2e1d0",
"log_index": 4,
"timestamp": 1714796400
},
{
"type": "shares_transfer_in",
"data": {
"shares": "500000000000000000000",
"from_address": "0x8Ba1f109551bD432803012645Ac136ddd64DBA72"
},
"block_number": "19750200",
"tx_hash": "0xa1b2c3d4e5f60718293a4b5c6d7e8f900112233445566778899aabbccddeeff0",
"log_index": 88,
"timestamp": 1714192800
},
{
"type": "deposit",
"data": {
"shares": "1000000000000000000000",
"assets": "1000000000"
},
"block_number": "19700100",
"tx_hash": "0x99887766554433221100ffeeddccbbaa99887766554433221100ffeeddccbbaa",
"log_index": 30,
"timestamp": 1713591600
}
],
"cursor": null,
"last_indexed_block": "19847234"
}